#define _CRT_SECURE_NO_WARNINGS
#include "SS.h"
void menu() //呈现主菜单
{
system("cls"); //清空屏幕
printf("\n"); //设计界面、提供选择操作
printf("\t\t ---------- 学生管理系统----------\n");
printf("\t\t 欢迎使用\n");
printf("\t\t\t 1 创建名单及信息\n");
printf("\t\t\t 2 插入名单及信息\n");
printf("\t\t\t 3 删除名单及信息\n");
printf("\t\t\t 4 查看名单及信息\n");
printf("\t\t\t 5 查看学生总成绩\n");
printf("\t\t\t 6 查看学生总成绩排名\n");
printf("\t\t\t 7 退出系统\n");
printf("\t\t ------------------------------------\n");
printf("请选择 1 ~ 7:"); //提示输出
}
SS*create(int n) //该函数用于创建链表,形参n为链表结点的个数
{
SS*head=new SS;//创建首结点
SS*p1=head;//p1指向首结点
for(int i=0;i<n;i++)//循环创建新结点(已创建首结点,所以只需再创建n-1个新结点)
{
SS*p2=new SS;//创建新结点
printf("输入第%d个学生的信息:\n",i+1);//提示输入
cout<<"学号:";cin>>p1->id; //输入结点(学生)的信息
cout<<"姓名:";cin>>p1->name;
cout<<"语文成绩:";cin>>p1->C;
cout<<"数学成绩:";cin>>p1->M;
cout<<"英语成绩:";cin>>p1->E;
cout<<endl;//换行
p1->sum=(p1->C)+(p1->M)+(p1->E);//通过输入的数据来计算出总分
p1->next=p2;//前一个结点指向后一个结点
p1=p2; //移动p1指向,便于创建新结点
p2->next=NULL;//悬空尾结点
}
return(head);//返回值为链表的头指针
}
SS*insert(SS*head)//函数用于插入新结点(头插法),在原链表基础上插入,故形参为链表的头指针
{
SS*p2=new SS;//创建新结点用于插入
SS*p1=head;//p1指向首结点
cout<<"请输入新学生的信息:"<<endl;//提示输入
cout<<"学号:";cin>>p2->id; //提示输入和读取操作
cout<<"姓名:";cin>>p2->name;
cout<<"语文成绩:";cin>>p2->C;
cout<<"数学成绩:";cin>>p2->M;
cout<<"英语成绩:";cin>>p2->E;
p2->sum=(p2->C)+(p2->M)+(p2->E);//通过输入的数据来计算出总分
p2->next=p1;//新结点指向收首结点(头插法)
head=p2;//新结点成为首结点,便于用头指针读取所有结点
return(head);//返回值为链表的头指针
}
SS*del(SS*head)//函数用于删除结点,在原链表基础上删除,故形参为链表的头指针
{
int d;//变量d为所要删除学生的学号
SS*p1=head;SS*p2=NULL;//定义p1,p2(p1指向首结点,悬空p2)
cout<<"请输入所要删除学生的学号:";cin>>d;//提示输入和读取操作
if(d==(p1->id))//若首结点就是所要删除的结点
{
head=p1->next;//更改首结点(头指针)
delete p1;//释放p1内存
p1=NULL; //悬空操作
}
else//若首结点是是所要删除的结点
{
while(d!=p1->id&&p1->next!=NULL)//在链表中寻找所需结点
{
p2=p1;//p1和p2不断移动,直至循环停止,即找到所要删除的结点
p1=p1->next;
}//循环停止时,p1就是所需删除的结点,p2是p1前一个结点
p2->next=p1->next; //跨结点连接(删除结点p1操作)
}
return(head);//返回值为链表的头指针
}
void print(SS*head)//输出所有信息
{
SS*p=head;//定义p指向第一个链表头指针
while(p->next!=NULL)//逐个输出,遇到NULL停止
{
cout<<"学号:"<<p->id<<'\t'<<p->name<<'\t'<<p->C<<'\t'<<p->M<<'\t'<<p->E<<endl; //输出数据域
p=p->next;//循环移动p,用于逐个输出下一个结点的数据域
}
getchar(); //提取缓冲区的回车键
getchar(); //暂停操作
printf("\n"); //换行
}
void show(SS*head)//输出总成绩
{
SS*p=head;//定义p指向头指针用于逐个输出
while(p->next!=NULL)//逐个输出,遇到NULL停止
{
cout<<"学号:"<<p->id<<'\t'<<p->name<<'\t'<<"总成绩"<<p->sum<<endl; //输出数据域
p=p->next;//循环移动p,用于逐个输出下一个结点的数据域
}
getchar(); //提取缓冲区的回车键
getchar(); //暂停操作
printf("\n"); //换行
}
SS*sort(SS*head)//排序总成绩
{
float temp1;//交换总分--辅助变量(用于交换数据)
int temp2;//交换学号
char temp3[10];//交换姓名
SS*p=NULL,*q=NULL;
for(p=head;p!=NULL;p=p->next)//遍历所有的结点
{
for(q=p->next;q!=NULL;q=q->next)//打擂台算法找到最大数据
{
if(q->sum>p->sum)//逐个对比,从大到小排序
{
temp1=q->sum;temp2=q->id;strcpy(temp3,q->name);//数据交换 (运用了字符串复制的函数来赋值操作)
q->sum=p->sum;q->id=p->id;strcpy(q->name,p->name);
p->sum=temp1;p->id=temp2;strcpy(p->name,temp3);
}
}
}
return(head);//返回值为链表的头指针
}
没有合适的资源?快使用搜索试试~ 我知道了~
学生管理系统(管理学生学号姓名成绩等信息)
共8个文件
o:2个
win:1个
layout:1个
需积分: 0 5 下载量 36 浏览量
2022-12-12
21:39:29
上传
评论
收藏 7KB RAR 举报
温馨提示
大学入门C/C++必备必懂程序 该系统主要是通过链表设计完成的,创建一个学生相当于一个结构体,也就相当于单个结点,单个结点内包含着学生的各方面消息。输入多个学生信息相当于创建一个多个结点的链表;插入新学生的消息相当于在链表内插入一个新结点;删除一个学生的消息相当于删除一个结点;查看学生信息相当于通过头指针依次读取所有结点来输出整个链表;总分运用了选择排序法。项目的头文件SS.h主要放置结构体和极少部分变量的定义和函数声明。项目的源文件有2个,主函数在源文件main.cpp实现函数调用,循环switch选择,操控程序的运行和结束,函数的定义全都源文件SS.c分类明确,便于观看和整理修改。 该系统里面有1个主函数和7自定义函数,返回值主要以链表的头指针为主, main主函数:控制程序的执行入口和出口,用while循环来多次选择,用switch选择执行不同的操作,操作由不同函数实现。
资源推荐
资源详情
资源评论
收起资源包目录
学生管理系统.rar (8个子文件)
Makefile.win 1KB
SS.c 4KB
学生管理系统.dev 1KB
main.cpp 870B
学生管理系统.layout 218B
SS.o 7KB
main.o 3KB
SS.h 508B
共 8 条
- 1
资源评论
ⁿ816
- 粉丝: 1
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功