<信息系统>
1.要求单链表操作
2.信息在文件中存储
3.增删改查
教师 姓名 性别 年龄 授课
1.要求单链表操作
2.信息在文件中存储
3.增删改查
教师 姓名 性别 年龄 授课
学生 姓名 性别 年龄 班级
校长 姓名 年龄 所管业务 工资
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*========================================结构体和链表结点声明部分======================================*/
struct stu //学生结构
{
char name[20];
char sex[5];
int age;
int class;
};
typedef struct stunode //学生表结点
{
struct stu studata;
struct stunode *next;
}st;
struct tea //教师结构
{
char name[10];
char sex[3];
int age;
char sub[20];
};
typedef struct teanode //教师表结点
{
struct tea teadata;
struct teanode *next;
}tr;
struct master //校长结构
{
char name[20];
int age;
char yewu[30];
float gongzi;
};
typedef struct xznode //校长表结点
{
struct master masterdata;
struct xznode *next;
}xz;
/*=========================================所有后续调用的函数提前声明部分==============================================*/
st *stcreate() //创建学生链表的一个节点
{
st *p;
p = (st*)malloc(sizeof(st));
p->next = NULL;
return p;
}
tr *trcreate() //创建教师链表的一个结点
{
tr *p;
p = (tr*)malloc(sizeof(tr));
p->next = NULL;
return p;
}
xz *xzcreate() //创建校长链表的一个结点
{
xz *p;
p = (xz*)malloc(sizeof(xz));
p->next = NULL;
return p;
}
void openstfile(st *h) //把学生文件中的内容做成一个链表
{
FILE *fp;
struct stu studata;
st *p, *q;
p = h;
if ((fp = fopen("xuesheng.txt", "r+")) == NULL)
printf(" cound not open xuesheng.txt");
else
{
while (fread(&studata,sizeof(studata),1,fp) != 0)//把学生文件里的组数据连成串
{
q = stcreate();//开辟结点空间,装数据
q->studata = studata;//装数据
p->next = q; //把新的数据结点挂在原结点之后
p = q;
}
}
p->next = NULL;//数据全部读完
fclose(fp); //关闭文件
}
void opentrfile(tr *h) //把教师文件中的内容做成一个链表
{
FILE *fp;
struct tea teadata;
tr *p, *pnew;
p = h;
if ((fp = fopen("jiaoshi.txt", "r+")) == NULL)
printf(" cound not open jiaoshi.txt");
else
{
while (fread(&teadata, sizeof(teadata), 1, fp) == 1)//教师文件里的组数据连成串
{
pnew = trcreate();
pnew->teadata = teadata;
p->next = pnew;
p = pnew;
}
}
p->next = NULL;//数据全部读完
fclose(fp); //关闭文件
}
void openxzfile(xz *h) //把校长文件中的内容做成一个链表
{
FILE *fp;
struct master masterdata;
xz *p, *q;
p = h;
if ((fp = fopen("xiaozhang.txt", "r+")) == NULL)
printf(" cound not open xiaozhang.txt");
else
{
while (fread(&masterdata, sizeof(masterdata), 1, fp) == 1)//把校长文件里的组数据连成串
{
q = xzcreate();
q->masterdata = masterdata;
p->next = q;
p = q;
}
}
p->next = NULL;//数据全部读完
fclose(fp); //关闭文件
}
int sysmenu() //系统最初显示菜单界面
{
int num;
char ch;
puts("\t================\n");
puts("\t1.学生信息系统");
puts("\t2.教师信息系统");
puts("\t3.校长信息系统");
puts("\t4.退出系统");
while (scanf("%d", &num) != 1 || num>4|| num<1) //获取整数
{
while (ch = getchar() != '\n');
printf("请输入选择: 1 2 3 4\n");
}
return num;
}
int stmenu() //学生信息子界面
{
int num;
char ch;
printf("\t================\n");
printf("\t1.显示所有学生信息\n");
printf("\t2.增加学生信息\n");
printf("\t3.删除学生信息\n");
printf("\t4.修改学生信息\n");
printf("\t5.查询学生信息\n");
printf("\t6.保存数据并返回主菜单\n");
while (scanf("%d", &num) != 1 || num>6 || num<1) //获取整数
{
while (ch = getchar() != '\n');
printf("请输入选择: 1 2 3 4 5 6\n");
}
return num;
}
int trmenu() //教师信息子界面
{
int num;
char ch;
printf("\t================\n");
printf("\t1.显示所有教师信息\n");
printf("\t2.增加教师信息\n");
printf("\t3.删除教师信息\n");
printf("\t4.修改教师信息\n");
printf("\t5.查询教师信息\n");
printf("\t6.返回主菜单\n");
while (scanf("%d", &num) != 1 || num>6 || num<1) //获取整数
{
while (ch = getchar() != '\n');
printf("请输入选择: 1 2 3 4 5 6\n");
}
return num;
}
int xzmenu() //校长信息子界面
{
int num;
char ch;
printf("\t================\n");
printf("\t1.显示所有校长信息\n");
printf("\t2.增加校长信息\n");
printf("\t3.删除校长信息\n");
printf("\t4.修改校长信息\n");
printf("\t5.查询校长信息\n");
printf("\t6.返回主菜单\n");
while (scanf("%d", &num) != 1 || num>6 || num<1) //获取整数
{
while (ch = getchar() != '\n');
printf("请输入选择: 1 2 3 4 5 6\n");
}
return num;
}
/*----------------------------------------学生功能函数提前声明-----------------------------------------------------*/
void stfilesave(st *h);
void showst(st *h);
void adst(st *h);
void dlst(st *h);
void xgst(st *h);
void fdst(st *h);
/*------------------------------------------教师功能函数提前声明---------------------------------------------------*/
void trfilesave(tr *h);
void showtr(tr *h);
void adtr(tr *h);
void dltr(tr *h);
void xgtr(tr *h);
void fdtr(tr *h);
/*------------------------------------------校长功能函数提前声明----------------------------------------------------*/
void xzfilesave(xz *h);
void showxz(xz *h);
void adxz(xz *h);
void dlxz(xz *h);
void xgxz(xz *h);
void fdxz(xz *h);
/*--------------------------------------------------------------------------------------------*/
void xuesheng();
void jiaoshi();
void xiaozhang();
void mainmenuselect() //主界面系统选择
{
system("cls");
while (1)
{
switch (sysmenu())//登陆主界面操作
{
case 1:xuesheng(); break;
case 2:jiaoshi(); break;
case 3:xiaozhang(); break;
case 4:exit(0);
}
}
}
void stmenuselect() //学生界面系统选择
{
system("cls");
st *h;
h = (st*)malloc(sizeof(st));//开辟一个空的头结点用来后续的操作(读/写文件数据时要注意先写一个结点)
openstfile(h);//打开学生子系统时候读取学生文件中数据
while (1)
{
switch (stmenu())//登陆学生界面操作
{
case 1:showst(h); break;
case 2:adst(h); break;
case 3:dlst(h); break;
case 4:xgst(h); break;
case 5:fdst(h); break;
case 6: {stfilesave(h); mainmenuselect(); }; break;
}
}
}
void trmenuselect() //教师系统功能选择
{
system("cls");
tr *trh;
trh= (tr *)malloc(sizeof(tr));//开辟一个空的头结点用来后续的操作(读/写文件数据时要注意先写一个结点)
opentrfile(trh);//打开教师子系统时候读取教师文件中数据
while (1)
{
switch (trmenu())//登陆教师界面操作
{
case 1:showtr(trh); break;
case 2:adtr(trh); break;
case 3:dltr(trh); break;
case 4:xgtr(trh); break;
case 5:fdtr(trh); break;
case 6: {trfilesave(trh); mainmenuselect(); }; break;
}
}
}
void xzmenuselect() //校长系统功能选择
{
system("cls");
xz *xzh;
xzh = (xz*)malloc(sizeof(xz));//开辟一个空的头结点用来后续的操作(读/写文件数据时要注意先写一个结点)
openxzfile(xzh);//打开校长子系统时候读取校长文件中数据
while (1)
{
switch (xzmenu())//登陆校长界面操作
{
case 1:showxz(xzh); break;
case 2:adxz(xzh); break;
case 3:dlxz(xzh); break;
case 4:xgxz(xzh); break;
case 5:fdxz(xzh); break;
case 6: {xzfilesave(xzh); mainmenuselect(); }; break;
}
}
}
/*==================================学生所需要的文件保存、显示、增删改查功能函数块================================*/
void stfilesave(st *h) //学生信息文件保存,因为操作会可能引起文件里数据变化,所以操作之后都要保存
{
FILE *fp;
st *p, *lead;
lead = h;
p = lead->next;
struct stu studata;
if ((fp = fopen("xuesheng.txt", "r+")) == NULL)
{
printf("存储信息的文件无法打开\n");
}
while (p != NULL)
{
fwrite(&p->studata, sizeof(studata), 1, fp);
p = p->next;
}
fclose(fp);
}
void showst(st *h) //显示学生信息模块
{
printf("\n\t姓名 性别 年龄 班级\n");
st *p,*lead;
lead = h;
p = lead->next;
if (p == NULL)
{
printf("\n文件尚无学生信息\n");
}
while (p!= NULL)
{
printf("\t%s\t%s\t%d\t%d\n", p->studata.name, p->studata.sex, p->studata.age, p->studata.class);
p = p->next;
}
printf("\n输入任意键返回学生系统\n");
getchar();
}
void adst(st *h) //增加学生信息模块
{
st *p, *q;
p= h;
struct stu studata;
char c;
while (p->next != NULL)//一直到达学生链表的末结点,把新的数据挂到末结点后
{ p = p->next;}
do{
printf("请输入姓名:\n");
scanf("%s", &studata.name);
printf("请输入性别:\n");
scanf("%s", &studata.sex);
printf("请输入年龄:\n");
scanf("%d", &studata.age);
printf("请输入班级:\n");
scanf("%d", &studata.class);
q = stcreate();
q->studata = studata;
p->next = q;
p = q;
getchar();//做暂停,等待按一个键继续
printf( "是否继续添加?(y/n)");
c = getchar();
} while (c== 'y' || c== 'Y');
if (c == 'n' || c == 'N')//增加信息结束,回到学生子系统
{
printf("已添加信息,输入任意键返回学生系统");
getchar();
system("cls");
}
}
void dlst(st *h) //删除学生信息模块
{
st *p, *q;
st *lead;
lead = h;
p = lead->next;
char pname[20];
char ch;
while (p != NULL)
{
printf("请输入需要删除的学生姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要删除的学生姓名:");
}
while (p->studata.name != pname && p->next != NULL)
{
q = p; p = p->next;
}
if (strcmp(p->studata.name, pname) == 0)
{
if (p == lead->next)//若是第一个结点,只要把h指向第二个结点
{
h->next = p->next;
}
else
{
q->next = p->next;
}
free(p);
}
else
{
printf("找不到这个学生信息\n");
}
}
printf("\n任意键返回学生子系统\n");//空表返回学生子系统
getchar();
system("cls");
}
void xgst(st *h) //修改学生信息模块
{
st *p;
char pname[20];
char ch;
p = h->next;
while (p != NULL)
{
printf("请输入需要修改学生信息的姓名:");
scanf("%s",&pname);
if (strcmp(p->studata.name, pname) == 0)//这里为什么无法判断相等了???pname==p->studata.name
{
printf("\n请输入需要修改的姓名:");
scanf("%s", &p->studata.name);
printf("\n请输入需要修改的性别:");
scanf("%s", &p->studata.sex);
printf("\n请输入需要修改的年龄:");
scanf("%d", &p->studata.age);
printf("\n请输入需要修改的班级:");
scanf("%d", &p->studata.class);
break;
}
else
//printf("------------");
p = p->next;
}
printf("\n任意键返回学生界面\n");
getchar();
}
void fdst(st *h) //查询学生信息模块
{
st *p;
char pname[20];
char ch;
p = h->next;
printf("请输入需要查询的学生姓名:");
scanf("%s", &pname);
while (p != NULL)
{
if (strcmp(p->studata.name, pname) == 0)
{
printf("姓名:%s; 性别:%s; 年龄:%d; 班级:%d\n ", p->studata.name, p->studata.sex, p->studata.age, p->studata.class);
break;
}
else
p = p->next;
}
printf("\n任意键返回学生子系统");
getchar();
}
/*====================================搭建学生信息系统=========================================================*/
void xuesheng()
{
system("cls");
stmenuselect();
}
/*====================================教师所需要的文件保存、显示、增删改查功能函数块========================*/
void trfilesave(tr *h) //教师信息文件保存,因为操作会可能引起文件里数据变化,所以操作之后都要保存
{
FILE *fp;
tr *p, *lead;
lead = h;
p = lead->next;
struct tea teadata;
//teadata = (struct tea)malloc(sizeof(struct tea));
fp = fopen("jiaoshi.txt", "r+");
if ((fp = fopen("jiaoshi.txt", "r+")) == NULL)
{
printf("存储信息的文件无法打开\n");
}
while (p != NULL)
{
//memset(&teadata,'\0', sizeof(teadata));
fwrite(&p->teadata, sizeof(teadata), 1, fp);
p = p->next;
}
fclose(fp);
}
void showtr(tr *h) //显示教师信息模块
{
printf("\n\t姓名 性别 年龄 科目\n");
tr *p, *lead;
lead = h;
p = lead->next;
if (p == NULL)
{
printf("\n文件尚无教师信息\n");
}
while (p != NULL)
{
printf("\t%s\t%s\t%d\t%s\n", p->teadata.name, p->teadata.sex, p->teadata.age, p->teadata.sub);
p = p->next;
}
printf("\n输入任意键返回教师子系统\n");
getchar();
}
void adtr(tr *h) //增加教师信息模块
{
tr *p, *q;
p = h;
struct tea teadata;
char c;
while (p->next != NULL)//一直到达学生链表的末结点,把新的数据挂到末结点后
{
p = p->next;
}
do {
printf("请输入姓名:\n");
scanf("%s", &teadata.name);
printf("请输入性别:\n");
scanf("%s", &teadata.sex);
printf("请输入年龄:\n");
scanf("%d", &teadata.age);
printf("请输入教授课程:\n");
scanf("%s", &teadata.sub);
q = trcreate();
q->teadata = teadata;
p->next = q;
p = q;
getchar(); //做暂停,等待按一个键继续
printf("是否继续添加?(y/n)");
c = getchar();
} while (c == 'y' || c == 'Y');
if (c == 'n' || c == 'N')//增加信息结束,回到教师子系统
{
printf("\n已添加信息,返回教师系统\n");
getchar();
}
}
void dltr(tr *h) //删除学生信息模块
{
tr *p, *q;
tr *lead;
lead = h;
p = lead->next;
char pname[20];
char ch;
if (h == NULL)
{
printf("这是空表\n");//空表返回学生子系统
system("cls");
system("pause");
stmenuselect();
}
printf("请输入需要删除的教师姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要删除的教师姓名:");
}
while (p->teadata.name != pname && p->next != NULL)
{
q = p; p = p->next;
}
if (strcmp(p->teadata.name, pname) == 0)
{
if (p == h) //若是第一个结点,只要把h指向第二个结点
{
h = p->next;
}
else
{
q->next = p->next;
}
free(p);
}
else
{
printf("找不到这个学生信息\n");
}
printf("\n任意键返回学生子系统\n");//空表返回学生子系统
getchar();
}
void xgtr(tr *h) //修改学生信息模块
{
tr *p;
char pname[20];
char ch;
p = h->next;
while (p != NULL)
{
printf("请输入需要修改教师信息的姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要修改教师信息的姓名:");
}
if (strcmp(p->teadata.name, pname) == 0)
{
printf("\n请输入需要修改的姓名:");
scanf("%s", &p->teadata.name);
printf("\n请输入需要修改的性别:");
scanf("%s", &p->teadata.sex);
printf("\n请输入需要修改的年龄:");
scanf("%d", &p->teadata.age);
printf("\n请输入需要修改的科目:");
scanf("%s", &p->teadata.sub);
break;
}
else
p = p->next;
}
printf("\n任意键返回教师界面\n");
getchar();
}
void fdtr(tr *h) //查询教师信息模块
{
tr *p;
char pname[20];
char ch;
p = h->next;
printf("请输入需要查询的教师姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要查询的教师姓名;");
}
while (p != NULL)
{
if (strcmp(p->teadata.name, pname) == 0)
{
printf("姓名:%s; 性别:%s; 年龄:%d; 科目:%s\n ", p->teadata.name, p->teadata.sex, p->teadata.age, p->teadata.sub);
break;
}
else
p = p->next;
}
printf("\n任意键返回教师子系统\n");
getchar();
system("cls");
}
/*=====================================搭建教师信息系统=======================================================*/
void jiaoshi()
{
system("cls");
trmenuselect();
}
/*====================================校长所需要的文件保存、显示、增删改查功能函数块========================*/
void xzfilesave(xz *h) //学生信息文件保存,因为操作会可能引起文件里数据变化,所以操作之后都要保存
{
FILE *fp;
xz *p, *lead;
lead = h;
p = lead->next;
struct master masterdata;
if ((fp = fopen("xiaozhang.txt", "r+")) == NULL)
{
printf("存储信息的文件无法打开\n");
}
while (p != NULL)
{
fwrite(&p->masterdata, sizeof(masterdata), 1, fp);
p = p->next;
}
fclose(fp);
}
void showxz(xz *h) //显示学生信息模块
{
printf("\n\t姓名 年龄 业务 工资\n");
xz *p, *lead;
lead = h;
p = lead->next;
if (p == NULL)
{
printf("\n文件尚无校长信息\n");
}
while (p != NULL)
{
printf("\t%s\t%d\t%s\t%f\n", p->masterdata.name, p->masterdata.age, p->masterdata.yewu, p->masterdata.gongzi);
p = p->next;
}
printf("\n输入任意键返回学生系统\n");
getchar();
}
void adxz(xz *h) //增加学生信息模块
{
xz *p, *q;
p = h;
struct master masterdata;
char c;
while (p->next != NULL)//一直到达校长链表的末结点,把新的数据挂到末结点后
{
p = p->next;
}
do {
printf("请输入姓名:\n");
scanf("%s", &masterdata.name);
printf("请输入性别:\n");
scanf("%d", &masterdata.age);
printf("请输入业务:\n");
scanf("%s", &masterdata.yewu);
printf("请输入工资:\n");
scanf("%f", &masterdata.gongzi);
q = xzcreate();
q->masterdata = masterdata;
p->next = q;
p = q;
getchar(); //做暂停,等待按一个键继续
printf("是否继续添加?(y/n)");
c = getchar();
} while (c == 'y' || c == 'Y');
if (c == 'n' || c == 'N')//增加信息结束,回到校长子系统
{
printf("已添加信息,输入任意键返回校长系统");
getchar();
}
}
void dlxz(xz *h) //删除学生信息模块
{
xz *p, *q;
xz *lead;
lead = h;
p = lead->next;
char pname[20];
char ch;
while (p != NULL)
{
printf("请输入需要删除的校长姓名:\n");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要删除的校长姓名:");
}
while (p->masterdata.name != pname && p->next != NULL)
{
q = p; p = p->next;
}
if (strcmp(p->masterdata.name, pname) == 0)
{
if (p == h) //若是第一个结点,只要把h指向第二个结点
{
h = p->next;
}
else
{
q->next = p->next;
}
free(p);
}
else
{
printf("找不到这个校长信息\n");
}
printf("\n任意键返回校长子系统\n");//空表返回学生子系统
getchar();
}
}
void xgxz(xz *h) //修改学生信息模块
{
xz *p;
char pname[20];
char ch;
p = h->next;
while (p != NULL)
{
printf("请输入需要修改校长信息的姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要修改校长信息的姓名:");
}
if (strcmp(p->masterdata.name, pname) == 0)
{
printf("\n请输入需要修改的姓名:");
scanf("%s", &p->masterdata.name);
printf("\n请输入需要修改的年龄:");
scanf("%d", &p->masterdata.age);
printf("\n请输入需要修改的业务:");
scanf("%s", &p->masterdata.yewu);
printf("\n请输入需要修改的班级:");
scanf("%f", &p->masterdata.gongzi);
break;
}
else
p = p->next;
}
printf("\n任意键返回校长界面\n");
getchar();
}
void fdxz(xz *h) //查询学生信息模块
{
xz *p;
char pname[20];
char ch;
p = h->next;
printf("请输入需要查询的校长姓名:");
while (scanf("%s", &pname) != 1)
{
while (ch = getchar() != '\n');
printf("请输入需要查询的校长姓名;");
}
while (p != NULL)
{
if (strcmp(p->masterdata.name, pname) == 0)
{
printf("姓名:%s; 年龄:%d; 业务:%s; 工资:%f \n ", p->masterdata.name, p->masterdata.age, p->masterdata.yewu, p->masterdata.gongzi);
break;
}
else
p = p->next;
}
printf("\n任意键返回校长子系统\n");
getchar();
}
/*=====================================搭建校长信息系统=======================================================*/
void xiaozhang()
{
system("cls");
xzmenuselect();
}
/*=============================================================================================================*/
void main()
{
system("cls");
mainmenuselect();
}