第一次用链表和文件来编写学生信息管理系统 (=´ω`=)写的不好请大家见谅✧(≖ ◡ ≖✿
功能介绍
1.添加学生信息;
2.对学生信息进行排序;
3.删除学生信息;
4.查询学生信息;
5.修改学生信息;
6.输出学生信息;
7.清屏;
main函数
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
char *file1="xinxi.txt";
char file2[100];
int main()
{
sayhello();
int com;
while(1)
{
introduce();
while(scanf("%d",&com)!=1)
{
printf("*******您输入的指令不正确请重新输入*******\n");
fflush(stdin);//清除缓存区;
continue;//结束本次输入进行下次输入
}
switch(com)
{
case 0:saygoodbye();exit(1);//退出
case 1:add();break;//添加
case 2:outputs();break;//排序
case 3:del1();break;//删除
case 4:find1();break;//查询
case 5:change1();break;//修改
case 6://清屏
system("cls");//系统内自带的清屏函数
break;
case 7:outputs();break;//输出
default:printf("*****************没有该指令,请重新输入*****************\n");
}
}
return 0;
}
头文件 head.h
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#define len1 sizeof(student1)
#define len2 sizeof(student2)
struct student1
{
int no;
char name[30];
char sex;
double score[4];
int position;
struct student1 *next;
};
struct student2
{
int no;
char name[30];
char sex;
double score[4];
int position;
};
typedef struct student1 student1;
typedef struct student2 student2;
extern char *file1;
extern char file2[100];
//添加学生信息.c
void add2(int num,char *file);
void add1(int num);
void add();
//尾插法.c
student1 * aaa(int m);
student1 * aaa2(FILE *fp1);
//outputs.c
void outputs();
//sort.c
void charu(student1 *phead,student1 *pnew);
student1 *zhijiepaixu(FILE *fp);
student1 * paixu();
void paimingci(student1 *phead);
//介绍.c
void introduce();
//HelloGoodbye.c
void sayhello();
void saygoodbye();
//清空链表.c
void freee(student1 *phead);
//find.c
student1 * find2(int n,student1 *phead);
void find1();
//del.c
student1 * del2(int n,student1 *phead);
void del1();
//change.c
void change2(int n,int m,student1 *phead);
void change3(int n,char *pp,student1 *phead);
void change4(int n,char sex1,student1 *phead);
void change1();
void change5(int n,double score1,student1 *phead);
void change6(int n,double score1,student1 *phead);
void change7(int n,double score1,student1 *phead);
void change8(int n,student1 *xinxi,student1 *phead);
#endif // HEAD_H_INCLUDED
页眉页脚 HelloGoodbye.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void sayhello()
{
printf("*****************************************************************************\n");
printf("*******************************欢迎使用本系统*********************************\n");
printf("******************************本系统由****编写********************************\n");
printf("******************************指导教师:**************************************\n");
printf("*****************************************************************************\n");
printf("\n\n\n\n\n");
}
void saygoodbye()
{
printf("\n");
printf("******************************************************************************\n");
printf("*****************(≧ω≦)/****欢迎下次使用!*****(*≧▽≦)**********************\n");
printf("******************************************************************************\n");
}
程序功能介绍函数 introduce.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void introduce()
{
printf("*****************************本系统功能介绍***********************************\n");
printf("*****************************1表示添加学生信息********************************\n");
printf("*****************************2表示对学生成绩进行排序**************************\n");
printf("*****************************3表示删除学生信息********************************\n");
printf("*****************************4表示查询学生信息********************************\n");
printf("*****************************5表示修改学生信息********************************\n");
printf("*****************************6表示清屏****************************************\n");
printf("*****************************7表示输出学生信息********************************\n");
printf("*****************************0表示退出系统************************************\n");
}
添加学生信息 add.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void add2(int num,char *file)
{
int com;
student1 *phead,*p;
FILE *fp;
if((fp=fopen(file,"ab"))==NULL)
{
printf("**************************文件打开失败!!!*************************\n");
exit(1);
}
phead=aaa(num);
p=phead->next;
printf("**************是否添加上述信息?如果是请回复0,否则回复1********************\n");
scanf("%d",&com);
if(com==0)
{
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("********************添加学生信息成功!!****************************\n");
freee(phead);
}
fclose(fp);
}
void add1(int num)
{
int flag;
printf("*************是否添加到默认文件%s中?如果是请回复0,否则回复1*********************\n",file1);
scanf("%d",&flag);
if(flag==0)
{
add2(num,file1);
}
else if(flag==1)
{
printf("*********************请输入要保存的路径,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
scanf("%s",file2);
add2(num,file2);
}
}
void add()
{
printf("********************1表示从键盘添加学生信息******************\n");
printf("********************2表示从文件添加学生信息******************\n");
int com,num,m;
student1 *phead,*p;
char file3[100];
FILE *fp1,*fp2;
scanf("%d",&com);
if(com==1)
{
printf("*********************请输入要添加的学生个数**************************\n");
scanf("%d",&num);
add1(num);
}
else if(com==2)
{
printf("*******************请输入信息来源文件地址,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
scanf("%s",file3);
while((fp1=fopen(file3,"rb"))==NULL)
{
printf("*******************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt******************\n");
scanf("%s",file3);
}
printf("*******************文件打开成功!!********************\n");
printf("*********************请输入要添加文件地址,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
scanf("%s",file2);
while((fp2=fopen(file2,"ab"))==NULL)
{
printf("**********************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
scanf("%s",file2);
}
printf("*********************打开文件成功!!********************\n");
printf("********************请再次确认是否完成信息的插入,如果是请回复0,否则回复1******************\n");
scanf("%d",&m);
if(m==0)
{
phead=aaa2(fp1);
p=phead->next;
while(p->next!=NULL)
{
fwrite(p,len2,1,fp2);
p=p->next;
}
printf("********************添加学生信息成功!!***************************8\n");
freee(phead);
}
fclose(fp1);
fclose(fp2);
}
}
尾插法构建链表 尾插法.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
student1 * aaa(int m)
{
student1 *p;
student1 *phead=(student1 *)malloc(len1);
phead->next=NULL;
p=phead;
int i;
printf("******************请输入学生信息,格式为:学号 姓名 性别 成绩1 成绩2 成绩3********************\n");
for(i=1;i<=m;i++)
{
p->next=(student1 *)malloc(len1);
p=p->next;
scanf("%d %s %c %lf %lf %lf",&p->no,p->name,&p->sex,&p->score[0],&p->score[1],&p->score[2]);
p->score[3]=p->score[0]+p->score[1]+p->score[2];
p->next=NULL;
if(i<m)printf("******************请继续输入学生信息,格式为:学号 姓名 性别 成绩1 成绩2 成绩3*************************\n");
}
return phead;
}
student1 * aaa2(FILE *fp1)
{
rewind(fp1);
student1 *p;
student1 *phead=(student1 *)malloc(len1);
p=(student1 *)malloc(len1);
phead->next=p;
p->next=NULL;
while(fread(p,len2,1,fp1)!=0)//这个循环最后会多出来一个空节点,因为上一次循环内存已经申请了但最后一次未完成赋值。
{
p->next=(student1 *)malloc(len1);
p=p->next;
p->next=NULL;
}
return phead;
}
清空链表 清空链表.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "head.h"
void freee(student1 *phead)
{
student1 *p=phead->next;
student1 *q=p;
while(q!=NULL)
{
q=p->next;
free(p);
p=q;
}
free(phead);
}
输出函数 outputs.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void outputs()
{
student1 *phead;
phead=paixu();
student1 *p=phead->next;
printf("学号 姓名 性别 成绩1 成绩2 成绩3 总成绩 排名\n");
while(p!=NULL)
{
printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
p->score[1],p->score[2],p->score[3],p->position);
p=p->next;
}
freee(phead);
}
排序函数 sort.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void paimingci(student1 *phead)
{
int i=1;
student1 *p;
p=phead->next;
while(p!=NULL)
{
p->position=i;
p=p->next;
i++;
}
}
void charu(student1 *phead,student1 *pnew)
{
student1 *p=phead->next;
student1 *q=phead;
while(p!=NULL)
{
if(p->score[3]<=pnew->score[3])
{
q->next=pnew;
pnew->next=p;
pnew->position;
return;
}
else
{
q=p;
p=p->next;
}
}
q->next=pnew;
return;
}
student1 *zhijiepaixu(FILE *fp)
{
student1 *phead;
phead=(student1 *)malloc(len1);
phead->next=NULL;
student1 *pnew=(student1 *)malloc(len1);
while(fread(pnew,len2,1,fp)!=0)
{
pnew->next=NULL;
charu(phead,pnew);
pnew=(student1 *)malloc(len1);
}
paimingci(phead);
return phead;
}
student1 * paixu()
{
student1 *phead;
FILE *fp;
printf("***************请输入目标文件的地址。形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
scanf("%s",file2);
while((fp=fopen(file2,"rb"))==NULL)
{
printf("********************文件打开失败,请再次确认文件地址再次输入,形如:C:\\Users\\Desktop\\学生信息.txt****************\n");
scanf("%s",file2);
}
printf("***********************文件打开成功!!!*************************\n");
phead=zhijiepaixu(fp);
fclose(fp);
return phead;
}
查询学生信息 find.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
student1 * find2(int n,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
return p;
}
p=p->next;
}
return p;
}
void find1()
{
printf("******************请输入要查找学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
scanf("%s",file2);
student1 *phead,*p;
int no;
FILE *fp1;
while((fp1=fopen(file2,"rb"))==NULL)
{
printf("***********************您输入的文件不正确!!请检查后重新输入!***********************\n");
scanf("%s",file2);
}
printf("***************************文件打开成功!**********************\n");
phead=zhijiepaixu(fp1);
fclose(fp1);
printf("******************请输入要查找学生的学号。********************\n");
scanf("%d",&no);
p=find2(no,phead);
if(p==NULL)
{
printf("**********************未查找到该学生信息!!!请确认后再输入***************************\n");
}
else
{
printf("学号 姓名 性别 成绩1 成绩2 成绩3 总成绩 排名\n");
printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
p->score[1],p->score[2],p->score[3],p->position);
}
freee(phead);
}
删除学生信息函数 del.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
student1 * del2(int n,student1 *phead)
{
student1 *p=phead->next;
student1 *q=phead;
while(p!=NULL)
{
if(p->no==n)
{
q->next=p->next;
free(p);
p=q->next;
}
else
{
q=p;
p=p->next;
}
}
return phead;
}
void del1()
{
printf("***************请输入要删除学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*******************\n");
scanf("%s",file2);
student1 *phead,*p;
int no,flag;
FILE *fp1;
while((fp1=fopen(file2,"rb"))==NULL)
{
printf("*********************您输入的文件不正确!!请检查后重新输入!***********************\n");
scanf("%s",file2);
}
printf("******************文件打开成功!********************\n");
phead=zhijiepaixu(fp1);
fclose(fp1);
printf("**********************请输入要删除学生的学号。**********************\n");
scanf("%d",&no);
p=find2(no,phead);
if(p==NULL)
{
printf("********************未查找到该学生信息!!!请确认后再输入*******************\n");
}
else
{
printf("******************您确定要删除该学生的信息吗??如果是请输入0,否则请输入1。*****************\n");
printf("学号 姓名 性别 成绩1 成绩2 成绩3 总成绩 排名\n");
printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
p->score[1],p->score[2],p->score[3],p->position);
scanf("%d",&flag);
if(flag==1)
{
printf("**********************未删除该学生信息,已结束本次删除服务!*************************\n");
freee(phead);
}
else if(flag==0)
{
phead=del2(no,phead);
fp1=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp1);
p=p->next;
}
printf("**********************删除学生信息成功!!*************************\n");
fclose(fp1);
freee(phead);
}
}
}
修改学生信息函数 change.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "head.h"
void change2(int n,int m,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->no=m;
break;
}
p=p->next;
}
}
void change3(int n,char *pp,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
strcpy(p->name,pp);
break;
}
p=p->next;
}
}
void change4(int n,char sex1,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->sex=sex1;
break;
}
p=p->next;
}
}
void change5(int n,double score1,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->score[0]=score1;
p->score[3]=p->score[0]+p->score[1]+p->score[2];
break;
}
p=p->next;
}
}
void change6(int n,double score1,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->score[1]=score1;
p->score[3]=p->score[0]+p->score[1]+p->score[2];
break;
}
p=p->next;
}
}
void change7(int n,double score1,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->score[2]=score1;
p->score[3]=p->score[0]+p->score[1]+p->score[2];
break;
}
p=p->next;
}
}
void change8(int n,student1 *xinxi,student1 *phead)
{
student1 *p=phead->next;
while(p!=NULL)
{
if(p->no==n)
{
p->no=xinxi->no;strcpy(p->name,xinxi->name);/*字符串不能用等号赋值*/
p->sex=xinxi->sex;p->score[0]=xinxi->score[0];p->score[1]=xinxi->score[1];p->score[2]=xinxi->score[2];
p->score[3]=xinxi->score[3];
break;
}
p=p->next;
}
}
void change1()
{
printf("**********************请输入要更改学生信息的文件来源,形如:C:\\Users\\Desktop\\学生信息.txt*****************\n");
scanf("%s",file2);
student1 *phead,*p;
FILE *fp;
double score1;
student1 *xinxi=(student1 *)malloc(len1);
char name1[30],sex1;
int no,com,no1,flag;
while((fp=fopen(file2,"rb"))==NULL)
{
printf("********************您输入的文件不正确!!请检查后重新输入!***********************\n");
scanf("%s",file2);
}
printf("******************文件打开成功!!!***********************\n");
phead=zhijiepaixu(fp);
fclose(fp);
printf("*********************请输入要更改学生的学号********************\n");
scanf("%d",&no);
p=find2(no,phead);
if(p==NULL)
{
printf("************************未查找到该学生信息!!!请确认后再输入***********************\n");
}
else
{
printf("****************您确定要修改该学生的信息吗??如果是请输入0,否则请输入1。*****************\n");
printf("学号 姓名 性别 成绩1 成绩2 成绩3 总成绩 排名\n");
printf("%-10d %-10s %-8c %-10.2lf %-10.2lf %-10.2lf %-10.2lf %-8d\n",p->no,p->name,p->sex,p->score[0],
p->score[1],p->score[2],p->score[3],p->position);
scanf("%d",&flag);
if(flag==1)
{
printf("**********************未修改该学生信息,已结束本次服务!********************\n");
freee(phead);
}
else if(flag==0)
{
printf("**************************您要修改该学生的哪个信息???******************************\n");
printf("**************************1表示修改该学生的学号***************************************\n");
printf("**************************2表示修改该学生的姓名***************************************\n");
printf("**************************3表示修改该学生的性别***************************************\n");
printf("**************************4表示修改该学生的成绩1**************************************\n");
printf("**************************5表示修改该学生的成绩2**************************************\n");
printf("**************************6表示修改该学生的成绩3**************************************\n");
printf("**************************7表示修改该学生的全部信息***********************************\n");
scanf("%d",&com);
switch(com)
{
case 1:
{
printf("*******************请输入该学生的新学号******************\n");
scanf("%d",&no1);
change2(no,no1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("***********************修改学生信息成功!!***********************\n");
fclose(fp);
freee(phead);
break;
}
case 2:
{
printf("**************************请输入该学生的新姓名***********************\n");
scanf("%s",name1);
change3(no,name1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("***************************修改学生信息成功!!*********************\n");
fclose(fp);
freee(phead);
break;
}
case 3:
{
printf("************************请输入该学生修改后的性别****************************8\n");
fflush(stdin);
//getchar();
scanf("%c",&sex1);//因为上一个数据输入完后会在缓存区存在一个回车,因此当缓存区有内容时该条语句就会直接读取缓冲区的内容;
//所以sex1存的就是一个回车。所以要在此之前用getchar()吞掉,或在此之前用fflush(stdin)清楚缓存区。
change4(no,sex1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("************************修改学生信息成功!!*************************\n");
fclose(fp);
freee(phead);
break;
}
case 4:
{
printf("*************************请重新输入该学生的成绩1***********************\n");
scanf("%lf",&score1);
change5(no,score1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("*********************修改学生信息成功!!************************\n");
fclose(fp);
freee(phead);
break;
}
case 5:
{
printf("***********************请重新输入该学生的成绩2***********************\n");
scanf("%lf",&score1);
change6(no,score1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("***************************修改学生信息成功!!*************************\n");
fclose(fp);
freee(phead);
break;
}
case 6:
{
printf("************************请重新输入该学生的成绩3****************************\n");
scanf("%lf",&score1);
change7(no,score1,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("************************修改学生信息成功!!**************************\n");
fclose(fp);
freee(phead);
break;
}
case 7:
{
printf("***********************请重新输入该学生的全部信息***********************\n");
printf("****************格式为:学号 姓名 性别 成绩1 成绩2 成绩3***********\n");
scanf("%d %s %c %lf %lf %lf",&xinxi->no,xinxi->name,&xinxi->sex,&xinxi->score[0],&xinxi->score[1],
&xinxi->score[2]);
xinxi->score[3]=xinxi->score[0]+xinxi->score[1]+xinxi->score[2];
change8(no,xinxi,phead);
fp=fopen(file2,"wb");
p=phead->next;
while(p!=NULL)
{
fwrite(p,len2,1,fp);
p=p->next;
}
printf("***********************修改学生信息成功!!************************\n");
fclose(fp);
freee(phead);
break;
}
default :printf("**************************您输入有误,没有该操作!!!**********************\n");break;
}
}
}
}