经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
吃顿外卖的时间带你解决单链表问题
来源:cnblogs  作者:小杜加油  时间:2022/1/17 11:10:22  对本文有异议

一.链表的定义

    概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链
接次序实现的,相当于一个一个的结点链接在一起就构成了链表.如下图所示.

 

   无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结
构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

二.链表的实现

1,无头+单向+非循环链表增删查改实现

其具体思路如下图所示

 

 

这样具体的思路就有了,然后是具体的程序代码

先是头文件

  1. 1 #include<stdio.h>
  2. 2 #include <stdlib.h>
  3. 3 #include<malloc.h>
  4. 4 #include<assert.h>
  5. 5
  6. 6 typedef int SLTDataType;
  7. 7
  8. 8 typedef struct SListNode
  9. 9 {
  10. 10 SLTDataType data;
  11. 11 struct SListNode* next;
  12. 12 }SLTNode;
  13. 13
  14. 14 // 单向+不带头+不循环
  15. 15 void SListPrint(SLTNode* plist); //打印链表
  16. 16 SLTNode* BuySLTNode(SLTDataType x);//创建节点
  17. 17 void SListPushBack(SLTNode** pplist, SLTDataType x); //尾插
  18. 18 void SListPushFront(SLTNode** pplist, SLTDataType x);// 头插
  19. 19
  20. 20 void SListPopBack(SLTNode** pplist); //尾删
  21. 21 void SListPopFront(SLTNode** pplist);//头删
  22. 22
  23. 23 SLTNode* SListFind(SLTNode* plist, SLTDataType x);//查找
  24. 24 void SListInsertAfter(SLTNode* pos,SLTDataType x);//pos后插入
  25. 25 void SListInsertBefore(SLTNode**pplist,SLTNode* pos,SLTDataType x);//pos前插入
  26. 26 void SListEraseAfter(SLTNode* pos);//删除指定数据

 

 函数的具体实现

 

  1. 1 #include"SList.h"
  2. 2 void SListPrint(SLTNode* plist)
  3. 3 {
  4. 4 SLTNode* cur=plist;
  5. 5 while(cur!=NULL)
  6. 6 {
  7. 7 printf("%d->",cur->data);
  8. 8 cur=cur->next;
  9. 9 }
  10. 10 printf("NULL\n");
  11. 11 }
  12. 12 SLTNode* BuySLTNode(SLTDataType x)
  13. 13 {
  14. 14 SLTNode *node=(SLTNode*)malloc(sizeof(SLTNode));
  15. 15 node->data=x;
  16. 16 node->next=NULL;
  17. 17 return node;
  18. 18 }
  19. 19 void SListPushBack(SLTNode** pplist, SLTDataType x) //尾插
  20. 20 {
  21. 21 SLTNode* newnode = BuySLTNode(x);
  22. 22 if(*pplist==NULL)
  23. 23 {
  24. 24 *pplist=newnode ;
  25. 25 }
  26. 26 else
  27. 27 {
  28. 28 SLTNode*tail=*pplist;
  29. 29 while(tail->next!=NULL)
  30. 30 {
  31. 31 tail=tail->next;
  32. 32 }
  33. 33 tail->next=newnode;
  34. 34 }
  35. 35 }
  36. 36 void SListPushFront(SLTNode** pplist, SLTDataType x) //头插
  37. 37 {
  38. 38 SLTNode* newnode = BuySLTNode(x);
  39. 39 newnode->next=*pplist;
  40. 40 *pplist=newnode;
  41. 41 }
  42. 42 void SListPopBack(SLTNode** pplist)//尾删
  43. 43 {
  44. 44 if(*pplist==NULL)
  45. 45 {
  46. 46 return ;
  47. 47 }
  48. 48 else if((*pplist)->next==NULL)
  49. 49 {
  50. 50 free(*pplist);
  51. 51 *pplist=NULL;
  52. 52 }
  53. 53 else
  54. 54 {
  55. 55 SLTNode* prev=NULL;
  56. 56 SLTNode*tail=*pplist;
  57. 57 while(tail->next!=NULL)
  58. 58 {
  59. 59 prev=tail;
  60. 60 tail=tail->next;
  61. 61 }
  62. 62 free(tail);
  63. 63 tail->next=NULL;
  64. 64 prev->next=NULL;
  65. 65 }
  66. 66 }
  67. 67 void SListPopFront(SLTNode** pplist)//头删
  68. 68 {
  69. 69 if(*pplist==NULL)
  70. 70 {
  71. 71 return ;
  72. 72 }
  73. 73 else
  74. 74 {
  75. 75 SLTNode* node = *pplist;
  76. 76 *pplist = node->next;
  77. 77 free(node);
  78. 78 }
  79. 79 }
  80. 80 SLTNode* SListFind(SLTNode* plist, SLTDataType x)// 查找节点
  81. 81 {
  82. 82 SLTNode* cur = plist;
  83. 83 while(cur)
  84. 84 {
  85. 85 if(cur->data==x)
  86. 86 {
  87. 87 return cur;
  88. 88 }
  89. 89 cur=cur->next;
  90. 90 }
  91. 91 return NULL;
  92. 92 }
  93. 93 void SListInsertAfter(SLTNode* pos,SLTDataType x) //插入节点到指定位置的后面
  94. 94 {
  95. 95 assert(pos);
  96. 96 SLTNode* newnode = BuySLTNode(x);
  97. 97 newnode->next=pos->next;
  98. 98 pos->next=newnode;
  99. 99 }
  100. 100 void SListInsertBefore(SLTNode**pplist,SLTNode* pos,SLTDataType x)
  101. 101 {
  102. 102 assert(pos);
  103. 103 SLTNode* newnode = BuySLTNode(x);
  104. 104 if(pos==*pplist)//认为是头插
  105. 105 {
  106. 106 newnode->next=pos;
  107. 107 *pplist=newnode;
  108. 108 }
  109. 109 else
  110. 110 {
  111. 111 SLTNode* prev = NULL;
  112. 112 SLTNode* cur = *pplist;
  113. 113 while(cur!=pos)
  114. 114 {
  115. 115 prev=cur;
  116. 116 cur=cur->next;
  117. 117 }
  118. 118 prev->next=newnode;
  119. 119 newnode->next=pos;
  120. 120 }
  121. 121 }
  122. 122 void SListEraseAfter(SLTNode* pos)//指定某一节点后续位置
  123. 123 {
  124. 124 assert(pos);
  125. 125 if(pos->next==NULL)
  126. 126 {
  127. 127 return ;
  128. 128 }
  129. 129 else
  130. 130 {
  131. 131 SLTNode*next=pos->next;
  132. 132 pos->next=next->next;
  133. 133 free(next);
  134. 134 }
  135. 135 }

 

主函数调用

 

  1. #include"SList.h"
  2. void Test()
  3. {
  4. SLTNode* plist=NULL;
  5. SListPushBack(&plist,2);
  6. SListPushBack(&plist,3);
  7. SListPushBack(&plist,4);
  8. SListPushBack(&plist,5);
  9. SListPushFront(&plist,6);
  10. SListPrint(plist);
  11. SListPopBack(&plist);
  12. SListPrint(plist);
  13. SListPopFront(&plist);
  14. SLTNode* pos = SListFind(plist, 3);
  15. SListInsertAfter(pos,40);
  16. SListPrint(plist);
  17. SListInsertBefore(&plist,pos,300);
  18. SListPrint(plist);
  19. SListEraseAfter(pos);
  20. SListPrint(plist);
  21. }
  22. int main()
  23. {
  24. Test();
  25. return 0;
  26. }

 

本文来自博客园,作者:ETTA-7,转载请注明原文链接:https://www.cnblogs.com/etta-7/

原文链接:http://www.cnblogs.com/etta-7/p/15791736.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号