单链表(线性链表)

来源:互联网 发布:法国红酒推荐 知乎 编辑:程序博客网 时间:2024/06/06 03:43

单链表的建立是最基础的数据结构(需要了解链表的基本存储原理)


单链表的建立与遍历(题目来源:http://acm.fjzs.edu.cn/Problem/show/id/9006.htm点击打开链接)


参考代码:

#include <iostream>using namespace std;typedef struct Node{int x;Node *next;}List;    //每个结点都分为两个区域,一部分存放数据,另一部分存储下一结点信息List* Get_list(int n){int m;List *head=NULL,*p=NULL,*q=NULL;head=(List*)malloc(sizeof(List));//开辟存储空间p=head;  //找到头指针while(n--){scanf("%d",&m);q=(List *)malloc(sizeof(List));p->next=q;q->x=m;p=q; //后移指针}p->next=NULL;//最后一个结点的指针为空return head;}void Myprint(List *head){List *p=NULL;p=head->next;int f=0;while(p!=NULL){if(f==0)printf("%d",p->x);elseprintf(" %d",p->x);p=p->next;   //后移指针f++;}printf("\n");}int main(){int n;List *head=NULL;//定义头结点 初始为空;while(~scanf("%d",&n)){    head=Get_list(n);//找到头结点Myprint(head);//代入头结点 输出单链表}return 0;}

下面还有段单链表复制的代码,加强理解:


List  Copy  


 题目链接:http://acm.fjzs.edu.cn/Problem/show/id/9021.htm 点击打开链接


(注意这道题并没有声明结点数据类型,所以要用double.....)

List* Mycopy(List *head)  //传入原链表的头结点{if(head==NULL)return NULL;  //判空List *copyhead=NULL,*p=NULL,*copyp=NULL,*copyq=NULL;    copyhead=(List*)malloc(sizeof(List));  //开辟新的链表头结点空间;copyp=copyhead;p=head->next;     while(p!=NULL){copyq=(List *)malloc(sizeof(List));copyp->next=copyq;copyq->x=p->x;   //此题x为double型copyp=copyq;p=p->next;}copyp->next=NULL;   //最后一个结点的next为空;return copyhead;     //返回新的链表头结点;}


下面是链表的插入操作的练习:


题目链接:http://acm.fjzs.edu.cn/Problem/show/id/9033.htm点击打开链接


参考代码:

Lst* insert(Lst *head,int n,int m)//传入已建好的链表、插入的结点位置、插入值;{Lst *q=NULL,*p=NULL;p=(Lst *)malloc(sizeof(Lst));p=head->next;int f=1;while(f!=n)   //找到插入位置;{f++;p=p->next;}q=(Lst*)malloc(sizeof(Lst));q->x=m;        //插入值存进新结点;q->next=p->next;   //新结点的下一个结点先指向插入点后面的那个结点p->next=q;         // p指针走向新结点,完成链接;return head;}

链表的删除操作:


题目链接:


http://acm.fjzs.edu.cn/Problem/show/id/2074.htm点击打开链接


参考代码:


Lst *del_lst(Lst *head,double w)//w为要删除的值{Lst *delhead=NULL,*q=NULL,*p=NULL;p=head;    // 找到头结点q=head->next;   //设另一个指针q指向p的下一个结点,由q来找删除点;while(q!=NULL)  {if(q->x==w)  //当q找到删除点的时候{p->next=q->next;   //p指针直接与q指针的下一结点相连,即绕过删除点;delete q;   //这步是优化,释放q结点空间;q=p->next;   //q再次指向p结点的下一结点}else        //当找不到删除点的时候,p、q结点都一直往下走;{p=p->next;    q=q->next;}}return head;  //返回头结点,这时的链表已经完成删除操作;}


单链表的顺序排序(插入排序法)


题目链接:


http://acm.fjzs.edu.cn/Problem/show/id/9030.htm点击打开链接


参考代码:


Lst *Sort_lst(Lst *head)   //单链表的插入顺序排序(即从小到大){Lst *p1=NULL,*p2=NULL,*p3=NULL;   for(p1=head,p2=head->next;p2!=NULL;)  //p1代表主链表,p2一直指向p1的后面一个节点{p3=head;   //p3是搜索插入结点位置的指针for(;p3!=p2;p3=p3->next)    //p3的搜索范围是p2的前面的结点{if(p3->next->x>p2->x) //如果p3下个结点的数据大于p2的数据,即找到不是从小到大排序的点{p1->next=p2->next;   //先将p1与p2的下一结点相连p2->next=p3->next;    //p2的下一结点与p3的下一结点相连p3->next=p2;    //p3的下一结点与p2相连 ;  //这三步是完成两个数的位置交换,自己在纸上走一遍就会懂;p2=p1->next;  //p2继续指向p1的下一结点;break;}}if(p3==p2)  //当p3走到p2时,p2、p1直接向下走{p1=p1->next;p2=p2->next;}}return head;}



原创粉丝点击