#include<stdio.h>#include<stdlib.h>#include<stdbool.h>//链表结构 struct LinkNode{ int value; struct LinkNode *next;};void RemoveMethod(struct LinkNode *header);void InsertMethod(struct LinkNode *header);bool InspectListValue(struct LinkNode *header, int val);void Clear_LinkList(struct LinkNode *header);void Destroy_LinkList(struct LinkNode *header);void Foreach_LinkList(struct LinkNode *header);void RemoveByValue_LinkList(struct LinkNode *header , int delvalue);void InsertByValue_LinkList(struct LinkNode *header,int oldval , int newval);struct LinkNode *Init_LinkList();int main(){ struct LinkNode *header = Init_LinkList(); //遍历链表,显示链表的全部元素 Foreach_LinkList(header); //增加功能 InsertMethod(header); //删除功能 RemoveMethod(header); //将链表的全部元素设置为0 printf("输入1清空链表,输入0销毁链表\n"); int x=-1; scanf("%d",&x); printf("\n"); switch(x){ //销毁链表 case 0:Destroy_LinkList(header); break; //清空链表 case 1:Clear_LinkList(header); break; default:break; } printf("\n测试结束\n"); printf("-----------------------------------------\n"); }//初始化链表struct LinkNode *Init_LinkList(){ //创建头结点 struct LinkNode *header = (struct LinkNode*)malloc(sizeof(struct LinkNode)); //初始化头结点 header->value=0; header->next=NULL; //创建尾部指针,先指向头结点 //这样不改变header的位置,用PRear来进行操作 struct LinkNode *pRear = header; int val = -1; while(true){ printf("初始化数据中,输入-1结束初始化\n:"); scanf("%d",&val); if(val == -1){ //如果输入的是-1则退出 break; } //申请空间,newNode就是尾结点了 struct LinkNode *newNode = (struct LinkNode*)malloc(sizeof(struct LinkNode)); newNode->value = val; newNode->next = NULL; //新结点插入链表 pRear->next = newNode; //更新尾部指针指向 pRear = newNode; } //程序有一个bug第一个元素默认为0,在初始化的时候将第一个元素删除就可以了 //RemoveByValue_LinkList(header , 0); //测试失败...... printf("初始化结束\n"); printf("-----------------------------------------\n"); //返回结点的头 return header;}//在oldval的后面添加新的元素newval实现增加的功能 void InsertByValue_LinkList(struct LinkNode *header,int oldval , int newval){ //首先通过oldval找到位置 struct LinkNode *temp = header; while(temp->value != oldval){ temp = temp->next; } //现在temp的结点就是old数据 struct LinkNode *afterNode = temp; afterNode = temp->next; afterNode = temp->next; //创建一个结点然后插入 struct LinkNode *newNode = (struct LinkNode*)malloc(sizeof(struct LinkNode)); newNode->value = newval; newNode->next = afterNode; temp->next=newNode;} //删除值为val的结点 实现删除的功能 void RemoveByValue_LinkList(struct LinkNode *header , int delvalue){ //首先找到delcalue的上一个位置 struct LinkNode *temp = header; while(temp->next->value != delvalue){ temp = temp->next; } //现在 得到了要删除元素的位置temp struct LinkNode *pRear = temp; pRear=pRear->next; pRear=pRear->next; temp->next=pRear;} //遍历链表void Foreach_LinkList(struct LinkNode *header){ struct LinkNode *temp = header; //遍历数组时不显示第一个元素就可以解决这个问题了 temp=temp->next; printf("结果为:"); //最后的一个元素无法显示 ,交换了程序的顺序测试成功。 printf("["); do{ printf("%d",temp->value); if(temp->next == NULL)break; printf(","); temp = temp->next; }while(true); printf("]");} //销毁链表void Destroy_LinkList(struct LinkNode *header){ free(header); printf("链表已经销毁成功"); }//清空链表void Clear_LinkList(struct LinkNode *header){ //让链表的值设置为0; struct LinkNode *temp = header; temp=temp->next; printf("清空链表成功:"); printf("["); do{ temp->value=0; printf("%d",temp->value); if(temp->next == NULL)break; printf(","); temp = temp->next; }while(true); printf("]");} bool InspectListValue(struct LinkNode *header, int val){ //负责检查链表中是否存在val struct LinkNode *temp = header; temp=temp->next; do{ //如果链表中存在val返回true; if(temp->value==val)return true; if(temp->next == NULL)return false; temp = temp->next; }while(true);}void InsertMethod(struct LinkNode *header){ int i=0; int oldval=0; int newval=0; //将对插入的操作保存到方法里面 printf("\n请选择要插入元素的值\n"); scanf("%d",&oldval); while(true){ while(!InspectListValue(header,oldval)){ printf("链表中没有此元素请重新输入: "); scanf("%d",&oldval); } printf("插入的值\n:"); scanf("%d",&newval); InsertByValue_LinkList(header,oldval,newval); Foreach_LinkList(header); printf("\n是否退出测试?\n请继续输入,当输入为-1时程序结束\n"); scanf("%d",&oldval); if(oldval==-1)break; } printf("\n增加功能测试结束\n"); printf("-----------------------------------------\n"); }void RemoveMethod(struct LinkNode *header){ Foreach_LinkList(header); int delval=0; int i=0; printf("\n请输入要删除的值\n"); scanf("%d",&delval); while(true){ //调用删除函数 while(!InspectListValue(header,delval)){ printf("链表中没有此元素请重新输入: "); scanf("%d",&delval); } RemoveByValue_LinkList(header , delval); Foreach_LinkList(header); printf("\n是否退出测试?\n请继续输入,当输入为-1时程序结束\n"); scanf("%d",&delval); if(delval == -1)break; } printf("删除功能测试结束\n"); printf("-----------------------------------------\n");}