#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>
//基于链表的学生管理系统
typedef struct Student //定义结构体
{
long num; //学号
char name[20]; //姓名
char sex; //性别
float Chinese; //语文成绩
float Math; //数学成绩
float English; //英语成绩
float aver; //平均分
}student;
typedef struct Node //定义链表节点
{
student stu; //定义stu数据
struct Node *next; //指向下一个节点
}node;
node *h=NULL; //定义h
int Menu(); //一级菜单
int menu(); //二级菜单
void creat_link(); //创建新链表,输入信息
void output_link(); //输出
void increase(); //增加学生信息
void delete_link(); //删除信息
void fix(); //修改信息
int sort(); //排序功能
void number(); //学号排序
void aver(); //平均分排序
int main()
{
int a;
while(1)
{
a = Menu();
switch(a)
{
case 1:creat_link();break;
case 2:output_link();break;
case 3:increase();break;
case 4:delete_link();break;
case 5:fix();break;
case 6:sort();break;
case 7:
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\t已退出...\n\n\n\n\n\n\n\n\n\n\n\n");
exit(0);
break;
default:
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t请输入正确的选择(按任意键继续)");
break;
}
getch();
}
return 0;
}
int Menu() //一级菜单
{
system("cls");
int a;
printf("\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\t\t\t\t\t| 学生成绩管理系统V2.0|\t\t\t\n");
printf("\t\t\t\t\t|\t请选择功能\t|\t\t\t\t\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\t\t\t\t\t|\t1.录入信息\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t2.打印信息\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t3.增加信息\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t4.删除信息\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t5.修改信息\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t6.信息排序\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t7.退出系统\t|\t\t\t\t\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\n");
printf("\t\t\t\t\t请输入您要选择的功能键: ");
scanf("%d",&a);
return a;
}
int menu() //二级菜单
{
system("cls");
int d;
printf("\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\t\t\t\t\t| 学生成绩管理系统V2.0|\t\t\t\n");
printf("\t\t\t\t\t|\t请选择功能\t|\t\t\t\t\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\t\t\t\t\t|\t1.学号排序\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t2.平均分排序\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t3.返回上一级\t|\t\t\t\t\n");
printf("\t\t\t\t\t|\t4.退出系统\t|\t\t\t\t\n");
printf("\t\t\t\t\t-------------------------\n");
printf("\n");
printf("\t\t\t\t\t请输入您要选择的功能键: ");
scanf("%d",&d);
return d;
}
void creat_link()
{
system("cls");
node *p;
p = (node *)malloc(sizeof(node)); //创建一个新节点
p->next = NULL; //将新节点初始化
if(h==NULL) //插入节点,判断节点是否存在
h = p;
else
{
p->next = h;
h = p;
}
printf("\n\n\n\n\n\n");
printf("\n输入学号:");
getchar();
scanf("%ld",&p->stu.num);
printf("\n输入姓名:");
getchar();
gets(p->stu.name);
printf("\n输入性别(m or f):");
scanf("%c",&p->stu.sex);
printf("\n输入语数英三科成绩(0~100):");
scanf("%f%f%f",&p->stu.Chinese,&p->stu.Math,&p->stu.English);
if(p->stu.sex != 'm' && p->stu.sex != 'f') //判断性别
{
printf("性别输入错误!(按任意键返回菜单)");
getch();
Menu();
}
if(p->stu.Chinese>100 || p->stu.Chinese<0 || //判断成绩
p->stu.Math>100 || p->stu.Math<0 ||
p->stu.English>100 || p->stu.English<0)
{
printf("成绩输入错误!(按回车返回菜单)");
getch();
Menu();
}
printf("\n");
printf("\n\n录入成功 按回车继续...");
}
void output_link()
{
system("cls"); //清屏
printf("\n学生信息:\n"); //打印表头
printf("学号\t姓名\t性别\t语文\t数学\t英语\n");
printf("-----------------------------------------------------\n");
node *p = h; //遍历链表
while(p!=NULL)
{
printf("%ld\t%s\t%c\t%.2f\t%.2f\t%.2f\n",p->stu.num,p->stu.name,p->stu.sex,p->stu.Chinese,p->stu.Math,p->stu.English);
p = p -> next;
}
printf("\n\n打印完成(按任意键继续...)");
}
void increase() //添加学生信息
{
system("cls");
node *p;
p = (node *)malloc(sizeof(node));
p->next = NULL; //初始化
if(p == NULL) //插入节点
{
h = p;
}
else
{
p->next = h;
h = p;
}
printf("\n\n添加信息:\n");
printf("\n输入学号:");
getchar();
scanf("%ld",&p->stu.num);
printf("\n输入姓名:");
getchar();
gets(p->stu.name);
printf("\n输入性别(m or f):");
scanf("%c",&p->stu.sex);
printf("\n输入语数英三科成绩(0~100):");
scanf("%f%f%f",&p->stu.Chinese,&p->stu.Math,&p->stu.English);
if(p->stu.sex != 'm' && p->stu.sex != 'f')
{
printf("性别输入错误!(按任意键返回菜单)");
getch();
Menu();
}
if(p->stu.Chinese>100 || p->stu.Chinese<0 ||
p->stu.Math>100 || p->stu.Math<0 ||
p->stu.English>100 || p->stu.English<0)
{
printf("成绩输入错误!(按回车返回菜单)");
getch();
Menu();
}
printf("\n\n");
printf("录入完成(按任意键继续...)");
}
void delete_link() //删除信息
{
system("cls");
node *p,*q;
long dnum; //定义要输入的信息
int flag = 0;
p = (node *)malloc(sizeof(node));
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t请输入你要删除的学生学号:");
scanf("%ld",&dnum);
p = h;
q = h;
if(h->stu.num == dnum)
{
h = h->next;
free(p); //释放要删除的信息
flag = 1;
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t删除完成(按任意键继续...)");
}
else
{
while(p != NULL) //遍历链表
{
if(p->stu.num == dnum)
{
flag = 1;
break;
}
q = p;
p = p->next;
}
if(flag == 1) //找到相应的节点
{
q->next = p->next;
free(p);
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t删除完成(按任意键继续...)");
}
else
{
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t你要删除的数据不存在!(按任意键继续...)");
}
}
}
void fix() //修改信息
{
system("cls");
node *p,*q;
long dnum;
int flag=0;
q = (node *)malloc(sizeof(node));
q->next = NULL;
printf("\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t\t\t请输入你要修改的学生学号:");
scanf("%ld",&dnum);
p = h; //将定义的p和q赋值为h;
q = h;
if(h->stu.num == dnum)
{
h = h->next;
if(p == NULL)
{
h = p;
}
else
{
p->next = h;
h = p;
}
system("cls");
printf("\n\n\n\n\n\n");
printf("\n输入学号:");
getchar();
scanf("%ld",&p->stu.num);
printf("\n输入姓名:");
getchar();
gets(p->stu.name);
printf("\n输入性别(m or f):");
scanf("%c",&p->stu.sex);
printf("\n输入语数英三科成绩(0~100):");
scanf("%f%f%f",&p->stu.Chinese,&p->stu.Math,&p->stu.English);
if(p->stu.sex != 'm' && p->stu.sex != 'f') //判断性别
{
printf("性别输入错误!(按任意键返回菜单)");
getch();
Menu();
}
if(p->stu.Chinese>100 || p->stu.Chinese<0 || //判断成绩
p->stu.Math>100 || p->stu.Math<0 ||
p->stu.English>100 || p->stu.English<0)
{
printf("成绩输入错误!(按回车返回菜单)");
getch();
Menu();
}
flag = 1;
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t修改完成(按任意键继续...)");
}
else
{
while(p != NULL) //同删减功能
{
if(p->stu.num == dnum)
{
flag = 1;
break;
}
q = p;
p = p->next;
}
if(flag == 1)
{
h = h->next;
q->next = p->next;
if(p == NULL)
{
h = p;
}
else
{
p->next = h;
h = p;
}
system("cls");
printf("\n\n\n\n\n\n");
printf("\n输入学号:");
getchar();
scanf("%ld",&p->stu.num);
printf("\n输入姓名:");
getchar();
gets(p->stu.name);
printf("\n输入性别(m or f):");
scanf("%c",&p->stu.sex);
printf("\n输入语数英三科成绩(0~100):");
scanf("%f%f%f",&p->stu.Chinese,&p->stu.Math,&p->stu.English);
if(p->stu.sex != 'm' && p->stu.sex != 'f') //判断性别
{
printf("性别输入错误!(按任意键返回菜单)");
getch();
Menu();
}
if(p->stu.Chinese>100 || p->stu.Chinese<0 || //判断成绩
p->stu.Math>100 || p->stu.Math<0 ||
p->stu.English>100 || p->stu.English<0)
{
printf("成绩输入错误!(按回车返回菜单)");
getch();
Menu();
}
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t修改完成(按任意键继续...)");
}
else
{
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t你要修改的数据不存在!(按任意键继续...)");
}
}
}
int sort() //排序
{
system("cls");
int d;
while(1)
{
d = menu();
switch(d)
{
case 1:printf("学号由低到高排序:\n");number();break; //学号排序
case 2:printf("平均分由高到低排序:\n");aver();break; //平均分排序
case 3:return(1); //返回上一级
case 4:exit(0);break; //退出
default:
system("cls");
printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t请输入正确的选择(按任意键继续)");
break;
}
getch();
}
}
void number()
{
system("cls");
node *p,*q;
p=h;
int n=1;
while(p!=NULL)
{
p->stu.aver = (p->stu.Chinese + p->stu.Math + p->stu.English)/3.0;
p = p->next;
n++;
}
p=h;
int i;
long temp;
float t1,t2,t3,t4;
char t5[25];
char t6;
for ( i =1; i < n;i++,p=p->next)//冒泡排序
for (q = p->next;q!= NULL;q=q->next)
if (p->stu.num>q->stu.num)
{ //交换所有信息
t1 = p->stu.Chinese;
p->stu.Chinese = q->stu.Chinese;
q->stu.Chinese = t1;
t2 = p->stu.Math;
p->stu.Math = q->stu.Math;
q->stu.Math = t2;
t3 = p->stu.English;
p->stu.English = q->stu.English;
q->stu.English = t3;
t4 = p->stu.aver;
p->stu.aver= q->stu.aver;
q->stu.aver = t4;
strcpy(t5,p->stu.name);
strcpy(p->stu.name ,q->stu.name);
strcpy(q->stu.name ,t5);
temp=p->stu.num;
p->stu.num=q->stu.num;
q->stu.num=temp;
t6=p->stu.sex;
p->stu.sex=q->stu.sex;
q->stu.sex=t6;
}
output_link();
}
void aver()
{
node *p,*q;
node *t;
p=h;
int n=1;
while(p!=NULL)
{
p->stu.aver = (p->stu.Chinese + p->stu.Math + p->stu.English)/3.0;
p = p->next;
n++;
//计算节点数量
}
p=h;
int i;
long temp;
float t1,t2,t3,t4;
char t5[25];
char t6;
//冒泡排序
for ( i =1; i < n;i++,p=p->next)
for (q = p->next;q!= NULL;q=q->next)
if (p->stu.aver < q->stu.aver)
{
//交换所有信息
t1 = p->stu.Chinese;
p->stu.Chinese = q->stu.Chinese;
q->stu.Chinese = t1;
t2 = p->stu.Math;
p->stu.Math = q->stu.Math;
q->stu.Math = t2;
t3 = p->stu.English;
p->stu.English = q->stu.English;
q->stu.English = t3;
t4 = p->stu.aver;
p->stu.aver= q->stu.aver;
q->stu.aver = t4;
strcpy(t5,p->stu.name);
strcpy(p->stu.name ,q->stu.name);
strcpy(q->stu.name ,t5);
temp=p->stu.num;
p->stu.num=q->stu.num;
q->stu.num=temp;
t6=p->stu.sex;
p->stu.sex=q->stu.sex;
q->stu.sex=t6;
}
output_link();
}
希望这篇文章对你有用 !
仅供参考