当前位置:   article > 正文

C语言:链表删除

C语言:链表删除

链表删除分为头删除和中间删除(包含尾删除)。

同时注意单向链表原则:先连后断。

具体方法如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct node
  4. {
  5. int s;
  6. struct node* pnext;
  7. }list;
  8. list* addnode(list** pphead, list** ppend, int n)
  9. {
  10. list* ptemp = malloc(sizeof(list));
  11. ptemp->s = n;
  12. ptemp->pnext = NULL;
  13. if (NULL == *pphead)
  14. {
  15. *pphead = ptemp;
  16. *ppend = ptemp;
  17. }
  18. else
  19. {
  20. (*ppend)->pnext = ptemp;
  21. *ppend = ptemp;
  22. }
  23. }
  24. void deletenode(list** pphead, list** ppend, int val)
  25. {
  26. list* pdel = NULL;
  27. //头删除
  28. //删除标记指向头节点
  29. //头指针指向头结点的下一个
  30. //释放
  31. if ((*pphead)->s == val)
  32. {
  33. pdel = *pphead;
  34. *pphead = (*pphead)->pnext;
  35. free(pdel);
  36. pdel = NULL;
  37. return;
  38. }
  39. list* pmark = *pphead;
  40. //中间删除
  41. //遍历链表
  42. //找到删除节点的前一个结点
  43. //删除标记指向遍历标记的下一个
  44. //遍历标记的下一个指向遍历标记的下一个的下一个
  45. //释放
  46. while (pmark->pnext != NULL)
  47. {
  48. if (pmark->pnext->s == val)
  49. {
  50. pdel = pmark->pnext;
  51. pmark->pnext = pmark->pnext->pnext;
  52. free(pdel);
  53. pdel = NULL;
  54. if (pmark->pnext == NULL)//判断是否是尾删除
  55. {
  56. *ppend = pmark;
  57. }
  58. return;
  59. }
  60. pmark = pmark->pnext;
  61. }
  62. }
  63. int main()
  64. {
  65. list* phead = NULL;
  66. list* pend = NULL;
  67. //添加几个节点
  68. addnode(&phead, &pend, 1);
  69. addnode(&phead, &pend, 2);
  70. addnode(&phead, &pend, 3);
  71. addnode(&phead, &pend, 4);
  72. //删除
  73. deletenode(&phead, &pend, 4);
  74. //遍历链表,检查是否成功删除
  75. while (phead != NULL)
  76. {
  77. printf("%d\n", phead->s);
  78. phead = phead->pnext;
  79. }
  80. return 0;
  81. }

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

闽ICP备14008679号