暂时只设立了增删查改四个功能,以后可能会继续完善,下面放代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//学生结构体建立
struct Student {
char number[20];
char name[20];
int age;
float score[3];//score分别为语数英
Student* next;
};
typedef Student* linklist;
typedef Student node;
void create(linklist temp);//创建链表
void menu(linklist temp, linklist head);//菜单函数
void insert(linklist temp);//插入学生信息函数
void dele(linklist head);//删除学生信息函数
void seek(linklist head);//查找学生信息函数
void alter(linklist head);//修改学生信息函数
//主函数
int main()
{
linklist head = (linklist)malloc(sizeof(node));//创建头节点
linklist temp = (linklist)malloc(sizeof(node));//创建尾节点,随着链表增长,始终指向尾节点.
temp = head;
printf("请输入初始数据,格式为:学号 姓名 年龄 语文成绩 数学成绩 英语成绩(当输入NULL时,结束输入)\n");
create(temp);
while (1)
{
menu(temp, head);
}
return 0;
}
//菜单函数
void menu(linklist temp, linklist head)
{
int choose;
printf(" \n\n \n\n");
printf("\t******************************\n");
printf("\t*******学生信息管理系统*******\n");
printf("\t******************************\n");
printf("\t1.增加学生信息\t");
printf("2.删除学生信息\n");
printf("\t3.查询学生信息\t");
printf("4.修改学生信息\n");
scanf_s("%d", &choose);
switch (choose)
{
case 1:insert(temp); system("pause"); system("cls"); break;
case 2:dele(head); system("pause"); system("cls"); break;
case 3:seek(head); system("pause"); system("cls"); break;
case 4:alter(head); system("pause"); system("cls"); break;
}
}
//创建链表,传入的temp此时指向尾节点
void create(linklist temp)
{
while (1)
{
linklist p = (linklist)malloc(sizeof(node));
scanf("%s", p->number);
if (!strcmp(p->number, "NULL"))
{
break;
}
scanf("%s %d %f %f %f", p->name, &p->age, &(p->score[0]), &(p->score[1]), &(p->score[2]));
temp->next = p;
temp = p;
}
temp->next = NULL;
}
//增加学生信息函数,传入的temp指向尾节点
void insert(linklist temp)
{
linklist p = (linklist)malloc(sizeof(node));//新建节点,用于插入
scanf("%s %s %d %f %f %f", p->number, p->name, &p->age, &p->score[0], &p->score[1], &p->score[2]);//输入新节点的信息
temp->next = p;
temp = p;
temp->next = NULL;
}
//删除函数,传入的head为头节点
void dele(linklist head)
{
linklist p = (linklist)malloc(sizeof(node));//用于遍历的指针
linklist above = (linklist)malloc(sizeof(node));//始终处于p上一节点的指针
p = head->next;
above = head;
char number1[20];
printf("\n请输入要删除学生的学号:");
scanf("%s", number1);
while (p != NULL)
{
if (!strcmp(p->number, number1))
{
above->next = p->next;
break;
}
else {
p = p->next;
above = above->next;
}
}
printf("无此学生的信息!");
}
//查找函数,传入的head为头节点
void seek(linklist head)
{
char number1[20];
linklist p = (linklist)malloc(sizeof(node));//用于遍历的指针
p = head->next;
printf("\n请输入该学生的学号:");
scanf("%s", number1);
while (p != NULL)
{
if (!strcmp(p->number, number1))
{
printf("这位学生的信息:学号为:%s 姓名为:%s 年龄为:%d 语文成绩为:%f 数学成绩为:%f 英语成绩为:%f", p->number, p->name, p->age, p->score[0], p->score[1], p->score[2]);
return;
}
else {
p = p->next;
}
}
printf("无此学生的信息!");
}
//修改函数,传入的head为头节点
void alter(linklist head)
{
char number1[20];
linklist p = (linklist)malloc(sizeof(node));//用于遍历的指针
p = head->next;
printf("\n请输入该学生的学号:");
scanf("%s", number1);
while (p != NULL)
{
if (!strcmp(p->number, number1))
{
printf("这位学生的信息:%s %s %d %f %f %f\n", p->number, p->name, p->age, p->score[0], p->score[1], p->score[2]);
printf("请选择要修改的信息:\n");
printf("1.修改学号\n2.修改姓名\n3.修改年龄\n4.修改语文成绩\n5.修改数学成绩\n6.修改英语成绩\n");
int choose;
scanf("%d", &choose);
switch (choose)
{
case 1:printf("请输入修改结果:"); scanf("%s", p->number); printf("\n修改完成!"); break;
case 2:printf("请输入修改结果:"); scanf("%s", p->name); printf("\n修改完成!"); break;
case 3:printf("请输入修改结果:"); scanf("%d", &p->age); printf("\n修改完成!"); break;
case 4:printf("请输入修改结果:"); scanf("%f", &p->score[0]); printf("\n修改完成!"); break;
case 5:printf("请输入修改结果:"); scanf("%f", &p->score[1]); printf("\n修改完成!"); break;
case 6:printf("请输入修改结果:"); scanf("%f", &p->score[2]); printf("\n修改完成!"); break;
}
return;
}
else {
p = p->next;
}
}
printf("无此学生的信息!");
}