当前位置:   article > 正文

2024.7.19 作业

2024.7.19 作业

1.链表的排序

  1. int list_sort(NodePtr L)
  2. {
  3. if(NULL==L || L->len<=1)
  4. {
  5. printf("排序失败");
  6. return -1;
  7. }
  8. int len=L->len+1;
  9. NodePtr p;
  10. int i,j;
  11. for( i=1;i<len;i++)
  12. {
  13. for( j=0,p=L;j<len-i;j++,p=p->next)
  14. {
  15. if( p->data > p->next->data )
  16. {
  17. datatype t=p->data;
  18. p->data=p->next->data;
  19. p->next->data=t;
  20. }
  21. }
  22. }
  23. printf("排序成功\n");
  24. return 0;
  25. }

2.链表的反转(递归实现)

  1. // 递归反转链表
  2. NodePtr list_fz(NodePtr L)
  3. {
  4. // 基础情况:空链表或只有一个节点
  5. if (L == NULL || L->next == NULL)
  6. {
  7. return L;
  8. }
  9. NodePtr new_L = list_fz(L->next);
  10. L->next->next = L;
  11. L->next = NULL;
  12. return new_L;
  13. }

3.链表去重

  1. // 去重函数
  2. int list_dr(NodePtr L)
  3. {
  4. NodePtr current = L;
  5. NodePtr prev = NULL;
  6. while (current != NULL)
  7. {
  8. NodePtr runner = L;
  9. prev = NULL;
  10. int flag = 0;
  11. // 查找当前节点的重复项
  12. while (runner != current)
  13. {
  14. if (runner->data == current->data)
  15. {
  16. flag = 1;
  17. break;
  18. }
  19. prev = runner;
  20. runner = runner->next;
  21. }
  22. if (flag)
  23. {
  24. // 如果是重复节点,删除当前节点
  25. NodePtr temp = current;
  26. if (prev != NULL)
  27. {
  28. prev->next = current->next;
  29. }
  30. else
  31. {
  32. L = current->next; // 更新头节点
  33. }
  34. current = current->next;
  35. free(temp);
  36. }
  37. else
  38. {
  39. current = current->next;
  40. }
  41. }
  42. }

linklist.h

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

