[转]C语言之单向链表的创建插入删除等功能

 

数据结构学习笔记之链表(C语言版)

分类: 技术交流   183人阅读  评论(0)  收藏  举报

       链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表

由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元

素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。

       使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(datafields)和一或两个用来指向上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据指针链接)。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。


下面附上一段由C语言实现的一个完整的单链表,包括创建,插入,删除,查询,排序,输出,获取链表长度,求有序链表交集,求有序链表差集,合并两条链表(两种方法)等功能:

[html]  view plain copy
  1. #include<stdio.h>  
  2. #include<malloc.h>  
  3.   
  4. typedef struct Node{  
  5.     int data;  
  6.     struct Node* next;  
  7. }Node;  
  8.   
  9. Node* AddNum();                                  /*创建链表*/  
  10. void Insert(Node* head,int i,int a);             /*插入节点*/  
  11. void DeleteList(Node* head,int i);               /*删除节点*/  
  12. void SerachList(Node* head,int a);               /*查询数据*/  
  13. void SortList(Node* head);                       /*链表排序*/  
  14. Node* MergeList_old(Node* Ha,Node* Hb);          /*利用旧节点合并两条链表*/  
  15. Node* MergeList_New(Node* Ha,Node* Hb);          /*创建新节点合并两条链表*/  
  16. int GetListLength(Node* head);                   /*获取链表长度*/  
  17. Node* GetTheSame(Node* head1,Node* head2);       /*求有序链表交集*/  
  18. Node* GetTheDiffirent(Node* head1,Node* head2);  /*求有序链表链表差集*/  
  19. void PrintNum(Node* head);                       /*输出链表*/  
  20.   
  21. Node* AddNum(){  
  22.     char ans='y';  
  23.     Node* head=(Node*)malloc(sizeof(Node));  
  24.     Node* pc=(Node*)malloc(sizeof(Node));  
  25.     head=pc;  
  26.     while(ans!='n'&&ans!='N'){  
  27.         Node* temp1=(Node*)malloc(sizeof(Node));  
  28.         pc->next=temp1;  
  29.         pc=temp1;  
  30.         printf_s("begin to add the number.");  
  31.         scanf_s("%d",&pc->data);  
  32.         printf_s("do you want to countinue.");  
  33.         fflush( stdin );  
  34.         ans=getchar();  
  35.     }  
  36.     pc->next=NULL;  
  37.     return head;  
  38. }  
  39.   
  40. void Insert(Node* head,int i,int a){  
  41.     int ai=0;  
  42.     Node* temp=(Node*)malloc(sizeof(Node));  
  43.     temp=head;  
  44.     while(temp->next&&ai!=i-1){  
  45.         temp=temp->next;  
  46.         ai++;  
  47.     }  
  48.     if(ai!=i-1){  
  49.         printf_s("要插入的序号有误!!!");  
  50.     }  
  51.     else{  
  52.         Node* pc=(Node*)malloc(sizeof(Node));  
  53.         pc->data=a;  
  54.         pc->next=temp->next;  
  55.         temp->next=pc;  
  56.     }  
  57. }  
  58.   
  59. void DeleteList(Node* head,int i){  
  60.     int ai=0;  
  61.     int a;  
  62.     Node* pc=(Node*)malloc(sizeof(Node));  
  63.     Node* qc=(Node*)malloc(sizeof(Node));  
  64.     pc=head;  
  65.     while(pc->next&&ai!=i-1){  
  66.         pc=pc->next;  
  67.         ai++;  
  68.     }  
  69.     if(ai!=i-1||!pc->next)  
  70.         printf_s("错误的序号!!!");  
  71.     else if(ai=i-1&&!pc->next)  
  72.         printf_s("错误的序号!!!");  
  73.     else{  
  74.         qc=pc->next;  
  75.         if(!qc->next){  
  76.             a=qc->data;  
  77.             free(qc);  
  78.             printf_s("you delete the %d\n",a);  
  79.         }  
  80.         else{  
  81.             pc->next=qc->next;  
  82.             a=qc->data;  
  83.             free(qc);  
  84.             printf_s("you delete the %d\n",a);  
  85.         }  
  86.     }  
  87. }  
  88.   
  89. void SerachList(Node* head1,int a){  
  90.     int i=0;  
  91.     Node* temp=(Node*)malloc(sizeof(Node));  
  92.     temp=head1;  
  93.     while(temp->next&&temp->data!=a){  
  94.         temp=temp->next;  
  95.         i++;  
  96.     }  
  97.     if(!temp->next)  
  98.         printf_s("没有此数据!!!");  
  99.     else  
  100.         printf_s("在序号为%d的位置.",i);  
  101. }  
  102.   
  103. void SortList(Node* head){  
  104.     Node* pa=(Node*)malloc(sizeof(Node));  
  105.     Node* pc=(Node*)malloc(sizeof(Node));  
  106.     Node* temp=(Node*)malloc(sizeof(Node));  
  107.     pa=head->next;  
  108.     while(pa){  
  109.         pc=pa->next;  
  110.         while(pc){  
  111.             if(pa->data>pc->data){  
  112.                  temp->data=pa->data;  
  113.                  pa->data=pc->data;  
  114.                  pc->data=temp->data;  
  115.             }  
  116.             pc=pc->next;  
  117.         }  
  118.         pa=pa->next;  
  119.     }  
  120. }  
  121.   
  122. Node* MergeList_old(Node* Ha,Node* Hb){  
  123.     Node* pa=(Node*)malloc(sizeof(Node));  
  124.     Node* pb=(Node*)malloc(sizeof(Node));  
  125.     Node* pc=(Node*)malloc(sizeof(Node));  
  126.     pa=Ha->next;  
  127.     pb=Hb->next;  
  128.     pc=Ha;  
  129.     while(pa&&pb){  
  130.         if(pa->data<=pb->data){  
  131.             pc->next=pa;  
  132.             pc=pa;  
  133.             pa=pa->next;  
  134.         }else{  
  135.             pc->next=pb;  
  136.             pc=pb;  
  137.             pb=pb->next;  
  138.         }  
  139.     }  
  140.     pc->next=pa?pa:pb;  
  141.     free(Hb);  
  142.     return Ha;  
  143. }  
  144.   
  145. Node* MergeList_New(Node* Ha,Node* Hb){  
  146.     Node* pa=(Node*)malloc(sizeof(Node));  
  147.     Node* pb=(Node*)malloc(sizeof(Node));  
  148.     Node* pc=(Node*)malloc(sizeof(Node));  
  149.     Node* head=(Node*)malloc(sizeof(Node));  
  150.     pa=Ha->next;  
  151.     pb=Hb->next;  
  152.     head=pc;  
  153.     while(pa||pb){  
  154.         Node* tp=(Node*)malloc(sizeof(Node));  
  155.         pc->next=tp;  
  156.         pc=tp;  
  157.         if(!pa){  
  158.             pc->data=pb->data;  
  159.             pb=pb->next;  
  160.         }  
  161.         else if(!pb){  
  162.             pc->data=pa->data;  
  163.             pa=pa->next;  
  164.         }  
  165.         else if(pa->data==pb->data){  
  166.             pc->data=pa->data;  
  167.             pa=pa->next;  
  168.             pb=pb->next;  
  169.         }  
  170.         else if(pa->data<pb->data){  
  171.             pc->data=pa->data;  
  172.             pa=pa->next;  
  173.         }  
  174.         else{  
  175.             pc->data=pb->data;  
  176.             pb=pb->next;  
  177.         }  
  178.     }  
  179.     pc->next=NULL;  
  180.     return head;  
  181. }  
  182.   
  183. int GetListLength(Node* head){  
  184.     int i=0;  
  185.     Node* temp=(Node*)malloc(sizeof(Node));  
  186.     temp=head;  
  187.     while(temp->next){  
  188.         i++;  
  189.         temp=temp->next;  
  190.     }  
  191.     return i;  
  192. }  
  193.   
  194. Node* GetTheSame(Node* head1,Node* head2){  
  195.     Node* pa=(Node*)malloc(sizeof(Node));  
  196.     Node* pb=(Node*)malloc(sizeof(Node));  
  197.     Node* pc=(Node*)malloc(sizeof(Node));  
  198.     pa=head1->next;  
  199.     pb=head2->next;  
  200.     pc=head1;  
  201.     while(pa&&pb){  
  202.         if(pa->data==pb->data){  
  203.             pc=pa;  
  204.             pa=pa->next;  
  205.         }  
  206.         else if(pa->data<pb->data){  
  207.             pc->next=pa->next;  
  208.             free(pa);  
  209.             pa=pc->next;  
  210.         }  
  211.         else  
  212.             pb=pb->next;  
  213.     }  
  214.     pc->next=NULL;  
  215.     while(pa){  
  216.         pc=pa;  
  217.         pa=pa->next;  
  218.         free(pc);  
  219.     }  
  220.     pb=head2;  
  221.     while(pb){  
  222.         pc=pb;  
  223.         pb=pb->next;  
  224.         free(pc);  
  225.     }  
  226.     return head1;  
  227. }  
  228.   
  229. Node* GetTheDiffirent(Node* head1,Node* head2){  
  230.     Node* pa=(Node*)malloc(sizeof(Node));  
  231.     Node* pb=(Node*)malloc(sizeof(Node));  
  232.     Node* pc=(Node*)malloc(sizeof(Node));  
  233.     pa=head1->next;  
  234.     pb=head2->next;  
  235.     pc=head1;  
  236.     while(pa&&pb){  
  237.         if(pa->data==pb->data){  
  238.             pc->next=pa->next;  
  239.             free(pa);  
  240.             pa=pc->next;  
  241.         }  
  242.         else if(pa->data<pb->data){  
  243.             pc=pa;  
  244.             pa=pa->next;  
  245.         }  
  246.         else  
  247.             pb=pb->next;  
  248.     }  
  249.     pb=head2;  
  250.     while(pb){  
  251.         pc=pb;  
  252.         pb=pb->next;  
  253.         free(pc);  
  254.     }  
  255.     return head1;  
  256. }  
  257.   
  258. void PrintNum(Node* head){  
  259.     Node* temp;  
  260.     temp=head;  
  261.     while(temp->next){  
  262.         printf_s("%d",temp->next->data);  
  263.         temp=temp->next;  
  264.     }  
  265. }  
[html]  view plain copy
  1. int main()  
  2. {  
  3.     Node* head1;  
  4.     Node* head2;  
  5.     Node* head3;  
  6.     head3=NULL;  
  7.     head1=AddNum();  
  8.     SortList(head1);  
  9.     head2 = AddNum();  
  10.     SortList(head2);  
  11.     head3 = MergeList_old(head1, head2);  
  12.     PrintNum(head3);  
  13.     printf_s("\n");  
  14.     return 0;  
  15. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值