当前位置:   article > 正文

删除元素———链表 详解版_删除非空单链表的表尾元素 分数 5 全屏浏览 作者 ds课程组 单位 临沂大学 本

删除非空单链表的表尾元素 分数 5 全屏浏览 作者 ds课程组 单位 临沂大学 本
  1. #include <stdio.h>
  2. #include <malloc.h> /用malloc函数获取空间。
  3. struct Node /*定义链表结点的类型*/
  4. {
  5. int data; /*数据域*/
  6. struct Node* next; /*指针域*/
  7. };
  8. typedef struct Node Node; /*重命名,定义类型的别名为Node,方便使用*/
  9. Node* Create(); /* 创建一个新的链表 */
  10. void Print(Node* head); /* 打印链表 */
  11. void Release(Node* head); /* 释放链表所占的内存空间 */
  12. Node* Delete(Node* head, int num);//删去
  13. int main()
  14. {
  15. Node* head; /* 定义头指针head */
  16. int num;
  17. head = Create(); /* 创建一个新的链表,返回的头指针赋值给head */
  18. Print(head); /* 链表的遍历输出每个元素的值 */
  19. printf("请输入要删除的数 :\n");
  20. scanf("%d", &num);
  21. head = Delete(head, num); //返回指针类型
  22. printf("删除%d之后的单链表:\n", num);
  23. Print(head); //传入指针
  24. Release(head); /*释放链表每个结点的存储空间*/
  25. return 0;
  26. }
  27. /* 函数功能: 创建一个单链表
  28. 函数入口参数:无
  29. 函数返回值: 链表的头指针
  30. */
  31. Node* Create()
  32. {
  33. Node* head, * tail, * p; /* head、tail分别指向链表的头结点和尾结点 */
  34. int num; //局部变量
  35. head = tail = NULL; /* 链表初始化: 空链表 */
  36. printf("请输入一批数据,以-9999结尾: \n");
  37. scanf("%d", &num);//此处是处理第一个数据外,存储在缓存区。
  38. while (num != -9999) /* 用户数据输入未结束 */
  39. {
  40. p = (Node*)malloc(sizeof(Node)); /* 申请一块节点的内存用于存放数据 */
  41. p->data = num; /* 将数据存于新结点的data成员中 */
  42. p->next = NULL; /* 新结点的指针域及时赋为空值 */
  43. if (NULL == head) /* 如果原来链表为空 */
  44. {
  45. head = p; /* 则将p赋值给head,p是刚申请的第一个结点 */
  46. }
  47. else /* 如果原来链表非空 */
  48. {
  49. tail->next = p; /* 则将新结点链入尾部成为新的最后一个结点 */
  50. }
  51. tail = p; /* 更新tail指针,让其指向新的尾结点处 */
  52. scanf("%d", &num); /* 继续读入数据 */
  53. }
  54. return head; /* 返回链表的头指针 */
  55. }
  56. /* 函数功能: 遍历单链表输出每个结点中的元素值
  57. 函数入口参数:链表的头指针
  58. 函数返回值: 无
  59. */
  60. void Print(Node* head)
  61. {
  62. Node* p; /* 定义工作指针p */
  63. p = head; /* p从头指针开始 */
  64. if (NULL == head) /* 如果链表为空输出提示信息 */
  65. {
  66. printf("链表为空!\n");
  67. }
  68. else是否会有疑问,为什么不是p.data因为不是普通变量,是指针。
  69. {
  70. printf("链表如下\n");
  71. while (p != NULL) /*用 p来控制循环,p为空指针时停止*/
  72. {
  73. printf("%d ", p->data); /*输出 p当前指向的结点的元素值*/
  74. p = p->next; /* p指向链表的下一个结点处*/
  75. }
  76. }
  77. printf("\n");
  78. }
  79. /* 函数功能: 释放单链表中所有的动态结点
  80. 函数入口参数:链表的头指针
  81. 函数返回值: 无
  82. */
  83. void Release(Node* head) /* 仍然是使用遍历的方法扫描每一个结点*/
  84. {
  85. Node* p1, * p2; /* p1用来控制循环,p2指向当前删除结点处*/
  86. p1 = head;
  87. while (p1 != NULL)
  88. {
  89. p2 = p1; /*p2指向当前删除结点处*/
  90. p1 = p1->next; /* p1指向链表下一个结点位置处*/
  91. free(p2); /* 然后通过p2释放动态空间*/
  92. }
  93. printf("链表释放内存成功!\n");
  94. }
  95. /* 函数功能: 从单链表中删除指定的元素,返回新链的头指针
  96. 函数入口参数:2个形式参数依次为链表的头指针、待删除的元素值
  97. 函数返回值: 链表的头指针
  98. */
  99. Node* Delete(Node* head, int num) /* num为待删除数据,删除节点 */
  100. {
  101. Node* p1, * p2;
  102. if (NULL == head) /* 空链表判断 */
  103. {
  104. printf("链表为空!\n");//
  105. return head; //链表本来就是空的,就不用删除了。
  106. }
  107. p1 = head; /* p1用于查找待删除结点,从head指针开始*/
  108. while (p1->next && p1->data != num) //p->next指向下一个为0或者等于要找到数时num时。循环停止
  109. /*在链表中寻找指定数据,若不相等则循环 */
  110. {//找到要断的链子在那,才能断。
  111. p2 = p1; /* 用p2记下原来p1的位置 *///保持两个指针距离相邻。
  112. p1 = p1->next; /* p1指针向后移动 */
  113. }
  114. if (p1->data == num) /*p1指向当前节点的data,找到该数据 */
  115. {
  116. if (head == p1) /* 如果删除的是第一个结点 */
  117. {
  118. head = p1->next; /* 则修改头指针 ,将头节点往后移动,因为p1->next存放的是下一个的地址,dead也是指针型的*/
  119. }
  120. else /* 如果不是第一个结点 */
  121. {
  122. p2->next = p1->next; //等价于p1的下一个节点的地址赋值给刚刚在p1屁股后面的p2,而p1本身还是指向要删除的数据域,
  123. /* 则执行此操作将p1从链中脱开*/
  124. }
  125. free(p1); /* 释放p1结点的内存空间 ,仅仅是销毁了指针指向的空间,但指针还在。*/
  126. printf("删除成功!\n");
  127. }
  128. else /*循环终止时 p1->data != num 没找到 */
  129. {
  130. printf("链表中无此数据!\n");
  131. }
  132. return head;
  133. }

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

闽ICP备14008679号