linklist.c

  1. #include "linklist.h"
  2. NodePtr list_create()
  3. {
  4. NodePtr L=(NodePtr)malloc(sizeof(Node));
  5. if(NULL==L)
  6. {
  7. printf("创建失败\n");
  8. return NULL;
  9. }
  10. L->len=0;
  11. L->next=NULL;
  12. printf("链表创建成功\n");
  13. return L;
  14. }
  15. //申请节点封装数据函数
  16. NodePtr apply_node(datatype e)
  17. {
  18. NodePtr p=(NodePtr)malloc(sizeof(Node));
  19. if(NULL==p)
  20. {
  21. printf("申请失败\n");
  22. return NULL;
  23. }
  24. p->data = e;
  25. p->next = NULL;
  26. return p;
  27. }
  28. //链表判空
  29. int list_empty(NodePtr L)
  30. {
  31. return L->next ==NULL;
  32. }
  33. //头插
  34. int list_insert_head(NodePtr L,datatype e)
  35. {
  36. if(NULL==L)
  37. {
  38. printf("链表不合法\n");
  39. return -1;
  40. }
  41. NodePtr p = apply_node(e);
  42. if(NULL==p)
  43. {
  44. return -1;
  45. }
  46. p->next=L->next;
  47. L->next=p;
  48. L->len++;
  49. printf("头插成功\n");
  50. return 0;
  51. }
  52. //链表遍历函数
  53. int list_show(NodePtr L)
  54. {
  55. if(NULL==L || list_empty(L))
  56. {
  57. printf("遍历失败\n");
  58. return -1;
  59. }
  60. NodePtr q = L->next;
  61. while(q!=NULL)
  62. {
  63. printf("%d\t",q->data);
  64. q=q->next;
  65. }
  66. putchar(10);
  67. }
  68. //通过位置查找节点
  69. NodePtr list_search_pos(NodePtr L,int pos)
  70. {
  71. if(NULL==L || list_empty(L) || pos<0 || pos>L->len)
  72. {
  73. printf("查找失败\n");
  74. return NULL;
  75. }
  76. NodePtr q= L;
  77. for(int i=0;i<pos;i++)
  78. {
  79. q=q->next;
  80. }
  81. return q;
  82. }
  83. //任意位置插入
  84. int list_insert_pos(NodePtr L,int pos,datatype e)
  85. {
  86. if(NULL==L || pos<=0 ||pos>L->len+1)
  87. {
  88. printf("插入失败\n");
  89. return -1;
  90. }
  91. NodePtr p = apply_node(e);
  92. if(NULL==p)
  93. {
  94. return -1;
  95. }
  96. NodePtr q =list_search_pos(L,pos-1);
  97. p->next=q->next;
  98. q->next=p;
  99. L->len++;
  100. printf("插入成功\n");
  101. return 0;
  102. }
  103. //链表头删
  104. int list_delete_head(NodePtr L)
  105. {
  106. if(NULL==L || list_empty(L))
  107. {
  108. printf("删除失败\n");
  109. return -1;
  110. }
  111. NodePtr p=L->next;
  112. L->next=p->next;
  113. free(p);
  114. p=NULL;
  115. L->len--;
  116. printf("头删成功\n");
  117. return 0;
  118. }
  119. //任意位置删除
  120. int list_delete_pos(NodePtr L,int pos)
  121. {
  122. if(NULL==L || list_empty(L) || pos<1 || pos>L->len)
  123. {
  124. printf("删除失败\n");
  125. return -1;
  126. }
  127. NodePtr q=list_search_pos(L,pos-1);
  128. NodePtr p=q->next;
  129. q->next =p->next;
  130. free(p);
  131. p=NULL;
  132. L->len--;
  133. printf("删除成功\n");
  134. return 0;
  135. }
  136. //通过值查找返回位置
  137. int list_search_value(NodePtr L,datatype e)
  138. {
  139. if(NULL==L || list_empty(L))
  140. {
  141. printf("查找失败\n");
  142. return -1;
  143. }
  144. NodePtr q=L->next;
  145. for(int index=1;index<=L->len;index++)
  146. {
  147. if(q->data==e)
  148. {
  149. return index;
  150. }
  151. q=q->next;
  152. }
  153. printf("没找到\n");
  154. return -1;
  155. }
  156. //链表按位置进行修改
  157. int list_update_pos(NodePtr L,int pos,datatype e)
  158. {
  159. if(NULL==L || list_empty(L) || pos<1 || pos>L->len )
  160. {
  161. printf("修改失败\n");
  162. return -1;
  163. }
  164. list_search_pos(L,pos)->data = e;
  165. printf("修改成功\n");
  166. return 0;
  167. }
  168. //链表按值进行修改
  169. int list_update_value(NodePtr L,datatype old_e,datatype new_e)
  170. {
  171. if(NULL==L || list_empty(L))
  172. {
  173. printf("修改失败\n");
  174. return -1;
  175. }
  176. int res = list_search_value(L,old_e);
  177. if(res == -1)
  178. {
  179. printf("没有要修改的值\n");
  180. return -1;
  181. }
  182. list_update_pos(L,res,new_e);
  183. printf("修改成功\n");
  184. return 0;
  185. }
  186. //将链表进行翻转
  187. void list_reverse(NodePtr L)
  188. {
  189. if(NULL==L || L->len<=1)
  190. {
  191. printf("翻转失败\n");
  192. return;
  193. }
  194. NodePtr H = L->next;
  195. L->next = NULL;
  196. NodePtr p = NULL;
  197. while(H!=NULL)
  198. {
  199. p=H;
  200. H=H->next;
  201. p->next =L->next;
  202. L->next =p;
  203. }
  204. printf("翻转成功\n");
  205. return;
  206. }
  207. //释放链表
  208. void list_destroy(NodePtr L)
  209. {
  210. //判断逻辑
  211. if(NULL == L)
  212. {
  213. return;
  214. }
  215. //将所有结点进行释放
  216. while(!list_empty(L))
  217. {
  218. //头删
  219. list_delete_head(L);
  220. }
  221. //释放头结点
  222. free(L);
  223. L = NULL;
  224. printf("释放成功\n");
  225. }
  226. //链表排序
  227. int list_sort(NodePtr L)
  228. {
  229. if(NULL==L || L->len<=1)
  230. {
  231. printf("排序失败");
  232. return -1;
  233. }
  234. int len=L->len+1;
  235. NodePtr p;
  236. int i,j;
  237. for( i=1;i<len;i++)
  238. {
  239. for( j=0,p=L;j<len-i;j++,p=p->next)
  240. {
  241. if( p->data > p->next->data )
  242. {
  243. datatype t=p->data;
  244. p->data=p->next->data;
  245. p->next->data=t;
  246. }
  247. }
  248. }
  249. printf("排序成功\n");
  250. return 0;
  251. }
  252. // 递归反转链表
  253. NodePtr list_fz(NodePtr L)
  254. {
  255. // 基础情况:空链表或只有一个节点
  256. if (L == NULL || L->next == NULL)
  257. {
  258. return L;
  259. }
  260. NodePtr new_L = list_fz(L->next);
  261. L->next->next = L;
  262. L->next = NULL;
  263. return new_L;
  264. }
  265. // 去重函数
  266. int list_dr(NodePtr L)
  267. {
  268. NodePtr current = L;
  269. NodePtr prev = NULL;
  270. while (current != NULL)
  271. {
  272. NodePtr runner = L;
  273. prev = NULL;
  274. int flag = 0;
  275. // 查找当前节点的重复项
  276. while (runner != current)
  277. {
  278. if (runner->data == current->data)
  279. {
  280. flag = 1;
  281. break;
  282. }
  283. prev = runner;
  284. runner = runner->next;
  285. }
  286. if (flag)
  287. {
  288. // 如果是重复节点,删除当前节点
  289. NodePtr temp = current;
  290. if (prev != NULL)
  291. {
  292. prev->next = current->next;
  293. }
  294. else
  295. {
  296. L = current->next; // 更新头节点
  297. }
  298. current = current->next;
  299. free(temp);
  300. }
  301. else
  302. {
  303. current = current->next;
  304. }
  305. }
  306. }

main.c

  1. #include"linklist.h"
  2. int main(int argc, const char *argv[])
  3. {
  4. //调用函数创建一个链表
  5. NodePtr L = list_create();
  6. if(NULL == L)
  7. {
  8. return -1;
  9. }
  10. //调用头插函数
  11. list_insert_head(L, 520);
  12. list_insert_head(L, 1314);
  13. list_insert_head(L, 666);
  14. list_insert_head(L, 999);
  15. //调用遍历函数
  16. list_show(L);
  17. //调用任意位置插入函数
  18. list_insert_pos(L, 1, 100);
  19. list_insert_pos(L, 3, 100);
  20. list_insert_pos(L, L->len+1, 100);
  21. list_show(L);
  22. printf("排序: ");
  23. list_sort(L);
  24. list_show(L);
  25. printf("去重:");
  26. list_dr(L);
  27. list_show(L);
  28. printf("反转:");
  29. L->next=list_fz(L->next);
  30. list_show(L);
  31. return 0;
  32. }

思维导图

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

闽ICP备14008679号