#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");
}