当前位置:   article > 正文

C语言数据结构-单链表的基本操作(超详细)_c语言数据结构单链表的基本操作

c语言数据结构单链表的基本操作

目录:

1.单链表的分类;

2.单链表的操作;

3.代码详解;

4.完整代码展示;

一:单链表的分类

总体上来说,单链表可以分为两大类,一种是带头结点的,另一种是不带头结点的(由于带头结点的链表实用性更强,所以以下讲解和代码均为带头结点的链表);如果分细来讲,链表的插入可以分为两种:头插法和尾插法。

二:单链表的操作

1.单链表的初始化;

2.单链表的头插法;

3.单链表的尾插法;

4.删除元素;

5.遍历链表;

三:代码详解

1.首先应该列出需要用的头文件:

  1. #include<stdio.h>
  2. #include<stdlib.h> //可以用#include<malloc.h>代替

因为需要分配动态存储空间,所以要用到stdlib函数;

2.定义结构体;

  1. typedef struct Node
  2. {
  3. int data;
  4. struct Node *next;
  5. }node;

 data为数据域,next为指针域。

3.初始化链表:

  1. node *listcreat()
  2. {
  3. node *list=(node *)malloc(sizeof(node));
  4. list->data=0; //头结点的数据域存储的是该链表中的结点的个数
  5. list->next=NULL;
  6. return list;
  7. }

建立一个返回值为node类型的指针函数,定义一个node类型的list指针并分配内存空间,

list的数据域为该链表的结点数,使头结点的next指向空,并返回该头结点的地址。

4头插法增加一个结点:

  1. void addlist(node *list,int data)
  2. {
  3. node *p=(node *)malloc(sizeof(node));
  4. p->data=data;
  5. p->next=list->next;
  6. list->next=p;
  7. list->data++;
  8. }

建立一个新的结点p,使p的next指向原来list的next指向的位置,并使list的next指向p,list的data加一。

5.尾插法增加一个结点:

  1. void tailadd(node *list,int data)
  2. {
  3. node *p=list->next;
  4. while(p->next!=NULL)
  5. {
  6. p=p->next;
  7. }
  8. node *q=(node *)malloc(sizeof(node));
  9. q->data=data;
  10. q->next=p->next;
  11. p->next=q;
  12. list->data++;
  13. }

先使p指向该链表的最后一个结点,增加一个结点,使p的next指向新的结点,list的data加一。

6.删除一个结点:

  1. void deletee(node *list,int n)
  2. {
  3. int flag=1;
  4. node *p=list,*q;
  5. while(p->next!=NULL)
  6. {
  7. q=p;
  8. p=p->next;
  9. if(n==p->data)
  10. {
  11. q->next=p->next;
  12. free(p);
  13. list->data--;
  14. flag=0;
  15. break;
  16. }
  17. }
  18. if(flag)
  19. printf("未找到该数据,请重新输入.\n");
  20. }

这一步的难点为while循环中的q指针和p指针的纠缠,总之,q一直指向p的上一个结点,这样就好理解了。

7.遍历链表:

  1. void print(node *list)
  2. {
  3. node *p=list;
  4. while(p!=NULL)
  5. {
  6. printf("%d->",p->data);
  7. p=p->next;
  8. }
  9. printf("NULL");
  10. }

遍历链表就是输出链表中的所有结点的数据,只需使p指向list然后while循环让p指向链表的下一个节点就OK了。注:输出的第一个数是list->data,也就是链表结点的个数。

8.main函数:

  1. int main()
  2. {
  3. node *list=listcreat();
  4. addlist(list,3);
  5. addlist(list,2);
  6. addlist(list,1);
  7. tailadd(list,4);
  8. tailadd(list,5);
  9. tailadd(list,6);
  10. deletee(list,4);
  11. print(list);
  12. return 0;
  13. }

main函数中对所有函数功能都检查一遍,确保没有错误。

四:完整代码展示:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct Node
  4. {
  5. int data;
  6. struct Node *next;
  7. }node;
  8. node *listcreat()
  9. {
  10. node *list=(node *)malloc(sizeof(node));
  11. list->data=0; //头结点的数据域存储的是该链表中的结点的个数
  12. list->next=NULL;
  13. return list;
  14. }
  15. void addlist(node *list,int data)
  16. {
  17. node *p=(node *)malloc(sizeof(node));
  18. p->data=data;
  19. p->next=list->next;
  20. list->next=p;
  21. list->data++;
  22. }
  23. void tailadd(node *list,int data)
  24. {
  25. node *p=list->next;
  26. while(p->next!=NULL)
  27. {
  28. p=p->next;
  29. }
  30. node *q=(node *)malloc(sizeof(node));
  31. q->data=data;
  32. q->next=p->next;
  33. p->next=q;
  34. list->data++;
  35. }
  36. void deletee(node *list,int n)
  37. {
  38. int flag=1;
  39. node *p=list,*q;
  40. while(p->next!=NULL)
  41. {
  42. q=p;
  43. p=p->next;
  44. if(n==p->data)
  45. {
  46. q->next=p->next;
  47. free(p);
  48. list->data--;
  49. flag=0;
  50. break;
  51. }
  52. }
  53. if(flag)
  54. printf("未找到该数据,请重新输入.\n");
  55. }
  56. void print(node *list)
  57. {
  58. node *p=list;
  59. while(p!=NULL)
  60. {
  61. printf("%d->",p->data);
  62. p=p->next;
  63. }
  64. printf("NULL");
  65. }
  66. int main()
  67. {
  68. node *list=listcreat();
  69. addlist(list,3);
  70. addlist(list,2);
  71. addlist(list,1);
  72. tailadd(list,4);
  73. tailadd(list,5);
  74. tailadd(list,6);
  75. deletee(list,4);
  76. print(list);
  77. return 0;
  78. }

*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!

有帮助的话还请点个免费的赞和关注,后面还有数据结构其他部分的讲解,谢谢大家。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/636562
推荐阅读
相关标签
  

闽ICP备14008679号