当前位置:   article > 正文

【C语言】 作业11 链表+实现函数封装

【C语言】 作业11 链表+实现函数封装

 递归实现链表数据互换,纯不会,明天再说


1、链表实现以下功能

链表,创建链表,申请节点,判空,头插,遍历输出,通过位置查找节点,任意位置插入,头删,任意位置删除,安置查找返回位置,按位置进行修改,按值进行修改,翻转链表,释放链表,链表的排序,反转链表(递归实现)

  1. //link_list.h
  2. #ifndef LINK_LIST_H
  3. #define LINK_LIST_H
  4. #include <myhead.h>
  5. typedef int datatype;
  6. typedef struct Node
  7. {
  8. union
  9. {
  10. int len;
  11. datatype data;
  12. };
  13. struct Node *next;
  14. }Node,*NodePtr;
  15. //创建链表
  16. NodePtr list_create();
  17. //申请结点封装数据的函数
  18. NodePtr apply_node(datatype e);
  19. //链表判空
  20. int list_empty(NodePtr L);
  21. //头插
  22. int list_insert_head(NodePtr L,datatype e);
  23. //链表遍历函数
  24. int list_show(NodePtr L);
  25. //通过位置查找结点
  26. NodePtr list_search_pos(NodePtr L,int pos);
  27. //任意位置插入
  28. int list_insert_pos(NodePtr L,int pos,datatype e);
  29. //链表头删
  30. int list_delete_head(NodePtr L);
  31. //链表任意位置删除
  32. int list_delete_pos(NodePtr L,int pos);
  33. //链表按值查找返回位置
  34. int list_search_retval(NodePtr L,datatype e);
  35. //链表按位置进行修改
  36. int list_updata_pos(NodePtr L,int pos,datatype e);
  37. //按值进行修改
  38. int list_updata_data(NodePtr L,datatype old_e,datatype new_e);
  39. //将链表进行翻转
  40. int list_reserve(NodePtr L);
  41. //释放链表
  42. void list_destroy(NodePtr L);
  43. //链表的排序
  44. int list_sort(NodePtr L);
  45. //链表的翻转(递归函数实现)
  46. NodePtr list_reserve1(NodePtr L);
  47. #endif

  1. //link_list.c
  2. #include "link_list.h"
  3. //创建链表
  4. NodePtr list_create()
  5. {
  6. NodePtr L = (NodePtr)malloc(sizeof(Node));
  7. if(NULL == L)
  8. {
  9. printf("链表创建失败\n");
  10. return NULL;
  11. }
  12. L->len = 0;
  13. L->next = NULL;
  14. printf("链表创建成功\n");
  15. return L;
  16. }
  17. //申请结点封装数据的函数
  18. NodePtr apply_node(datatype e)
  19. {
  20. NodePtr p = (NodePtr)malloc(sizeof(Node));
  21. if(NULL == p)
  22. {
  23. printf("创建结点失败\n");
  24. return NULL;
  25. }
  26. p->data = e;
  27. p->next = NULL;
  28. return p;
  29. }
  30. //链表判空
  31. int list_empty(NodePtr L)
  32. {
  33. return L->next == NULL;
  34. }
  35. //头插
  36. int list_insert_head(NodePtr L,datatype e)
  37. {
  38. if(NULL == L)
  39. {
  40. printf("头插失败\n");
  41. }
  42. NodePtr p = apply_node(e);
  43. p->next = L->next;
  44. L->next = p;
  45. L->len++;
  46. printf("头插成功\n");
  47. return 0;
  48. }
  49. //链表遍历函数
  50. int list_show(NodePtr L)
  51. {
  52. if(NULL == L || list_empty(L))
  53. {
  54. printf("遍历失败\n");
  55. return -1;
  56. }
  57. printf("链表中的元素是:");
  58. NodePtr q = L->next;
  59. while(q)
  60. {
  61. printf("%d->",q->data);
  62. q = q->next;
  63. }
  64. printf("NULL\n");
  65. }
  66. //通过位置查找结点
  67. NodePtr list_search_pos(NodePtr L,int pos)
  68. {
  69. if(NULL == L || list_empty(L) || pos < 0 || pos > L->len)
  70. {
  71. printf("查找失败\n");
  72. return NULL;
  73. }
  74. NodePtr q = L;
  75. for(int i = 0;i < pos;i++)
  76. {
  77. q = q->next;
  78. }
  79. return q;
  80. }
  81. //任意位置插入
  82. int list_insert_pos(NodePtr L,int pos,datatype e)
  83. {
  84. if(NULL == L || pos < 1 || pos > L->len+1)
  85. {
  86. printf("插入失败\n");
  87. return -1;
  88. }
  89. NodePtr p = apply_node(e);
  90. if(p == NULL)
  91. {
  92. return -1;
  93. }
  94. NodePtr q = list_search_pos(L,pos-1);
  95. p->next = q->next;
  96. q->next = p;
  97. L->len++;
  98. printf("插入成功\n");
  99. return 0;
  100. }
  101. //链表头删
  102. int list_delete_head(NodePtr L)
  103. {
  104. if(NULL == L || list_empty(L))
  105. {
  106. printf("头删失败\n");
  107. return -1;
  108. }
  109. NodePtr q = L->next;
  110. L->next = q->next;
  111. free(q);
  112. q = NULL;
  113. L->len--;
  114. return 0;
  115. }
  116. //链表任意位置删除
  117. int list_delete_pos(NodePtr L,int pos)
  118. {
  119. if(NULL == L || list_empty(L) || pos < 1 || pos > L->len)
  120. {
  121. printf("删除失败\n");
  122. return -1;
  123. }
  124. NodePtr q = list_search_pos(L,pos-1);
  125. NodePtr p = q->next;
  126. q->next = p->next;
  127. free(p);
  128. p = NULL;
  129. L->len--;
  130. printf("成功删除第%d个元素\n",pos);
  131. return 0;
  132. }
  133. //链表按值查找返回位置
  134. int list_search_retval(NodePtr L,datatype e)
  135. {
  136. if(NULL == L || list_empty(L))
  137. {
  138. printf("查找失败\n");
  139. return -1;
  140. }
  141. NodePtr q = L->next;
  142. for(int i = 1;i <= L->len;i++)
  143. {
  144. if(q->data == e)
  145. {
  146. return i;
  147. }
  148. q = q->next;
  149. }
  150. printf("没有找到该元素\n");
  151. return -1;
  152. }
  153. //链表按位置进行修改
  154. int list_updata_pos(NodePtr L,int pos,datatype e)
  155. {
  156. if(NULL == L || list_empty(L) || pos < 1 || pos > L->len)
  157. {
  158. printf("修改失败\n");
  159. return -1;
  160. }
  161. NodePtr q = list_search_pos(L,pos);
  162. q->data = e;
  163. printf("按位置修改成功\n");
  164. return 0;
  165. }
  166. //按值进行修改
  167. int list_updata_data(NodePtr L,datatype old_e,datatype new_e)
  168. {
  169. if(NULL == L || list_empty(L))
  170. {
  171. printf("修改失败\n");
  172. return -1;
  173. }
  174. NodePtr q = L->next;
  175. while(q)
  176. {
  177. if(q->data == old_e)
  178. {
  179. q->data = new_e;
  180. return 0;
  181. }
  182. q = q->next;
  183. }
  184. printf("没有该元素\n");
  185. return -1;
  186. }
  187. //将链表进行翻转
  188. int list_reserve(NodePtr L)
  189. {
  190. if(NULL == L || list_empty(L) || L->len == 1)
  191. {
  192. printf("翻转失败\n");
  193. return 0;
  194. }
  195. NodePtr H = L->next;
  196. L->next = NULL;
  197. while(H)
  198. {
  199. NodePtr q = H;
  200. H = H->next;
  201. q->next = L->next;
  202. L->next = q;
  203. }
  204. printf("翻转成功\n");
  205. return 0;
  206. }
  207. //释放链表
  208. void list_destroy(NodePtr L)
  209. {
  210. if(NULL == L)
  211. {
  212. return ;
  213. }
  214. while(!list_empty(L))
  215. {
  216. list_delete_head(L);
  217. }
  218. free(L);
  219. L = NULL;
  220. printf("释放链表成功\n");
  221. }
  222. //链表的排序
  223. int list_sort(NodePtr L)
  224. {
  225. if(NULL == L || list_empty(L) || L->len ==1)
  226. {
  227. printf("排序失败\n");
  228. return -1;
  229. }
  230. for (int i = 1; i < L->len; i++)
  231. {
  232. NodePtr p = L->next;
  233. for (int j = 0; j < L->len - i; j++) {
  234. if (p->data > p->next->data)
  235. {
  236. int temp = p->data;
  237. p->data = p->next->data;
  238. p->next->data = temp;
  239. }
  240. p = p->next;
  241. }
  242. }
  243. printf("排序成功\n");
  244. return 0;
  245. }
  246. //链表的翻转(递归函数实现)
  247. NodePtr list_reserve1(NodePtr L)
  248. {
  249. if(NULL == L || L->len == 1)
  250. {
  251. printf("翻转失败\n");
  252. return L;
  253. }
  254. NodePtr q = list_reserve1(L->next);
  255. L->next->next = L;
  256. L->next = NULL;
  257. return q;
  258. }
  1. //main.c
  2. #include "link_list.h"
  3. int main(int argc, const char *argv[])
  4. {
  5. NodePtr L = list_create();
  6. int retem = list_empty(L);
  7. list_insert_head(L,520);
  8. list_insert_head(L,1314);
  9. list_insert_head(L,123);
  10. list_insert_head(L,456);
  11. list_insert_head(L,789);
  12. list_show(L);
  13. list_insert_pos(L,2,200);
  14. list_show(L);
  15. list_delete_head(L);
  16. list_show(L);
  17. list_delete_pos(L,3);
  18. list_show(L);
  19. int retval = list_search_retval(L,200);
  20. if(retval != -1)
  21. {
  22. printf("该元素在第%d个位置\n",retval);
  23. }
  24. retval = list_search_retval(L,232);
  25. list_updata_pos(L,3,520);
  26. list_show(L);
  27. list_updata_data(L,456,997);
  28. list_show(L);
  29. list_reserve(L);
  30. list_show(L);
  31. list_sort(L);
  32. list_show(L);
  33. NodePtr retPtr = list_reserve1(L);
  34. list_show(retPtr);
  35. list_destroy(L);
  36. L = NULL;
  37. list_show(L);
  38. return 0;
  39. }

输出结果如下:

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

闽ICP备14008679号