1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<stdbool.h>
    4. //链表结构
    5. struct LinkNode{
    6. int value;
    7. struct LinkNode *next;
    8. };
    9. void RemoveMethod(struct LinkNode *header);
    10. void InsertMethod(struct LinkNode *header);
    11. bool InspectListValue(struct LinkNode *header, int val);
    12. void Clear_LinkList(struct LinkNode *header);
    13. void Destroy_LinkList(struct LinkNode *header);
    14. void Foreach_LinkList(struct LinkNode *header);
    15. void RemoveByValue_LinkList(struct LinkNode *header , int delvalue);
    16. void InsertByValue_LinkList(struct LinkNode *header,int oldval , int newval);
    17. struct LinkNode *Init_LinkList();
    18. int main(){
    19. struct LinkNode *header = Init_LinkList();
    20. //遍历链表,显示链表的全部元素
    21. Foreach_LinkList(header);
    22. //增加功能
    23. InsertMethod(header);
    24. //删除功能
    25. RemoveMethod(header);
    26. //将链表的全部元素设置为0
    27. printf("输入1清空链表,输入0销毁链表\n");
    28. int x=-1;
    29. scanf("%d",&x);
    30. printf("\n");
    31. switch(x){
    32. //销毁链表
    33. case 0:Destroy_LinkList(header);
    34. break;
    35. //清空链表
    36. case 1:Clear_LinkList(header);
    37. break;
    38. default:break;
    39. }
    40. printf("\n测试结束\n");
    41. printf("-----------------------------------------\n");
    42. }
    43. //初始化链表
    44. struct LinkNode *Init_LinkList(){
    45. //创建头结点
    46. struct LinkNode *header = (struct LinkNode*)malloc(sizeof(struct LinkNode));
    47. //初始化头结点
    48. header->value=0;
    49. header->next=NULL;
    50. //创建尾部指针,先指向头结点
    51. //这样不改变header的位置,用PRear来进行操作
    52. struct LinkNode *pRear = header;
    53. int val = -1;
    54. while(true){
    55. printf("初始化数据中,输入-1结束初始化\n:");
    56. scanf("%d",&val);
    57. if(val == -1){
    58. //如果输入的是-1则退出
    59. break;
    60. }
    61. //申请空间,newNode就是尾结点了
    62. struct LinkNode *newNode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
    63. newNode->value = val;
    64. newNode->next = NULL;
    65. //新结点插入链表
    66. pRear->next = newNode;
    67. //更新尾部指针指向
    68. pRear = newNode;
    69. }
    70. //程序有一个bug第一个元素默认为0,在初始化的时候将第一个元素删除就可以了
    71. //RemoveByValue_LinkList(header , 0);
    72. //测试失败......
    73. printf("初始化结束\n");
    74. printf("-----------------------------------------\n");
    75. //返回结点的头
    76. return header;
    77. }
    78. //在oldval的后面添加新的元素newval实现增加的功能
    79. void InsertByValue_LinkList(struct LinkNode *header,int oldval , int newval){
    80. //首先通过oldval找到位置
    81. struct LinkNode *temp = header;
    82. while(temp->value != oldval){
    83. temp = temp->next;
    84. }
    85. //现在temp的结点就是old数据
    86. struct LinkNode *afterNode = temp;
    87. afterNode = temp->next;
    88. afterNode = temp->next;
    89. //创建一个结点然后插入
    90. struct LinkNode *newNode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
    91. newNode->value = newval;
    92. newNode->next = afterNode;
    93. temp->next=newNode;
    94. }
    95. //删除值为val的结点 实现删除的功能
    96. void RemoveByValue_LinkList(struct LinkNode *header , int delvalue){
    97. //首先找到delcalue的上一个位置
    98. struct LinkNode *temp = header;
    99. while(temp->next->value != delvalue){
    100. temp = temp->next;
    101. }
    102. //现在 得到了要删除元素的位置temp
    103. struct LinkNode *pRear = temp;
    104. pRear=pRear->next;
    105. pRear=pRear->next;
    106. temp->next=pRear;
    107. }
    108. //遍历链表
    109. void Foreach_LinkList(struct LinkNode *header){
    110. struct LinkNode *temp = header;
    111. //遍历数组时不显示第一个元素就可以解决这个问题了
    112. temp=temp->next;
    113. printf("结果为:");
    114. //最后的一个元素无法显示 ,交换了程序的顺序测试成功。
    115. printf("[");
    116. do{
    117. printf("%d",temp->value);
    118. if(temp->next == NULL)break;
    119. printf(",");
    120. temp = temp->next;
    121. }while(true);
    122. printf("]");
    123. }
    124. //销毁链表
    125. void Destroy_LinkList(struct LinkNode *header){
    126. free(header);
    127. printf("链表已经销毁成功");
    128. }
    129. //清空链表
    130. void Clear_LinkList(struct LinkNode *header){
    131. //让链表的值设置为0;
    132. struct LinkNode *temp = header;
    133. temp=temp->next;
    134. printf("清空链表成功:");
    135. printf("[");
    136. do{
    137. temp->value=0;
    138. printf("%d",temp->value);
    139. if(temp->next == NULL)break;
    140. printf(",");
    141. temp = temp->next;
    142. }while(true);
    143. printf("]");
    144. }
    145. bool InspectListValue(struct LinkNode *header, int val){
    146. //负责检查链表中是否存在val
    147. struct LinkNode *temp = header;
    148. temp=temp->next;
    149. do{
    150. //如果链表中存在val返回true;
    151. if(temp->value==val)return true;
    152. if(temp->next == NULL)return false;
    153. temp = temp->next;
    154. }while(true);
    155. }
    156. void InsertMethod(struct LinkNode *header){
    157. int i=0;
    158. int oldval=0;
    159. int newval=0;
    160. //将对插入的操作保存到方法里面
    161. printf("\n请选择要插入元素的值\n");
    162. scanf("%d",&oldval);
    163. while(true){
    164. while(!InspectListValue(header,oldval)){
    165. printf("链表中没有此元素请重新输入: ");
    166. scanf("%d",&oldval);
    167. }
    168. printf("插入的值\n:");
    169. scanf("%d",&newval);
    170. InsertByValue_LinkList(header,oldval,newval);
    171. Foreach_LinkList(header);
    172. printf("\n是否退出测试?\n请继续输入,当输入为-1时程序结束\n");
    173. scanf("%d",&oldval);
    174. if(oldval==-1)break;
    175. }
    176. printf("\n增加功能测试结束\n");
    177. printf("-----------------------------------------\n");
    178. }
    179. void RemoveMethod(struct LinkNode *header){
    180. Foreach_LinkList(header);
    181. int delval=0;
    182. int i=0;
    183. printf("\n请输入要删除的值\n");
    184. scanf("%d",&delval);
    185. while(true){
    186. //调用删除函数
    187. while(!InspectListValue(header,delval)){
    188. printf("链表中没有此元素请重新输入: ");
    189. scanf("%d",&delval);
    190. }
    191. RemoveByValue_LinkList(header , delval);
    192. Foreach_LinkList(header);
    193. printf("\n是否退出测试?\n请继续输入,当输入为-1时程序结束\n");
    194. scanf("%d",&delval);
    195. if(delval == -1)break;
    196. }
    197. printf("删除功能测试结束\n");
    198. printf("-----------------------------------------\n");
    199. }