详解链表的创建,插入,删除,遍历

电玩女神 2022-05-28 07:10 327阅读 0赞

开始前废话几句,前几天做C语言笔记时,写到链表这块,懒得写链表的基本操作了,只浏览了一下概念,拖了好几天,今天打算把它完成,期间遇到了一个困惑,在这里再一次对马博老师表示感谢!

  1. //为了方便理解,链表的节点的结构体写简单点:
  2. typedef struct DATE
  3. {
  4. int num;
  5. struct DATE *next;
  6. }date;//用date代替typedef struct DATE

一·链表的创建:

1.头插法:新节点每次都插在头节点后面
先上图,懒得用工具画了,自己手画的,凑合着看:

这里写图片描述

  1. date * create()//头插法创建单链表
  2. {
  3. date *phead, *pnew;//phead头节点,pnew新申请的节点
  4. int x;
  5. phead=(date*)malloc(sizeof(date));//申请头节点
  6. phead->next=NULL;
  7. scanf("%d",&x);
  8. while(x!=0)
  9. {
  10. pnew=(date*)malloc(sizeof(date));//申请新节点
  11. pnew->num=x;
  12. scanf("%d",&x);
  13. pnew->next=phead->next ;//①
  14. phead->next=pnew;//②
  15. }
  16. //free(pnew);
  17. return phead;
  18. }

2.尾插法:新节点每次接在最后
这里写图片描述

  1. date * create()//尾插法创建单链表
  2. {
  3. date *phead, *pnew,*pend;//phead指向头节点,pnew指向新申请的节点,pend指向尾节点
  4. int x;
  5. phead=(date*)malloc(sizeof(date));//申请头节点
  6. phead->next=NULL;
  7. pend=phead;
  8. scanf("%d",&x);
  9. while(x!=0)
  10. {
  11. pnew=(date*)malloc(sizeof(date));//申请新节点
  12. pnew->num=x;
  13. pnew->next=NULL;//①
  14. pend->next=pnew;//②
  15. pend=pnew; //③
  16. scanf("%d",&x);
  17. }
  18. //free(pnew);
  19. return phead;
  20. }

二·链表的插入:

1.插入为第一个节点:

  1. void insert( date *phead)//将节点插入为头节点
  2. {
  3. date *p=phead, *pnew;//phead头节点,pnew新申请的节点
  4. pnew=(date*)malloc(sizeof(date));//申请节点
  5. scanf("%d",&pnew->num);
  6. pnew->next=p->next ;
  7. p->next=pnew;
  8. }

2.节点插入在某节点(num为xx的)后面

  1. void insert( date *phead,int num)//将节点插入在某节点(num为xx的)后面
  2. {
  3. date *p=phead->next, *pnew;//phead头节点,pnew新申请的节点
  4. pnew=(date*)malloc(sizeof(date));//申请节点
  5. scanf("%d",&pnew->num);
  6. while(p!=NULL&&p->num!=num)
  7. {
  8. p=p->next ;
  9. }
  10. pnew->next=p->next ;
  11. p->next=pnew;
  12. }

3.将节点插入在链表最后面

  1. void insert( date *phead)//将节点插入在链表最后面
  2. {
  3. date *p=phead->next, *pnew;//phead头节点,pnew新申请的节点
  4. pnew=(date*)malloc(sizeof(date));//申请节点
  5. scanf("%d",&pnew->num);
  6. while(p->next!=NULL)
  7. {
  8. p=p->next ;
  9. }
  10. pnew->next=p->next;
  11. p->next=pnew;
  12. }

四·链表的删除:

1.链表的删除
这里写图片描述

  1. void Delete(date *phead,int num) // num为要删除的节点的num
  2. {
  3. date *p=phead->next;//p指向要删除节点的前一个节点
  4. q=(date*)malloc(sizeof(date));//申请头节点
  5. while(p!=NULL&&p->next->num!=num)
  6. {
  7. p=p->next ;
  8. }
  9. p->next=p->next->next ;//①
  10. }

五·链表的遍历:

1.链表的遍历

  1. void print(date* phead)//遍历单链表
  2. {
  3. date *p;
  4. p=phead->next ;
  5. while(p!=NULL)
  6. {
  7. printf("%d ",p->num);
  8. p=p->next;
  9. }
  10. printf("\n");
  11. }

六·附完整代码:

