其中还有些小BUG,单链表实现!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
int n;
struct student {
char name[20];
int xh;//学号
int bj;//班级
double eng;//英语
double math;//数学
double C;//C语言
double datab;//数据库
double sjjg;//数据结构
double avg;//平均
double sum;// 总分
struct student *next;//指向下一个节点
};
typedef struct student student;
student *Copylist(student *head);
//+++++++++++++++++++++++++++++++++++++++++++++++++++
student *create_list();
void add(student *head,student *newnode); //创建 增加 输出
void print_list(student *head);
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void searchmeun();
student *search(student *head); //查找
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void tongjimeun();
student *tongji(student *head); //统计
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void paixumeun();
student *paixu(student *head); //排序
//+++++++++++++++++++++++++++++++++++++++++++++++++++
int writeToFile(student *head );
student* readFromFile(); //存取
//+++++++++++++++++++++++++++++++++++++++++++++++++++
void print(); //主界面
//***************************************************
void delete1(student *head); //删除
//***************************************************
int main() {
int g;
student *head=NULL,*p,*newnode;
while(1) {
system("cls");
print();//显示主菜单 (1)
fflush(stdin);
printf("请输入对应命令\n");
scanf("%d",&g);//选择主菜单 (2)
switch(g) {
case 1:
fflush(stdin);//--------------------------------------------清空缓存区
system("cls");//清屏
student * head, * p, * q;
head=create_list();//调用链表 创建链表
system("cls");
break;
case 2:
fflush(stdin);
system("cls");
newnode=(student*)malloc(sizeof(student));
printf("请输入姓名:") ;
gets(newnode->name);
printf("请输入学号: ");
scanf("%d",&newnode->xh);
printf("请输入班级: ");
scanf("%d",&newnode->bj);
printf("请输入英语成绩: ");
scanf("%lf",&newnode->eng);
printf("请输入高数成绩: ");
scanf("%lf",&newnode->math);
printf("请输入C语言成绩: ");
scanf("%lf",&newnode->C);
printf("请输入数据库成绩: ");
scanf("%lf",&newnode->datab);
printf("请输入数据结构成绩: ");
scanf("%lf",&newnode->sjjg);
newnode->sum=newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg;//总分
newnode->avg=(newnode->eng+newnode->math+newnode->C+newnode->datab+newnode->sjjg)/5.0;//平均分
add(head,newnode);
printf("已增加录入一名学生信息\n");
printf("按任意键继续\n");
getchar();// 任意输入一个字符
system("cls");
break;
case 3:
system("cls");
fflush(stdin);
if(head->next!=NULL)
print_list(head);
else printf("无可查信息!^_^");
printf("按任意键继续\n");
getchar();
break;
case 4:
fflush(stdin);
system("cls");
n=1; //n为全局变量 在循环中会发生变化
while(n) {
searchmeun();
head = search(head);
}
break;
case 5:
fflush(stdin);
system("cls");
n=1;
while(n){
tongjimeun();
head=tongji(head);
}
getchar();
break;
case 6:
fflush(stdin);
system("cls");
paixumeun();
int ed; //定义ed作为switch选择
printf("请输入命令\n");
scanf("%d",&ed);
switch(ed){
case 1:fflush(stdin);
head=paixu(head);
getchar();
break;
case 0:
printf("退出子程序,按任意键继续\n");
getchar();
break;
}
break;
case 7:
fflush(stdin);
system("cls");
printf("正在使用删除模块\n");
delete1(head);
break;
case 8:
fflush(stdin);
system("cls");
int success;
printf("正在存盘\n");
success=writeToFile(head);
if(success)
printf("存盘成功\n");
else printf("存储不成功\n");
fflush(stdin);
printf("按任意键继续\n");
getchar();
break;
case 9:
fflush(stdin);
system("cls");
printf("正在读盘\n");
head=readFromFile();
if(head!=NULL)
printf("读盘成功\n");
else printf("读取不成功\n");
fflush(stdin);
printf("按任意键继续\n");
getchar();
break;
case 0:
exit(0);
break;
}
}
free(head);
head=NULL;
return 0;
}
//*******************************************************
student * create_list() { //创建链表函数
student *head,*p,*q;
char name1[20];
head =(student*)malloc(sizeof(student));
if(NULL==head) {//判断是否申请成功
free(head);
return NULL;
}
fflush(stdin);
q=head;
printf("请输入学生姓名\n");
gets(name1);
while (strlen(name1)!=0) {//判断输入然否有效
p=(student*)malloc(sizeof(student));
if(NULL==p)
return head;
strcpy(p->name,name1);
printf("请输入学号:\n");
scanf("%d",&p->xh);
printf("请输入班级:\n");
scanf("%d",&p->bj);
printf("请输入英语成绩:\n");
scanf("%lf",&p->eng);
printf("请输入高数成绩:\n");
scanf("%lf",&p->math);
printf("请输入C语言成绩:\n");
scanf("%lf",&p->C);
printf("请输入数据库成绩:\n");
scanf("%lf",&p->datab);
printf("请输入数据结构成绩:\n");
scanf("%lf",&p->sjjg);
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;//总分
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;//平均分
q->next =p;//通过复制的头节点进行移动
q=p;
printf("继续录入请再次输入学生姓名,否则回车结束!\n");
fflush(stdin);//---------------------------------------清空缓冲区
gets(name1);//进入下一个节点
}
q->next = NULL;
system("cls");
return head;
}
//******************************************************
void add(student *head,student *newnode) { //添加学生信息
fflush(stdin);
student *q,*p;
q=head;
if(head==NULL) head=(student * )(malloc(sizeof(student)));
p=head->next;
while (p!=NULL) {
if(strcmp(p->name, newnode->name)>0)//升序
break;
else {
p=p->next;
q=q->next; //寻找下一个节点
}
}
q->next = newnode;
newnode->next = p;
}
//*******************************************************
void print_list(student *head) { //输出学生信息
student *p;
printf("\n学生成绩如下\n");
printf("姓名 学号 班级 英语 高数 C语言 数据库 数据结构 总分 平均分\n");
p=head->next;
while(p!=NULL) {
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf("%s",p->name);
printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
p=p->next;
}
}
//****************************************************
student *search(student *head) { //查找学生信息
fflush(stdin);//--------------------------------------清空缓存区
student *p;
p=head;
int s;
scanf("%d",&s);
switch(s) {
case 1: {
fflush(stdin);
printf("正在使用学号查找信息\n请输入学号\n");
int y=0;//表示输入所查询的学号
scanf("%d",&y);
while (p!=NULL) {
if(p->xh==y) { //找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf("\n学生成绩如下\n");
printf("姓名 学号 班级 英语 高数 C语言 数据库 数据结构 总分 平均分\n");
printf("%s",p->name);
printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
printf("按任意键继续");
getchar();
break;
} else
p=p->next;//指向下一个 由while进行遍历 直到最后
}
}
n=1;
getchar();
break;
case 2: {
fflush(stdin);
char k[20]= {0};
printf("正在使用姓名查找信息\n请输入姓名\n");
gets(k) ;//输入所查询的姓名
while (p!=NULL) {
if(strcmp(p->name,k)==0) {//找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf("\n学生成绩如下\n");
printf("姓名 学号 班级 英语 高数 C语言 数据库 数据结构 总分 平均分\n");
printf("%s",p->name);
printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
printf("按任意键继续");
getchar();
break;
} else
p=p->next;//指向下一个 由while进行遍历 直到最后
}
}
getchar();
n=1;
break;
case 3: {
fflush(stdin);
int cla=0;
printf("正在使用班级查找信息\n请输入班级\n");
scanf("%d",&cla);
while (p!=NULL) {
if(p->bj==cla) { //找到
p->avg=(p->eng+p->math+p->C+p->datab+p->sjjg)/5.0;
p->sum=p->eng+p->math+p->C+p->datab+p->sjjg;
printf("\n学生成绩如下\n");
printf("姓名 学号 班级 英语 高数 C语言 数据库 数据结构 总分 平均分\n");
printf("%s",p->name);
printf("%10d%9d%8.0lf%9.0lf%10.0lf%12.0lf%11.0lf%13.0lf%10.0lf\n",p->xh,p->bj,p->eng,p->math,p->C,p->datab,p->sjjg,p->sum,p->avg);
p=p->next;
} else
p=p->next;//指向下一个 由while进行遍历 直到最后
}
printf("按任意键继续");
getchar();
getchar();
break;
}
n=1;
getchar ();
break;
case 0:
fflush(stdin);
system("cls");
n=0;
break;
default:
fflush(stdin);
printf("输入有误!\n");
printf("请重新输入\n");
printf("按任意键继续!");
getchar();
n=1;
break;
}
return head;
}
//******************************************************
student *tongji(student *head) {
//统计某班的平均分
//统计某班高于平均分的人数
//统计某门课程的平均分
fflush(stdin);
student * p;
p = head->next;
int f;
scanf("%d",&f);
switch(f)
{
case 1: {//询所有学生的平均成绩
fflush(stdin);
printf("正在查询所有学生的总平均成绩\n");
double Count = 0.0;
double allsum=0.0;
while (p!=NULL ) {
allsum+=p->sum;
Count +=1.0;
p=p->next;
}
printf("所有学生的平均为%.2lf\n",allsum/Count);
}
n=1;
printf("按任意键继续\n");
getchar();
break;
//=================================================================
case 2: {//按课程号查询某课程的平均成绩
fflush(stdin);
int mn;
printf("正在按课程号查询某课程的平均成绩\n");
printf("请输入需查询平均成绩的课程号\n");
printf("英语 :请输入 1 数学:请输入 2 C语言:请输入 3 数据库:请输入 4 数据结构:请输入 5\n");
scanf("%d",&mn);
switch(mn)
{
case 1: {//英语的平均成绩
double Count1 = 0.0;
double allsum1=0.0;
while (p!=NULL ) {
allsum1+=p->eng;
Count1 +=1.0;
p=p->next;
}
printf("所有学生的英语平均分为: %.2lf\n",allsum1/Count1);
}
printf("按任意键继续\n");
getchar();
break;
case 2: {//数学的平均成绩
double Count2 = 0.0;
double allsum2=0.0;
while (p!=NULL ) {
allsum2+=p->math;
Count2 +=1.0;
p=p->next;
}
printf("所有学生的数学平均为分%.2lf\n",allsum2/Count2);
}
printf("按任意键继续\n");
getchar();
break;
case 3: {//C语言的平均成绩
double Count5 = 0.0;
double allsum5=0.0;
while (p!=NULL ) {
allsum5+=p->C;
Count5 +=1.0;
p=p->next;
}
printf("所有学生的C语言平均为分%.2lf\n",allsum5/Count5);
}
printf("按任意键继续\n");
getchar();
break;
case 4: {//数据库平均成绩
double Count3 = 0.0;
double allsum3=0.0;
while (p!=NULL ) {
allsum3+=p->datab;
Count3 +=1.0;
p=p->next;
}
printf("所有学生的数据库平均分为%.2lf\n",allsum3/Count3);
}
printf("按任意键继续\n");
getchar();
break;
case 5: {//数据结构平均成绩
double Count4 = 0.0;
double allsum4=0.0;
while (p!=NULL ) {
allsum4+=p->sjjg;
Count4 +=1.0;
p=p->next;
}
printf("所有学生的数据结构平均分为%.2lf\n",allsum4/Count4);
}
printf("按任意键继续\n");
getchar();
break;
}
//***************************************************内部嵌套的switch结束
} //--------------------------------------------------//这里第二个case2结束
n=1;
getchar();
break;
//===============================================================
case 3: {//查询高于总平均分的人数
fflush(stdin);
printf("正在查询高于总平均分的人数\n");
double Count6 = 0.0;
double allsum6=0.0;
while (p!=NULL ) {
allsum6+=p->sum;
Count6 +=1.0; //先求出平均分
p=p->next;
}
int qw=allsum6/Count6;//总平均成绩
double Count7=0.0;
while (p!=NULL ) {
if(p->avg>qw) {
Count7 +=1.0; //先求出平均分
p=p->next;
} else p=p->next;
}
printf("所高于平均数的人数为%.0lf\n",Count7);
}
n=1;
printf("按任意键继续\n");
getchar();
break;
case 0:
fflush(stdin);
printf("结束\n");
printf("按任意键继续");
n=0;
break;
default :
fflush(stdin);
printf("请输入正确信息\n");
n=1;
printf("按任意键继续\n");
getchar();
break;
}
return head;
}
//**************************************************************
student *Copylist(student *head)//复制先前列表
{
student *newlist,*s,*p;
int i=0,j;
while(head!=NULL)
{
i++;
s=(student *)malloc(sizeof(student));
strcpy(s->name,head->name);
s->xh=head->xh;
s->bj=head->bj;
s->eng=head->eng;
s->math=head->math;
s->C=head->C;
s->datab=head->datab;
s->sjjg=head->sjjg;
s->avg=head->avg;
s->sum=head->sum;
if(i==1)
{
newlist=s;
s->next=NULL;
}
else p->next=s;
p=s;
head=head->next;
}
p->next=NULL;
printf("---复制链表成功!---\n");
return newlist;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
student *paixu(student *head)
{
fflush(stdin);
char ch;
student *first,*tail,*p_front,*min,*p,*copyhead;
if(head==NULL)
{
printf("---空链表!请先新建链表或文件读取---\n");
return head;
}
//先复制链表,以作备份
copyhead=Copylist(head);
first=NULL;
while(head!=NULL)
{
for(p=head,min=head;p->next!=NULL;p=p->next)
{
if(p->next->sum <min->sum)//p->next->sum比较小
{
p_front=p; //保存最小节点的前一个节点
min=p->next; //保存此时链表最小的节点值
}
}
//将得到的值放入有序链表中;
if(first==NULL)
{
first=min;
tail=min;
}
else //有序链表中已经有节点
{
tail->next=min;
tail=min;
}
//原链表指针后移
if(min==head)
head=head->next;
else
p_front->next = min->next;
}
if(first!=NULL)
tail->next=NULL;
//完成总分排序
system("cls");
printf("---排序成功!排序如下--\n");
print_list(first);
printf("按任意键继续!");
return copyhead;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delete1 (student *head)
{ printf("输入要删除的学生姓名\n");
fflush(stdin);
char who[20];
scanf("%s",&who);
student *p,*q;
q=head;
p = head->next;
while (p!=NULL)
{if(strcmp(p->name,who)==0)//找到
break;
else
{ p=p->next;
q=q->next;
}
}
if(p != NULL) //表示找到了,是经break语句跳出循环的
{ q->next = p->next;
printf("名为%s 的学生已被删除。\n",p->name);
free(p);
p=NULL;
printf("按任意键继续");
getchar(); //防止直接闪过
}
else
printf("没有找到,不删除!\n");
getchar();
}
//**************************************************************
int writeToFile(student *head) { //将链表写入到默认文件
FILE *fpw = NULL; //文件指针
student *p;
if( NULL==head ) {
printf("没有学生信息,无须写入文件!\n");
return 0;
}
fpw = fopen("student.txt", "wb");
if( NULL == fpw) //文件打开失败,则数据存盘失败
return 0;
p = head->next;
while( p != NULL ) {
fwrite(p,sizeof(student),1, fpw);//每次读入一个学生信息,直到结束
p = p->next;
}
if( NULL!=fpw )//如果读取到了信息,就保存
fclose(fpw);
return 1; //返回成功标志
}
//*******************************************************
student * readFromFile() { //从默认文件(haohaninfo.txt)中读取信息
FILE *fpr = NULL; //文件指针
student *p, *head;
fpr = fopen("student.txt", "rb");
if( NULL == fpr) {
printf("文件打开失败\n");
return NULL;
}
head = (student*)malloc(sizeof(student));
head->next = NULL;
while( !feof(fpr) ) { //未读取文件末尾
p = (student*) malloc(sizeof(student));
if(fread(p,sizeof(student),1, fpr) ) { //如果读取成功一个结点信息
//p插入到链表头部
p->next = head->next;
head->next = p;
} else //如果未读取到结点信息,则p是多余的,要释放
free(p) ;
}
if( NULL!=fpr )
fclose(fpr);
return head; //返回链表头指针
}
//***********************************************************
void print() { //显示
system("cls");//清屏
printf("+======================================+\n");
printf("| 制作人: <span style="white-space:pre"> </span> |\n");
printf("+======================================+\n");
printf("| 学 生 成 绩 管 理 系 统 主 菜 单 |\n");
printf("+======================================+\n");
printf("| 1 重新输入所有学生信息 |\n");
printf("| 2 补充输入一个学生信息 |\n");
printf("| 3 输出所有成绩 |\n");
printf("| 4 查询子程序 |\n");
printf("| 5 统计汇总子系统 |\n");
printf("| 6 排序子系统 |\n");
printf("| 7 删除学生信息 |\n");
printf("+======================================+\n");
printf("| 8 数据存盘 |\n");
printf("| 9 读入学生信息 |\n");
printf("+======================================+\n");
printf("| 0 退出系统 |\n");
printf("+======================================+\n");
}
//*********************************************************
void searchmeun() { //查询子菜单
system("cls");
printf("+======================================+\n");
printf("| 查 询 子 系 统 主 菜 单 |\n");
printf("+======================================+\n");
printf("| 1 按学号查询 |\n");
printf("| 2 按姓名查询 |\n");
printf("| 3 按班级查询 |\n");
printf("+======================================+\n");
printf("| 0 返回上一级 |\n");
printf("+======================================+\n");
printf("\n");
printf("请输入命令:");
}
void tongjimeun() {
system("cls");
printf("+======================================+\n");
printf("| 统 计 子 系 统 主 菜 单 |\n");
printf("+======================================+\n");
printf("| 1 统计所有学生的总平均分 |\n");
printf("| 2 统计某门课程的平均分 |\n");
printf("| 3 统统计某班高于总分平均分的人数|\n");
printf("+======================================+\n");
printf("| 0 返回上一级 |\n");
printf("+======================================+\n");
printf("\n");
printf("请输入命令:");
}
void paixumeun() {
system("cls");
printf("+======================================+\n");
printf("| 排 序 子 系 统 主 菜 单 |\n");
printf("+======================================+\n");
printf("| 1 按总分升序排序 |\n");
printf("+======================================+\n");
printf("| 0 返回上一级 |\n");
printf("+======================================+\n");
printf("\n");
printf("请输入命令:");
}