当前位置:   article > 正文

作业/数据结构/2024/7/8

作业/数据结构/2024/7/8

链表的相关操作作业:

1】 按值修改

2】按值查找,返回当前节点的地址 (先不考虑重复,如果有重复,返回第一个)

3】 逆置(反转)

4】释放链表

main.c

  1. #include "head.h"
  2. int main(int argc, const char *argv[])
  3. {
  4. //创建链表,头结点
  5. linklist_ptr p=create();
  6. //判断链表是否为空
  7. empty(p);
  8. //头插
  9. insert_head(p,10);
  10. insert_head(p,11);
  11. insert_head(p,12);
  12. //输出
  13. output(p);
  14. //尾插
  15. insert_tail(p,1);
  16. insert_tail(p,2);
  17. insert_tail(p,3);
  18. output(p);
  19. //任意位置插入
  20. insert_index(p,2,99);
  21. output(p);
  22. //头删
  23. del_head(p);
  24. output(p);
  25. //尾删除
  26. del_tail(p);
  27. output(p);
  28. //任意位置删除
  29. del_index(p,2);
  30. output(p);
  31. //按照所给位数修改值
  32. change_element(p,1,99);
  33. output(p);
  34. //按照所给的值查找
  35. find_element(p,1);
  36. output(p);
  37. //反转
  38. reversal(p);
  39. output(p);
  40. return 0;
  41. }

head.h

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //定义节点数据的类型
  4. typedef int datatype;
  5. //定义链表结构体
  6. typedef struct node
  7. {
  8. union
  9. {
  10. //表示节点的个数
  11. int len;
  12. //节点的数据
  13. datatype data;
  14. };
  15. //指针域
  16. struct node *next;
  17. }linklist,*linklist_ptr;
  18. //1.链表的创建
  19. linklist_ptr create();
  20. //2.判断链表是否为空
  21. int empty(linklist_ptr p);
  22. //3.申请节点封装数据
  23. linklist_ptr node_create(datatype e);
  24. //4.头插
  25. int insert_head(linklist_ptr p,datatype e);
  26. //5.输出
  27. void output(linklist_ptr p);
  28. //6.尾插
  29. int insert_tail(linklist_ptr p,datatype e);
  30. //7.任意位置插入
  31. int insert_index(linklist_ptr p,int index,datatype e);
  32. //8.头删
  33. int del_head(linklist_ptr p);
  34. //9.尾删除
  35. int del_tail(linklist_ptr p);
  36. //10.任意位置删除
  37. int del_index(linklist_ptr p,int index);
  38. //11.按照所给的值修改
  39. int change_element(linklist_ptr p,int index,datatype e);
  40. //12.按照所给的值查找
  41. linklist_ptr find_element(linklist_ptr p,datatype e);
  42. //13.反转
  43. int reversal(linklist_ptr p);
  44. #endif

fun.c

  1. {
  2. q=q->next;
  3. }
  4. q->next=p1;
  5. p->len++;
  6. return 1;
  7. }
  8. //7.任意位置插入
  9. int insert_index(linklist_ptr p,int index,datatype e)
  10. {
  11. if(NULL==p || index<1 || index>p->len+1)
  12. {
  13. printf("尾插失败\n");
  14. return -1;
  15. }
  16. //申请节点
  17. linklist_ptr p1=node_create(e);
  18. linklist_ptr q=p;
  19. for(int i=0;i<index;i++)
  20. {
  21. q=q->next;
  22. }
  23. p1->next=q->next;
  24. q->next=p1;
  25. p->len++;
  26. return 1;
  27. }
  28. //8.头删
  29. int del_head(linklist_ptr p)
  30. {
  31. if(NULL==p || empty(p))
  32. {
  33. printf("头删失败\n");
  34. }
  35. //定义一个指针指向头指针指向的节点
  36. linklist_ptr p1=p->next;
  37. p->next=p1->next;
  38. free(p1);
  39. p1=NULL;
  40. p->len--;
  41. return 1;
  42. }
  43. //9.尾删除
  44. int del_tail(linklist_ptr p)
  45. {
  46. if(NULL==p || empty(p))
  47. {
  48. printf("尾删失败\n");
  49. return 0;
  50. }
  51. //定义一个指针指向头结点并让其循环到最后一个节点的前一个节点
  52. linklist_ptr p1=p;
  53. for(int i=0;i<p->len-1;i++)
  54. {
  55. p1=p1->next;
  56. }
  57. //指向需要删除最后一个节点
  58. linklist_ptr p2=p1->next;
  59. p1->next=p1->next;
  60. //释放
  61. free(p2);
  62. p2=NULL;
  63. p->len--;
  64. return 1;
  65. }
  66. //10.任意位置删除
  67. int del_index(linklist_ptr p,int index)
  68. {
  69. if(NULL==p || empty(p) || index>p->len ||index<0)
  70. {
  71. printf("任意位置删除失败\n");
  72. return 0;
  73. }
  74. //定义一个指针指向头结点用于循环到所需要
  75. //的位置的上一个节点
  76. linklist_ptr p1=p;
  77. for(int i=0;i<index-1;i++)
  78. {
  79. p1=p1->next;
  80. }
  81. //定义一个指针指向需要被删除的节点
  82. linklist_ptr p2=p1->next;
  83. p1->next=p2->next;
  84. //释放
  85. free(p2);
  86. p2=NULL;
  87. p->len--;
  88. return 1;
  89. }
  90. //11.按照所给的值修改
  91. int change_element(linklist_ptr p,int index,datatype e)
  92. {
  93. if(NULL==p || empty(p) || index>p->len || index<0)
  94. {
  95. printf("任意位置修改失败\n");
  96. return 0;
  97. }
  98. //定义一个指针找到所需要的修改的节点
  99. linklist_ptr p1=p;
  100. for(int i=0;i<index;i++)
  101. {
  102. p1=p1->next;
  103. }
  104. //修改其中的值
  105. p1->data=e;
  106. }
  107. //12.按照所给的值查找
  108. linklist_ptr find_element(linklist_ptr p,datatype e)
  109. {
  110. if(NULL==p || empty(p))
  111. {
  112. printf("查找值失败\n");
  113. return NULL;
  114. }
  115. //记录相同的次数
  116. int flag=0;
  117. //循环查找
  118. linklist_ptr p1=p;
  119. for(int i=0;i<p->len;i++)
  120. {
  121. p1=p1->next;
  122. if(p1->data==e)
  123. {
  124. printf("第%d个元素的值相等\n",i+1);
  125. flag++;
  126. }
  127. if(flag==1)
  128. {
  129. return p1;
  130. }
  131. }
  132. if(flag==0)
  133. {
  134. printf("未查找到相应的值\n");
  135. }
  136. return p;
  137. }
  138. //13.反转
  139. int reversal(linklist_ptr p)
  140. {
  141. if(NULL == p || empty(p))
  142. {
  143. printf("反转失败\n");
  144. return 0;
  145. }
  146. linklist_ptr p1 = p->next; // 保存第1个节点的地址
  147. p->next = NULL; // 断开原头结点的连接(使其成为反转后的链表的尾节点)
  148. linklist_ptr p2;
  149. while(p1->next!=NULL)
  150. {
  151. p2 = p1; // 将当前节点保存到p2,以便将其插入到头部
  152. p1 = p1->next; // 移动到下一个节点
  153. p2->next = p->next; // 将p2插入到p之前(使p2成为新的头结点)
  154. p->next = p2; // 更新p为新插入的节点(更新头结点)
  155. }
  156. return 1; // 返回反转后链表的新头结点
  157. }

 

 

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

闽ICP备14008679号