以下代码上机测试正确,

  1. /**************************************************************** 作者:贺远 功能:链表的基本操作 时间:2018.3.30 ****************************************************************/
  2. #include<stdio.h>
  3. #include <stdlib.h>
  4. typedef struct DATE
  5. {
  6. int num;
  7. struct DATE *next;
  8. }date;
  9. /*date * create()//头插法创建单链表 { date *phead, *pnew;//phead头节点,pnew新申请的节点 int x; phead=(date*)malloc(sizeof(date));//申请头节点 phead->next=NULL; scanf("%d",&x); while(x!=0) { pnew=(date*)malloc(sizeof(date));//申请新节点 pnew->num=x; scanf("%d",&x); pnew->next=phead->next ; phead->next=pnew; } //free(pnew); return phead; } */
  10. date * create()//尾插法创建单链表
  11. {
  12. date *phead, *pnew,*pend;//phead指向头节点,pnew指向新申请的节点,pend指向尾节点
  13. int x;
  14. phead=(date*)malloc(sizeof(date));//申请头节点
  15. phead->next=NULL;
  16. pend=phead;
  17. scanf("%d",&x);
  18. while(x!=0)
  19. {
  20. pnew=(date*)malloc(sizeof(date));//申请新节点
  21. pnew->num=x;
  22. pnew->next=NULL;
  23. pend->next=pnew;
  24. pend=pnew;
  25. scanf("%d",&x);
  26. }
  27. //free(pnew);此处不要能free
  28. //print(phead);
  29. return phead;
  30. /* date * create()//尾插法创建单链表 { date *phead=NULL, *pnew,*pend;//phead指向头节点,pnew指向新申请的节点,pend指向尾节点 int x; pnew=(date*)malloc(sizeof(date));//申请头节点 phead=(date*)malloc(sizeof(date));//申请头节点 pend=phead; scanf("%d",&x); while(x!=0) { pnew->num=x; pnew->next=NULL; pend->next=pnew; pend=pnew; pnew=(date*)malloc(sizeof(date));//申请新节点 scanf("%d",&x); } free(pnew);//此处可以free return phead; } */
  31. }
  32. /*void insert( date *phead)//将节点插入为头节点 { date *p=phead, *pnew;//phead头节点,pnew新申请的节点 pnew=(date*)malloc(sizeof(date));//申请节点 scanf("%d",&pnew->num); pnew->next=p->next ; p->next=pnew; } */
  33. /*void insert( date *phead,int num)//将节点插入在某节点(num为xx的)后面 { date *p=phead->next, *pnew;//phead头节点,pnew新申请的节点 pnew=(date*)malloc(sizeof(date));//申请节点 scanf("%d",&pnew->num); while(p!=NULL&&p->num!=num) { p=p->next ; } pnew->next=p->next ; p->next=pnew; }*/
  34. void insert( date *phead)//将节点插入在链表最后面
  35. {
  36. date *p=phead->next, *pnew;//phead头节点,pnew新申请的节点
  37. pnew=(date*)malloc(sizeof(date));//申请节点
  38. scanf("%d",&pnew->num);
  39. while(p->next!=NULL)
  40. {
  41. p=p->next ;
  42. }
  43. pnew->next=p->next;
  44. p->next=pnew;
  45. }
  46. void print(date* phead)//遍历单链表
  47. {
  48. date *p;
  49. p=phead->next ;
  50. while(p!=NULL)
  51. {
  52. printf("%d ",p->num);
  53. p=p->next;
  54. }
  55. printf("\n");
  56. }
  57. void Delete(date *phead,int num) // num为要删除的节点的num
  58. {
  59. date *p=phead->next;//p指向要删除节点的前一个节点
  60. q=(date*)malloc(sizeof(date));//申请头节点
  61. while(p!=NULL&&p->next->num!=num)
  62. {
  63. p=p->next ;
  64. }
  65. p->next=p->next->next ;
  66. }
  67. int main(void)
  68. {
  69. date *phead;
  70. phead=create();//创建单链表
  71. print(phead);//遍历单链表
  72. insert(phead);
  73. print(phead);//遍历单链表
  74. Delete(phead,7);
  75. print(phead);//遍历单链表
  76. }

发表评论

表情:
评论列表 (有 0 条评论,327人围观)

还没有评论,来说两句吧...

相关阅读

    相关 创建

    编写一个能进行链表的创建与遍历的小程序。 相关知识 链表是一种动态数据结构,它的特点是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放数据元素。 链表中每

    相关 单向创建

    由指针到结构体再到链表,学习过程循序渐进。 创建一个先进先出的链表需要3个指针变量,而创建一个后进先出的指针链表只需要2个指针即可,C语言实现如下。 一、先进先出链表的创建