闲话不多说,直接写代码。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//创建一个存储学生姓名、性别、年龄、班级、成绩的链表,编写好链表基本功能实现的函数,调用函数对学生信息进行管理,对信息进行增删查改等操作,并建立简易的操作提示界面
struct Student //
{
int class_;//学生的班级
char name[20];//学生的名字
char gender[10];//学生的性别
int age;//学生的年龄
int score;//学生的成绩
Student* pnext;//指向下一个节点
};
struct Linklist//结构体用来保存链表的信息
{
Student* head;//保存链表的起始位置
int length;//保存链表的长度
};
//链表的初始化
Linklist* linklist_init()
{
Linklist*temp = (Linklist*)malloc(sizeof(Linklist));//申请一个Linklist结构体空间用来保存链表的信息
temp->head = NULL;//此时链表内没有节点,为了防止该指针变成野指针,让它指向空。
temp->length = 0;//此时链表内没有节点,所以长度为0
return temp;//将指针返回
}
//节点的创建
Student* Create_node(Student student)
{
Student* temp = (Student*)malloc(sizeof(Student));//申请一个Student类型的节点空间
//将传进来的参数存入节点内
temp->class_ = student.class_;
strcpy(temp->name, student.name);
strcpy(temp->gender, student.gender);
temp->age = student.age;
temp->score = student.score;
temp->pnext = NULL;//为了防止该指针变成野指针,让它指向空。
return temp;//将指针返回
}
//从头部插入节点
void Push_head(Linklist* linklist, Student student)
{
//如果此时链表内没有节点
if (linklist->head==NULL)
{
linklist->head = Create_node(student);//将链表的头指针指向新节点
linklist->length = 1;//链表长度为1
}
else
{
Student*temp= Create_node(student);//用临时指针保存新节点的信息
temp->pnext = linklist->head;//将新节点的指针指向头节点
linklist->head = temp;//将链表的头指针指向新节点
linklist->length++;//链表长度加一
}
}
//从尾部插入节点
void Push_end(Linklist* linklist, Student student)
{
//如果此时链表内没有节点
if (linklist->head == NULL)
{
linklist->head = Create_node(student);//将链表的头指针指向新节点
linklist->length = 1;//链表长度为1
}
else
{
//如果链表内有节点
Student* temp = linklist->head;//定义一个临时指针保存头节点的信息
//找到链表的尾部
while (temp->pnext!=NULL)
{
temp = temp->pnext;//当前指针偏移
}
temp->pnext= Create_node(student);//尾部节点指向新创建的节点
linklist->length++;//链表长度加一
}
}
//删除节点
void Delete_node(Linklist* linklist, char name[])
{
//如果链表为空
if (linklist->head==NULL)
{
printf("此链表没有内容可以删除!\n");
return;//退出当前函数
}
else
{
Student* temp = linklist->head;//用临时指针保存头节点的信息
//如果头节点满足条件
while (linklist->head != NULL&&strcmp(linklist->head->name,name)==0)
{
linklist->head = linklist->head->pnext;//头指针指向头节点的下一个节点
free(temp);//释放头节点
linklist->length--;//链表长度减一
}
//如果头节点不满足要求,从第二个节点开始判断
temp = linklist->head;//用临时指针保存头节点的信息
while (linklist->head!=NULL&&temp!=NULL)
{
if (strcmp(temp->pnext->name,name)==0)
{
Student* node = temp->pnext;//定义一个临时指针保存当前节点的信息
temp->pnext = node->pnext;//将当前节点的前一个节点和当前节点的后一个节点连接起来
free(node);//释放当前节点
linklist->length--;//链表长度减一
}
temp = temp->pnext;//当前指针偏移
}
}
}
//更改满足条件的节点内容
void Change_node(Linklist*linklist,char name1[],char name2[])
{
//如果链表为空
if (linklist->head==NULL)
{
printf("此链表没有内容!\n");
return;//退出当前函数
}
Student* temp = linklist->head;//用临时指针保存头节点的信息
while (temp!=NULL)
{
if (strcmp(temp->name,name1)==0)//更改满足条件的节点内容
{
strcpy(temp->name, name2);
}
temp = temp->pnext;//当前指针偏移
}
}
//查找满足条件的内容
void Search_node(Linklist* linklist, char name[])
{
//如果链表为空
if (linklist->head == NULL)
{
printf("此链表没有内容!\n");
return;//退出当前函数
}
Student* temp = linklist->head;//用临时指针保存头节点的信息
while (temp != NULL)
{
if (strcmp(temp->name, name) == 0)//更改满足条件的节点内容
{
printf("班级:%d 姓名:%s 性别:%s 年龄:%d 成绩:%d\n", temp->class_, temp->name, temp->gender, temp->age, temp->score);
}
temp = temp->pnext;//当前指针偏移
}
}
//输出显示链表内的数据
void Out_Linklist(Linklist*linklist)
{
//如果链表为空
if (linklist->head==NULL)
{
printf("此链表没有内容!\n");
return;//退出当前函数
}
else
{
Student* temp = linklist->head;
printf("此链表的内容为:\n");
while (temp!=NULL)
{
printf("班级:%d 姓名:%s 性别:%s 年龄:%d 成绩:%d\n", temp->class_, temp->name, temp->gender, temp->age, temp->score);
temp = temp->pnext;//当前指针偏移
}
printf("此时链表内存放了%d个数据!\n", linklist->length);
}
}
//销毁链表
void Destroy_Linklist(Linklist* linklist)
{
//如果链表为空
if (linklist->head == NULL)
{
printf("此链表没有内容!\n");
return;//退出当前函数
}
else
{
Student* temp = linklist->head;
while (temp != NULL)
{
Student* node = temp;//定义一个临时指针保存当前节点的信息
temp = temp->pnext;//当前指针偏移
free(node);//释放当前节点
}
linklist->head= NULL;
linklist->length = 0;
}
}
void run(Linklist*linklist)
{
int position;
char name_o[20], name_n[20];
Student data;
printf("************************\n");
printf("输入数字 0 表示从头部插入节点\n");
printf("输入数字 1 表示从尾部插入节点\n");
printf("输入数字 2 表示删除节点\n");
printf("输入数字 3 表示更改节点数据\n");
printf("输入数字 4 表示查询节点数据\n");
printf("输入数字 5 表示销毁链表\n");
printf("************************\n");
printf("请输入一个数字:\n");
int key;
scanf("%d", &key);
switch (key)
{
case 0://插入一个头节点
printf("请输入需要插入的学生信息!\n");
scanf("%d %s %s %d %d", &data.class_, data.name, data.gender, &data.age, &data.score);
Push_head(linklist, data);
Out_Linklist(linklist);
break;
case 1://插入一个尾节点
printf("请输入需要插入的学生信息!\n");
scanf("%d %s %s %d %d", &data.class_, data.name, data.gender, &data.age, &data.score);
Push_end(linklist, data);
Out_Linklist(linklist);
break;
case 2://删除一个节点
printf("请输入需要删除的学生的名字\n");
scanf("%s", name_o);
Delete_node(linklist, name_o);
Out_Linklist(linklist);
break;
case 3://更改一个节点数据
printf("请输入需要更改的学生的名字和更改之后的名字!\n");
scanf("%s %s", name_o, name_n);
Change_node(linklist, name_o, name_n);
Out_Linklist(linklist);
break;
case 4://查询一个节点数据
printf("请输入需要查询的学生的名字!\n");
scanf("%s", name_o);
Search_node(linklist, name_o);
break;
case 5://销毁链表
Destroy_Linklist(linklist);
break;
}
}
int main()
{
Linklist* llp = linklist_init();
while (true)
{
run(llp);
}
system("pause");
return 0;
}
程序运行结果如下图