当前位置:   article > 正文

2.23数据结构

2.23数据结构

 单向循环链表

创建单向循环链表,创建节点  ,头插,按位置插入,输出,尾删,按位置删除功能

  1. //main.c
  2. #include "loop_list.h"
  3. int main()
  4. {
  5. loop_p H=create_head();
  6. insert_head(H,12);
  7. insert_head(H,6);
  8. insert_head(H,90);
  9. insert_head(H,123);
  10. out_put_loop(H);
  11. insert_pos(H,100,3);
  12. out_put_loop(H);
  13. del_tail(H);
  14. out_put_loop(H);
  15. del_pos(H,2);
  16. out_put_loop(H);
  17. return 0;
  18. }
  1. //loop_list.c
  2. #include "loop_list.h"
  3. //创建单向循环链表
  4. loop_p create_head()
  5. {
  6. loop_p L =(loop_p)malloc(sizeof(loop_list));
  7. if(L==NULL)
  8. {
  9. printf("空间申请失败\n");
  10. return NULL;
  11. }
  12. L->len=0;
  13. L->next=L;
  14. return L;
  15. }
  16. //创建结点
  17. loop_p create_node(datatype data)
  18. {
  19. loop_p new=(loop_p)malloc(sizeof(loop_list));
  20. if(new==NULL)
  21. {
  22. printf("空间申请失败\n");
  23. return NULL;
  24. }
  25. new->data=data;
  26. return new;
  27. }
  28. //判空
  29. int loop_empty(loop_p H)
  30. {
  31. if(H==NULL)
  32. {
  33. printf("入参为空,请检查\n");
  34. return -1;
  35. }
  36. return H->next==H?1:0;
  37. }
  38. //头插
  39. void insert_head(loop_p H,datatype data)
  40. {
  41. if(H==NULL)
  42. {
  43. printf("入参为空,请检查\n");
  44. return;
  45. }
  46. loop_p new = create_node(data);
  47. new->next = H->next;
  48. H->next = new;
  49. H->len++;
  50. }
  51. //按位置插入
  52. void insert_pos(loop_p H,datatype data,int pos)
  53. {
  54. if(H==NULL)
  55. {
  56. printf("入参为空,请检查\n");
  57. return;
  58. }
  59. if(pos>H->len+1||pos<1)
  60. {
  61. printf("位置不合理\n");
  62. return;
  63. }
  64. loop_p p = H;
  65. for(int i=0;i<pos-1;i++)
  66. {
  67. p=p->next;
  68. }
  69. loop_p new =create_node(data);
  70. new->next=p->next;
  71. p->next=new;
  72. H->len++;
  73. }
  74. //输出
  75. void out_put_loop(loop_p H)
  76. {
  77. if(H==NULL)
  78. {
  79. printf("入参为空,请检查\n");
  80. return;
  81. }
  82. //定义一个新的结点循环整条链表
  83. loop_p p = H->next; //H不属于链表中的元素
  84. //最后一个结点进入循环
  85. while (p != H)
  86. {
  87. printf("%d->", p->data);
  88. p = p->next;
  89. }
  90. printf("%s","HEAD");
  91. putchar(10);
  92. }
  93. //尾删
  94. void del_tail(loop_p H)
  95. {
  96. if(H==NULL)
  97. {
  98. printf("入参为空,请检查\n");
  99. return;
  100. }
  101. if(loop_empty(H))
  102. {
  103. printf("链表为空,无需删除\n");
  104. return;
  105. }
  106. loop_p p = H;
  107. for(int i=0;i<p->len-1;i++)
  108. {
  109. p = p->next;
  110. }
  111. loop_p del = p->next;
  112. p->next=p->next->next;
  113. free(del);
  114. H->len--;
  115. }
  116. //按位置删除
  117. void del_pos(loop_p H,int pos)
  118. {
  119. if(H==NULL)
  120. {
  121. printf("入参为空,请检查\n");
  122. return;
  123. }
  124. if(loop_empty(H))
  125. {
  126. printf("链表为空,无需删除\n");
  127. return;
  128. }
  129. if(pos>H->len||pos<1)
  130. {
  131. printf("位置不合理\n");
  132. return;
  133. }
  134. loop_p p = H;
  135. for(int i=0;i<pos-1;i++,p=p->next);
  136. loop_p del = p->next;
  137. p->next = p->next->next;
  138. free(del);
  139. H->len--;
  140. }
  1. //loop_list.h
  2. #ifndef __LOOP_LIST_H__
  3. #define __LOOP_LIST_H__
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. typedef int datatype;
  7. typedef struct loop_list
  8. {
  9. union
  10. {
  11. int len;
  12. datatype data;
  13. };
  14. struct loop_list *next;
  15. }loop_list,*loop_p;
  16. //创建单向循环链表
  17. loop_p create_head();
  18. //创建结点
  19. loop_p create_node(datatype data);
  20. //判空
  21. int loop_empty(loop_p H);
  22. //头插
  23. void insert_head(loop_p H,datatype data);
  24. //按位置插入
  25. void insert_pos(loop_p H,datatype data,int pos);
  26. //输出
  27. void out_put_loop(loop_p H);
  28. //尾删
  29. void del_tail(loop_p H);
  30. //按位置删除
  31. void del_pos(loop_p H,int pos);
  32. #endif

链表逆置函数

  1. //单链表的逆置
  2. void overturn_link(link_p H)
  3. {
  4. if(H==NULL)
  5. {
  6. printf("入参为空,请检查\n");
  7. return;
  8. }
  9. if(link_empty(H))
  10. {
  11. printf("链表为空\n");
  12. return;
  13. }
  14. if(H->next->next==NULL)
  15. {
  16. printf("表中只有一个元素,无需翻转\n");
  17. return;
  18. }
  19. link_p p = H->next->next;
  20. H->next->next = NULL;
  21. link_p q = p->next;
  22. while(p!=NULL)
  23. {
  24. p->next = H->next;
  25. H->next = p;
  26. p = q;
  27. if(q!=NULL)
  28. {
  29. q = q->next;
  30. }
  31. }
  32. }
  1. //单链表的逆置
  2. void overturn_link(link_p H)
  3. {
  4. link_p p = H->next;
  5. link_p q = H;
  6. H->next = NULL;
  7. while(p)
  8. {
  9. q=p;
  10. p = p->next;
  11. q->next = H->next;
  12. H->next = q;
  13. }
  14. }

思维导图

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

闽ICP备14008679号