#include <stdio.h>
#include <stdlib.h>
#define ElemType int
typedef struct Link{
//定义链表中节点的结构
ElemType data;
//数据域
struct Link* next;
//指针域
}Link;
Link* InitLink(Link* L);
//初始化函数声明
void Display(Link* L);
//打印函数声明
Link* InsertData(Link* L,int data,int i);
//插入节点函数声明
Link* DeleteData(Link* L,int i);
//删除节点函数声明
int FindData(Link* L,int data);
//查找数据函数声明
Link* ModifyData(Link* L,int data,int newData);
//修改数据函数声明
void DestroyLink(Link* L);
//销毁链表函数声明
int main(){
Link* L = NULL;
L = InitLink(L);
//初始化一个链表L
Display(L);
int Q_data,Q_location,new_data;
printf("请输入插入元素的数据域值:");
scanf("%d",&Q_data);
printf("请输入插入元素的位置:");
scanf("%d",&Q_location);
L = InsertData(L,Q_data,Q_location);
Display(L);
printf("请输入删除元素的位置:");
scanf("%d",&Q_location);
L = DeleteData(L,Q_location);
Display(L);
printf("请输入要查找的元素值:");
scanf("%d",&Q_data);
Q_location = FindData(L,Q_data);
if(Q_location==-1)
printf("元素未查找到\n");
else
printf("元素的位置为%d\n",Q_location);
printf("请输入被修改的元素值:");
scanf("%d",&Q_data);
printf("请输入新的元素值:");
scanf("%d",&new_data);
L = ModifyData(L,Q_data,new_data);
Display(L);
DestroyLink(L);
//Display(L);
return 0;
}
Link* InitLink(Link* L){
L= (Link *)malloc(sizeof(Link));
//创建头结点
if(L==NULL){
printf("初始化链表失败\n");
exit(0);
}
L->next = NULL;
//头节点指针域置为空
Link* temp = L;
//创建一个指针总是指向链表最后一个节点
//用于尾插法建立链表
int length,q_data;
printf("请输入链表长度:");
scanf("%d",&length);
for(int i = 0; i<length; i++){
Link *q = (Link *)malloc(sizeof(Link));
//新建一个节点
printf("请输入第%d个节点的数据域值:",i+1);
scanf("%d",&q_data);
q->data = q_data;
//为新节点的数据域赋值
q->next = NULL;
//将新节点的指针域置空
temp->next = q;
//每创建一个结点,都令其直接前驱结点的指针指向它
temp = q;
//temp指向下一个结点,为下次添加结点做准备
}
return L;
}
void Display(Link* L){
//将链表每一个节点的数据域值打印出来
printf("链表为:\n");
Link* temp = L;
//新建一个指针指向头节点
while(temp->next){
//如果指针temp指向的节点有后继节点
temp = temp->next;
//将指针temp指向该节点的后继节点
printf("%d\t",temp->data);
}
printf("\n");
}
Link* InsertData(Link* L,int data,int i){
Link* temp = L;
//创建一个指针指向头节点,用于遍历链表
for(int j = 1;j<i;j++){
//遍历到要插入位置的上一个结点
if(temp == NULL){
printf("插入位置无效\n");
return L;
}
temp = temp->next;
}
Link* q = (Link *)malloc(sizeof(Link));
//创建插入结点q
q->data = data;
q->next = temp->next;
//将新结点的 next 指针指向插入位置后的结点
temp->next = q;
//将插入位置前结点的 next 指针指向插入结点
return L;
}
Link* DeleteData(Link* L,int i){
Link* temp = L;
//创建一个指针指向头节点
for(int j = 1;j<i;j++){
//遍历到目标元素的直接前驱结点
if(temp == NULL){
printf("删除位置非法\n");
return L;
}
temp = temp->next;
}
Link* q = temp->next;
temp->next = q->next;
//将目标元素的直接前驱结点的next指向目标元素的下一节点
free(q);
//释放目标节点
return L;
}
int FindData(Link* L,int data){
int i = 0;
//创建变量记录目标元素的位置
Link* temp = L;
//创建一个指针指向头节点,用于遍历
while(temp->next){
//循环遍历整个链表
temp = temp->next;
//指针temp指向下一节点
i++;
if(temp->data == data)
//依次将查找元素与链表中的元素作比较
return i;
//如果一致,返回节点位置
}
return -1;
}
Link* ModifyData(Link* L,int data,int new_data){
Link* temp = L;
//创建一个指针指向头节点,用于遍历
while(temp->next){
temp = temp->next;
//指针指向下一节点
if(temp->data == data){
//如果该节点元素值与被修改元素的值一致
temp->data = new_data;
//将该节点的值更新
return L;
}
}
printf("被修改元素不存在,链表未被修改\n");
return L;
}
void DestroyLink(Link* L){
Link* temp = NULL;
//创建一个指针
while(L->next){
//只要链表L非空,循环
temp = L->next;
//指针temp指向头节点后的节点
L->next = temp->next;
//将头节点的指针域指向修改为其后继节点的后继节点
free(temp);
//释放掉temp指针指向的节点空间
}
free(L);
//释放掉头节点
printf("链表已被销毁\n");
}