#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
struct Student
{
long int num;
char name[20];
double score[4];
struct Student* next;
};
void menu();//菜单
void Flag();//录入检测函数
int check_num(struct Student* head, int num, int n);//学号重复检查函数
int check_score(double score[3]);//成绩合法检查
struct Student* creat(struct Student* head);//录入学生信息
struct Student *insert(struct Student *head,struct Student *stud); //学生信息插入
void print(struct Student *head);//显示学生信息
struct Student* del(int del_num,struct Student *head,struct Student *p,struct Student *q);//删除学生信息
struct Student* search(struct Student *head,int num,int N);//搜索学生信息
int N;
int main()
{
struct Student* head,* stu,*p,*q;
int search_num, del_num;
double new_score[4];
int flag = 0;
int choice;
while (1)
{
menu();
printf("您好,请输入操作编号:");
scanf("%d", &choice);
switch (choice)
{
case 0:printf("已退出系统,感谢使用!\n"), exit(0);
case 1:
flag = 1;//已录入信息记录
head = creat(head);
p=head;
print(head);
system("pause");
system("cls");
break;
case 2:
if(flag == 0)
Flag();
else
{
printf("请输入查找学号:");
scanf("%d", &search_num);
printf("查询结果:\n");
//查找是否存在该名学生
p = search(head,search_num,N);
if(p)
{
printf("学号\t姓名\t语文成绩\t数学成绩\t英语成绩\t总分\t\n");
printf("%d\t%s\t%.2f\t %.2f\t %.2f\t %.2f\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3]);
}
else
printf("该学生信息未找到\n");
}
system("pause");
system("cls");
break;
case 3:
if(flag == 0)
Flag();
else
{
do
{
//开辟空间临时储存修改信息
stu=(struct Student *)malloc(LEN);
printf("请输入学生的学号:");
scanf("%d", &stu->num);
printf("请输入学生的姓名:");
scanf("%s", stu->name);
printf("请输入学生成绩(语文 数学 英语):");
for (int j = 0; j < 3; j++)
{
scanf("%lf", &stu->score[j]);
}
//检查成绩是否合法
while (check_score(stu->score))
{
printf("成绩输入有误!请重新输入\n");
system("pause");
printf("请输入学生成绩(语文 数学 英语 ):");
for (int j = 0; j < 3; j++)
{
scanf("%lf", &stu->score[j]);
}
}
stu->score[3]=stu->score[0]+stu->score[1]+stu->score[2];//计算总分
//调用插入函数
head=insert(head,stu);
N=0;//学生数清零
print(head);
printf("学生信息录入成功!是否继续录入(y/n):");
getchar();
}while (getchar() == 'y');
system("pause");
system("cls");
}
break;
case 4:
if(flag == 0)
Flag();
else
{
N=0;//学生数清零重新计算
print(head);//显示学生信息供用户选择
printf("请输入学号:");
scanf("%d", &del_num);
//查找是否存在该学生
p = search(head,del_num,N);
if(p)
{
p = head;
q = head->next;
head = del(del_num,head,p,q);
printf("删除成功!\n");
}
else
printf("该学生信息未找到\n");
N=0;
print(head);//显示删除后的链表
}
system("pause");
system("cls");
break;
case 5:
if(flag == 0)
Flag();
else
{
N=0;
print(head);
}
system("pause");
system("cls");
break;
case 6:
if(flag == 0)
Flag();
else
{
printf("请输入学号:");
scanf("%d", &search_num);
p = search(head,search_num,N);
if(p)
{
printf("请输入该学生新的三门课成绩(语文 数学 英语):");
for(int i=0;i<3;i++)
{
scanf("%lf", &new_score[i]);
p->score[i] = new_score[i];
}
while (check_score(p->score))
{
printf("成绩输入有误!请重新输入\n");
system("pause");
printf("请输入学生成绩(语文 数学 英语 ):");
for (int j = 0; j < 3; j++)
{
scanf("%lf", &p->score[j]);
}
}
p->score[3]=p->score[0]+p->score[1]+p->score[2];//计算总分
printf("修改成功!\n") ;
printf("学号\t姓名\t语文成绩\t数学成绩\t英语成绩\t总分\t\n");
printf("%d\t%s\t%.2f\t %.2f\t %.2f\t %.2f\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3]);
}
else
printf("该学生信息未找到\n");
}
system("pause");
system("cls");
default:
printf("选择错误!\n");
break;
}
}
}
//菜单
void menu()
{
printf("======学生信息管理系统======\n");
printf("======0:退出程序===========\n");
printf("======1:新建学生信息=======\n");
printf("======2:查找学生信息=======\n");
printf("======3:插入学生信息=======\n");
printf("======4:删除学生信息=======\n");
printf("======5:输出学生信息=======\n");
printf("======6:修改学生信息=======\n");
printf("=========================\n");
}
//新建信息
struct Student* creat(struct Student* head)
{
struct Student* q, * p;
int n = 1;
do {
p = (struct Student*)malloc(LEN);//开辟空间
if (n == 1)
{
head = p;
q = p;
}
else
{
q->next = p;//链接到新的链表
q = p;
}
printf("请输入学生的学号:");
scanf("%d", &p->num);
//学号唯一检测
if (n >= 2)
{
while (check_num(head, p->num, n))
{
printf("学号重复,请重新输入学生信息!\n");
system("pause");
printf("请输入学生的学号:");
scanf("%d", &p->num);
}
}
printf("请输入学生的姓名:");
scanf("%s", p->name);
printf("请输入学生成绩(语文 数学 英语):");
for (int j = 0; j < 3; j++)
{
scanf("%lf", &p->score[j]);
}
//成绩检查
while (check_score(p->score))
{
printf("成绩输入有误!请重新输入\n");
system("pause");
printf("请输入学生成绩(语文 数学 英语 ):");
for (int j = 0; j < 3; j++)
{
scanf("%lf", &p->score[j]);
}
}
//计算总分
p->score[3]=p->score[0]+p->score[1]+p->score[2];
getchar();
printf("学生信息录入成功!是否继续录入(y/n):");
n++;//学生加一
} while (getchar() == 'y');
return(head);
}
//学号检查函数
int check_num(struct Student *head, int num, int n)
{
struct Student* p = head;
int i;
for (i = 1; i < n; i++)
{
if (p->num == num)
return 1;
p = p->next;//指向下一个
}
if (i == n)
return 0;
}
//成绩检查函数
int check_score(double score[3])
{
int i;
for (i = 0; i < 3; i++)
{
if (score[i] < 0 || score[i]>100)
return 1;
}
return 0;
}
//信息检测函数
void Flag()
{
printf("请先录入数据!\n");
}
//学生信息插入
struct Student *insert(struct Student *head,struct Student *stud)
{
struct Student *p0,*p,*q;
q=head;
p0=stud;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while((p0->num>q->num)&&(q->next!=NULL))
{
p=q;
q=q->next;
}
if(p0->num<q->num)
{
if(head==q)
head=p0;
else
p->next=p0;
p0->next=q;
}
else
{
q->next=p0;
p0->next=NULL;
}
}
return(head);
}
//显示学生信息
void print(struct Student *head)
{
struct Student *p;
p = head;
while(p!=NULL)
{
p = p->next;
N++; //统计学生个数
}
printf("\n储存了%d条数据:\n",N);
printf("学号\t姓名\t语文成绩\t数学成绩\t英语成绩\t总分\t\n");
p=head;
while(p!=NULL)
{
printf("%d\t%s\t%.2f\t %.2f\t %.2f\t %.2f\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->score[3]);
p=p->next;
}
}
//查找学生信息
struct Student* search(struct Student *head,int num,int N)
{
struct Student *p = head;
int i;
for(i=1;i<=N;i++)
{
if(num == p->num)
{
return p;
break;
}
p = p->next;
}
if(i>N)
return NULL;
}
//学生信息删除
struct Student* del(int del_num,struct Student *head,struct Student *p,struct Student *q)
{
if(del_num == p->num)
return p->next;//如果该名学生是第一位
while(q != NULL && q->num != del_num)
{
p = q;
q = q->next;
}
if(q->num)
p->next = q->next;//p为头q为尾
return head;
}
时间:2024.1.10