#include
#include
#include
#include
#include
#define MAX 10
using namespace std;
struct Stu
{
char seId[20];
char seName[20];
char cGender[10];
char seCollege[40];
char seMajor[40];
char seClass[40];
char seDrom[20];
};
typedef struct Student
{
struct Stu date;
struct Student *next;
} Student;
struct DORM
{
char dorm[20];
int stuNum;
};
typedef struct Dorm
{
struct DORM date;
struct Dorm *next;
Student *next1;
} Dorm;
struct FlOOR
{
char floor[20];
int DormNum;
};
typedef struct Floor
{
struct FlOOR date;
struct Floor *next;
struct Dorm *next1;
} Floor;
struct BUILD
{
char build[20];
int floorNum;
};
typedef struct Building
{
struct Floor *next1;
struct BUILD date;
} Building;
int SentenceFull(int n);//判满
void LegalInput(char *str,int n);//数字字符串合法输入
void stringInput(char *str,int n);//合法输入
void SexSelection(char *str);//性别选择
void print_Stu(struct Stu F);//输出学生详情
void print_Dorm(Dorm *F);//输出寝室详情
void print_Floor(Floor *F);//输出楼层详情
void print_Build(Building *F);//输出宿舍楼详情
Student *Tofind_stu(Student *F,char id[]);//按学号查找学生
Dorm *Tofind_dorm(Dorm *F,char id[],int n);//按寝室号查找寝室,n>4,嵌套查学生
Floor *Tofind_floor(Floor *F,char id,int n);//按楼层号查找楼层
void Find_Stu(Student *F);//查找 并输出学生详情
void Find_Dorm(Dorm *F);//查找并输出寝室详情
void Find_Floor(Floor *F);//查找并输出楼层详情
void Sort_stu(Student *L);//按学号将学生从小到大排序
void Sort_Dorm(Dorm *L);//按寝室号将寝室从小到大排序
void Sort_Floor(Floor *L);//按楼层号将楼层从小到大排序
void StudentInformation(struct Stu *F,char dorm[]);//录入学生信息
void CreatStudent(Student **F,char dorm[],int n);//创建n个学生
void CreatDorm(Dorm **F,int n);//创建n个寝室
void CreatFloor(Floor **F,int n);//创建n层楼层
void CreatBuild(Building **F,int n);//创建n栋大楼
void modify_stu(Student *F);//修改学生信息
void DeleteStudet(Student **F,char id[]);//按学号删除学生
void Delete_Stu(Student **D);//删除学生,寝室版
int Delete_Dorm(Dorm **L,char dorm[]);//删除寝室
int Delete_Floor(Floor **L,char floor[]);//删除楼层
int DestroyDorm(Student **L);//清空寝室内所有学生,需手动改变学生数量(D->date.stunum)
int DestroyFloor(Dorm **L);//清空楼层所有寝室,需手动改变寝室数量(D->date.dornNum)
int DestroyBuild(Floor **L);//清空大楼
int OperationDorm(Dorm **F);//寝室操作
int OperationFloor(Floor **F);//楼层操作
int OperationBuild(Building **F);//大楼操作
int FileStore(Building *B);//从文件读取
int FileRead(Building **D);//存储链表到文件
//判断选择
int SentenceFull(int n)
{
int x;
scanf("%d",&x);
if(n+x<=MAX&&x>=0)
{
return x;
}
else
{
printf("输入错误,请重新输入n");
SentenceFull(n);
}
}
void stringInput(char *str,int n)//合法输入
{
scanf("%s",str);
getchar();
while(strlen(str)>n)
{
printf("长度超过 %d,重新输入n",n);
scanf("%s",str);
getchar();
}
}
void LegalInput(char *str,int n)//数字字符串合法输入
{
scanf("%s",str);
getchar();
int i=0;
if(strlen(str) { for(int i=0; i { if(str[i]>'9'||str[i]<'0') { printf("输入的字符非数字,请重新输入n"); LegalInput(str,n); } } } if(strlen(str)>n) { printf("长度超过 %d,n); LegalInput(str,n); } } void SexSelection(char *str)//性别选择 { printf("男0,女1 "); int n=0; scanf("%d",&n); if(n==0) strcpy(str,"男"); if(n==1) strcpy(str,"女"); } //输出 void print_Stu(struct Stu F) { printf("----------------------------n"); printf("| |n"); printf("|学号: %s n",F.seId); printf("|名字: %s n",F.seName); printf("|性别: %s n",F.cGender); printf("|寝室: %s n",F.seDrom); printf("|学院: %s n",F.seCollege); printf("|专业: %s n",F.seMajor); printf("|班级: %s n",F.seClass); printf("| |n"); printf("----------------------------n"); } void print_Dorm(Dorm *F) { printf(" 寝室号: %sn",F->date.dorm); Student *p1; p1=F->next1; if(F->date.stuNum==0) printf("寝室为空n"); while(p1!=NULL) { printf("------------------------n"); printf("学号:%s n",p1->date.seId); printf("名字:%s n",p1->date.seName); printf("------------------------n"); p1=p1->next; } } void print_Floor(Floor *F) { printf(" 楼层名:%s n",F->date.floor); Dorm *p1; p1=F->next1; if(F->date.DormNum==0) printf("楼层为空n"); while(p1!=NULL) { printf("---------------------------n"); printf("寝室号:%s n",p1->date.dorm); printf("学生数量:%dn",p1->date.stuNum); printf("---------------------------n"); p1=p1->next; } } void print_Build(Building *F) { printf(" 大楼: %sn",F->date.build); Floor *p1; p1=F->next1; if(F->date.floorNum==0) printf("大楼为空n"); while(p1!=NULL) { printf("----------------------------n"); printf("楼层名:%s n",p1->date.floor); printf("寝室数量:%dn",p1->date.DormNum); printf("----------------------------n"); p1=p1->next; } } //查找 Student *Tofind_stu(Student *F,char id[])//查学生 { Student *p1,*p2=NULL; p1=F; while(p1!=NULL) { if(strcmp(p1->date.seId,id)==0) { p2=p1; break; } if(strcmp(p1->date.seName,id)==0) { p2=p1; break; } else p1=p1->next; } if(p1==NULL) return p1; else { return p2; } } Dorm *Tofind_dorm(Dorm *F,int n) { Dorm *p1,*p2=NULL; p1=F; int flag=0; while(p1!=NULL) { if(n>4) { Tofind_stu(p1->next1,id); } if(strcmp(p1->date.dorm,id)==0) { p2=p1; break; } else p1=p1->next; } if(p1==NULL) return p1; else { return p2; } } Floor *Tofind_floor(Floor *F,int n) { Floor *p1,*p2=NULL; p1=F; int flag=0; while(p1!=NULL) { if(n>3) { Tofind_dorm(p1->next1,id,n); } if(strcmp(p1->date.floor,id)==0) { p2=p1; break; } else p1=p1->next; } if(p1==NULL) return p1; else { return p2; } } //查找加输出 void Find_Stu(Student *F) { Student *p1=NULL; char id[20]; printf("查询学生学号: "); LegalInput(id,20); p1=Tofind_stu(F,id); if(p1==NULL) { printf("该学生不存在n"); printf("----------------------------nn"); } if(p1) { printf("----------------------------n"); printf("| |n"); print_Stu(p1->date); printf("| 修改信息 1 返回 |n"); printf("| |n"); printf("----------------------------nn"); int n; scanf("%d",&n); if(n==1) { modify_stu(p1); } } } void Find_Dorm(Dorm *F) { Dorm *p1=NULL; char id[20]; printf("查询寝室: "); scanf("%s",id); p1=Tofind_dorm(F,4); if(p1==NULL) { printf("该寝室不存在n"); printf("----------------------------nn"); } if(p1) { printf("----------------------------n"); printf("| |n"); print_Dorm(p1); printf("| 操作 1 返回 |n"); printf("| |n"); printf("----------------------------nn"); int n; scanf("%d",&n); if(n==1) { OperationDorm(&p1); } } } void Find_Floor(Floor *F) { Floor *p1=NULL; char id[20]; printf("查询楼层: "); scanf("%s",id); p1=Tofind_floor(F,3); if(p1==NULL) { printf("该楼层不存在n"); printf("----------------------------nn"); } if(p1) { printf("----------------------------n"); printf("| |n"); print_Floor(p1); printf("| 操作 1 返回 |n"); printf("| |n"); printf("----------------------------nn"); int n; scanf("%d",&n); if(n==1) { OperationFloor(&p1); } } } //排序 void Sort_stu(Student *L) { Student *p,*q; Stu temp; for (p=L; p!=NULL; p=p->next) { for(q=p->next; q!=NULL; q=q->next) { if(strcmp(p->date.seId,q->date.seId)<0) { temp=q->date; q->date=p->date; p->date=temp; } } } } void Sort_Dorm(Dorm *L) { Dorm *p,*q; Dorm temp; for (p=L; p!=NULL; p=p->next) { for(q=p->next; q!=NULL; q=q->next) { if(strcmp(p->date.dorm,q->date.dorm)<0) { temp.date=q->date; temp.next1=q->next1; q->date=p->date; q->next1=p->next1; p->date=temp.date; p->next1=temp.next1; } } } } void Sort_Floor(Floor *L) { Floor *p,*q; Floor temp; for (p=L; p!=NULL; p=p->next) { for(q=p->next; q!=NULL; q=q->next) { if(strcmp(p->date.floor,q->date.floor)<0) { temp.date=q->date; temp.next1=q->next1; q->date=p->date; q->next1=p->next1; p->date=temp.date; p->next1=temp.next1; } } } } //创建 void StudentInformation(struct Stu *F,char dorm[])//录入学生信息 { char id[20]; printf("-------------------------------------n"); printf("学号: "); LegalInput(id,20); if(id=="000") F=NULL; else { strcpy((*F).seId,id); printf("名字: "); stringInput( (*F).seName,20); printf("性别: "); SexSelection((*F).cGender); printf("学院: "); stringInput((*F).seCollege,40); printf("专业: "); stringInput((*F).seMajor,40); printf("班级: "); stringInput( (*F).seClass,40); strcpy((*F).seDrom,dorm); printf("n学生%s 信息录入成功n",(*F).seName); printf("-------------------------------------nn"); } } void CreatStudent(Student **F,int n)//插入n个学生 { if(n==0) (*F)=NULL; else { for(int i=0; i { Student *p1=new Student; StudentInformation(&(p1->date),dorm); p1->next = NULL; if(*F) { p1->next=(*F)->next; (*F)->next=p1; } else { *F = p1; } } } } void CreatDorm(Dorm **F,int n)//创建寝室 { if(n==0) (*F)=NULL; else { for(int i=0; i { Dorm *p1; int num; printf("n-------------------------------------n"); printf("寝室号: "); char id[20]; scanf("%s",id); printf("寝室学生人数(<=10): ");//输入寝室人数 scanf("%d",&num); if(num<0) p1=NULL; else { p1=new Dorm; p1->date.stuNum=num; strcpy(p1->date.dorm,id); Student * D = NULL; CreatStudent(&D,num); p1->next1=D; } p1->next=NULL; if(*F) { p1->next=(*F)->next; (*F)->next=p1; } else { *F = p1; } } printf("寝室%s创建成功n",(*F)->date.dorm); printf("-------------------------------------nn"); } } void CreatFloor(Floor **F,int n)//创建楼层 { if(n==0) (*F)=NULL; else { for(int i=0; i { Floor *p1; int num; printf("-------------------------------------nn"); printf("楼层名:"); char floor[20]; scanf("%s",floor); printf("楼层寝室数量:(<=10)");//输入寝室数量 scanf("%d",&num); if(num<0) p1=NULL; else { p1=new Floor; p1->date.DormNum=num; strcpy(p1->date.floor,floor); printf("请输入寝室信息n"); Dorm * D = NULL; CreatDorm(&D,p1->date.DormNum); p1->next1=D; } p1->next=NULL; if(*F!=NULL) { p1->next=(*F)->next; (*F)->next=p1; } else { *F=p1; } } printf("楼层%s创建成功nn",(*F)->date.floor); printf("-------------------------------------nn"); } } void CreatBuild(Building **F) { Building *p1; printf(" 创建宿舍楼n"); printf("-------------------------------------n"); printf("宿舍楼名称: "); char build[20]; scanf("%s",build); int num; printf("楼层数量:(<=10) "); num=SentenceFull(0); if(num<0) p1=NULL; else { p1=new Building; p1->date.floorNum=num; strcpy(p1->date.build,build); printf(" 请输入楼层信息n"); printf("-------------------------------------nn"); Floor * D = NULL; CreatFloor(&D,p1->date.floorNum); p1->next1=D; } *F = p1; } //修改 void modify_stu(Student *F)//学生信息修改 { printf("_____________________________n"); printf("|修改名字 1 "); printf("修改学号 2 n"); printf("|修改性别 3 |"); printf("修改班级 4 n"); printf("|修改学院 5 "); printf("修改专业 6 |n"); printf("_____________________________n"); printf("请输入选择:"); int n; scanf("%d",&n); if(F!=NULL) { if(n==1) { printf("输入修改后学生名字."); char name[20]; stringInput(name,20); memset(F->date.seName,' ',20*sizeof(char)); strcpy(F->date.seName,name); } if(n==2) { printf("输入修改后学生学号 "); char ID[20]; scanf("%s",ID); memset(F->date.seId,20*sizeof(char)); strcpy(F->date.seId,ID); } if(n==3) { printf("输入学生性别"); char Gender[10]; SexSelection(Gender); memset(F->date.cGender,10*sizeof(char)); strcpy(F->date.cGender,Gender); } if(n==4) { printf("输入修改后学生所在班级"); char College[40]; stringInput( College,40); memset(F->date.seCollege,40*sizeof(char)); strcpy(F->date.seCollege,College); } if(n==5) { printf("输入修改后学生所在学院"); char Major[40]; stringInput(Major,40); memset(F->date.seMajor,40*sizeof(char)); strcpy(F->date.seMajor,Major); } if(n==6) { printf("输入修改后学生所在专业 "); char Class[40]; stringInput( Class,40); memset(F->date.seClass,40*sizeof(char)); strcpy(F->date.seClass,Class); } } } //删除 void DeleteStudet(Student **F,char id[])//删除学生 { Student *p=*F; Student *q=NULL; if(strcmp(p->date.seId,id)==0) { *F=p->next; free(p); } else { while(p!=NULL) { q=p; p=p->next; if (p == NULL)//遍历完也没找到 { printf("没有找到要删除的学生n"); } else if(strcmp(p->date.seId,id)==0) { q->next = p->next; delete(p); break; } else { printf("没有找到要删除的学生n"); } } } } void Delete_Stu(Student **D) { char id[20]; printf("-------------------------------------n"); printf("请输入要删除学生的学号n"); LegalInput(id,20); DeleteStudet(D,id); printf("学生%s已删除n",id); printf("-------------------------------------nn"); } int Delete_Dorm(Dorm **L,char dorm[])//删除寝室 { Dorm *p=*L; Dorm *q=NULL; if(strcmp(p->date.dorm,dorm)==0) { *L=p->next; free(p); } else { while(p!=NULL) { q=p; p=p->next; if (p == NULL)//遍历完也没找到 { printf("没有找到要删除的寝室n"); } else if(strcmp(p->date.dorm,dorm)==0) { DestroyDorm(&q->next1); q->next = p->next; delete(p); break; } else { printf("没有找到要删除的寝室n"); } } } } int Delete_Floor(Floor **L,char floor[]) { Floor *p=*L; Floor *q=NULL; if(strcmp(p->date.floor,floor)==0) { *L=p->next; free(p); } else { while(p!=NULL) { q=p; p=p->next; if (p == NULL)//遍历完也没找到 { printf("没有找到要停用的楼层n"); } else if(strcmp(p->date.floor,floor)==0) { DestroyFloor(&q->next1); q->next = p->next; delete(p); break; } else { printf("没有找到要停用的楼层n"); } } } } int DestroyDorm(Student **L)//清空寝室 { Student *q; while(*L) { q=(*L)->next; free(*L); *L=q; } return 1; } int DestroyFloor(Dorm **L)//清空楼层 { Dorm *q; while(*L) { q=(*L)->next; Dorm * D =*L; DestroyDorm(&D->next1); free(*L); *L=q; } return 1; } int DestroyBuild(Floor **L)//清空大楼 { Floor *q; while(*L) { q=(*L)->next; Floor * D =*L; DestroyFloor(&D->next1); free(*L); *L=q; } return 1; } //操作 int OperationDorm(Dorm **F) { Dorm * D = NULL; D=*F; printf("------------------------------------n"); printf("| |n"); printf("| 寝室详情 0 清空寝室 1 |n"); printf("| 添加学生 2 查看学生 3 |n"); printf("| 修改学生 4 删除学生 5 |n"); printf("| 退出 |n"); printf("| |n"); printf("------------------------------------n"); int n; scanf("%d",&n); if(n==0)//寝室详情 { print_Dorm(D); OperationDorm(&D); } if(n==1)//清空寝室 { if(D->date.stuNum>0) { DestroyDorm(&D->next1); D->date.stuNum=0; printf("寝室已清空n"); } else printf("寝室为空n"); OperationDorm(&D); } if(n==2)//添加学生 { if( D->date.stuNum { int x; printf("请输入添加学生数量<=%dn",MAX-D->date.stuNum); x=SentenceFull(D->date.stuNum); CreatStudent(&D->next1,*&(D->date.dorm),x); D->date.stuNum=D->date.stuNum+x; Sort_stu(D->next1); } else printf("寝室已满"); OperationDorm(&D); } if(n==3)//查看学生 { if(D->date.stuNum>0) { Find_Stu(D->next1); Sort_stu(D->next1); } else printf("寝室为空n"); OperationDorm(&D); } if(n==4) { if(D->date.stuNum>0) { Student *p1=NULL; char id[20]; printf("请输入要修改学生的学号n"); LegalInput(id,20); p1=Tofind_stu(D->next1,id); modify_stu(p1); print_Stu(p1->date); Sort_stu(D->next1); } OperationDorm(&D); } if(n==5)//删除学生 { if(D->date.stuNum>0) { Delete_Stu(&D->next1); print_Dorm(D); } OperationDorm(&D); } if(n==6) { return 0; } } int OperationFloor(Floor **F) { Floor* D = NULL; D=*F; printf("------------------------------------n"); printf("| |n"); printf("| 楼层详情 0 清空楼层 1 |n"); printf("| 添加寝室 2 查看寝室 3 |n"); printf("| 寝室操作 4 删除寝室 5 |n"); printf("| 退出 |n"); printf("| |n"); printf("------------------------------------n"); int n; scanf("%d",&n); if(n==0)//楼层详情 { print_Floor(D); OperationFloor(&D); } if(n==1)//清空楼层 { if(D->date.DormNum>0) { DestroyFloor(&D->next1); D->date.DormNum=0; } else printf("寝室为空n"); OperationFloor(&D); } if(n==2)//添加寝室 { if( D->date.DormNum { int x; printf("请输入添加寝室数量<=%dn",MAX-D->date.DormNum); x=SentenceFull(D->date.DormNum); CreatDorm(&D->next1,x); D->date.DormNum=D->date.DormNum+x; Sort_Dorm(D->next1); } else printf("楼层已满"); OperationFloor(&D); } if(n==3)//查看寝室 { if(D->date.DormNum>0) { Find_Dorm(D->next1); } else printf("楼层为空n"); OperationFloor(&D); } if(n==4) { if(D->date.DormNum>0) { printf("请输入要进行操作的寝室号"); Dorm *p1=NULL; char id[20]; LegalInput(id,20); p1=Tofind_dorm(D->next1,4); OperationDorm(&p1); } } if(n==5)//删除寝室 { if(D->date.DormNum>0) { printf("请输入要删除的寝室号"); char id[20]; LegalInput(id,20); Delete_Dorm(&D->next1,id); print_Floor(D); } OperationFloor(&D); } } int OperationBuild(Building **F) { Building* D = NULL; D=*F; printf("------------------------------------n"); printf("| |n"); printf("| 大楼详情 0 清空大楼 1 |n"); printf("| 启用楼层 2 查看楼层 3 |n"); printf("| 楼层操作 4 停用楼层 5 |n"); printf("| 退出 |n"); printf("| |n"); printf("------------------------------------n"); int n; printf("请输入选择: "); scanf("%d",&n); if(n==0)//大楼详情 { print_Build(D); OperationBuild(&D); } if(n==1) { if(D->date.floorNum>0) { DestroyBuild(&D->next1); D->date.floorNum=0; } else printf("大楼为空n"); OperationBuild(&D); } if(n==2)//添加寝室 { if(D->date.floorNum { int x; printf("请输入启用楼层数量<=%dn",MAX-D->date.floorNum); x=SentenceFull(D->date.floorNum); CreatFloor(&D->next1,x); D->date.floorNum=D->date.floorNum+x; Sort_Floor(D->next1); } else printf("无空闲楼层"); OperationBuild(&D); } if(n==3)//查看楼层 { if(D->date.floorNum>0) { Find_Floor(D->next1); } else printf("大楼为空n"); OperationBuild(&D); } if(n==4) { if(D->date.floorNum>0) { printf("请输入要进行操作的楼层名"); Floor *p1=NULL; char id[20]; LegalInput(id,20); p1=Tofind_floor(D->next1,4); OperationFloor(&p1); } OperationBuild(&D); } if(n==5)//删除大楼 { if(D->date.floorNum>0) { printf("请输入要停用的楼层名"); char id[20]; LegalInput(id,20); Delete_Floor(&D->next1,id); D->date.floorNum--; print_Build(D); } OperationBuild(&D); } return 0; } int FileRead(Building **D)//读文件 { FILE *fp,*floor,*dorm,*stu; fp=fopen("Build.txt","rb"); floor=fopen("Floor.txt","rb"); dorm =fopen("dorm.txt","rb"); stu=fopen("student.txt","rb"); if(fp==NULL||floor==NULL||dorm==NULL ||stu==NULL) { printf("打开文件失败!"); return NULL; } Building *H=new Building; fread(&H->date,sizeof(BUILD),1,fp); Floor *p; Floor *q; FlOOR t; Floor* head=new Floor; p=q=head; while( fread(&t,sizeof(FlOOR),floor)==1) { q=new Floor; q->date=t; Dorm *a; Dorm *b; DORM x; Dorm *z=new Dorm; a=z; b=z; for(int r=0; r { fread(&x,sizeof(DORM),dorm); b=new Dorm; b->date=x; Student *m; Student *n=NULL; Stu y; Student* h=new Student; m=n=h; int k; for(k=0; k { fread(&y,sizeof(Stu),stu); n=new Student; n->date=y; m->next=n; m=n; } m->next=NULL; b->next1=h->next; a->next=b; a=b; } a->next=NULL; q->next1=z->next; p->next=q; p=q; } p->next=NULL; H->next1=head->next; fclose(floor); fclose(dorm); fclose(stu); fclose(fp); *D=H; } int FileStore(Building *B)//存文件 { FILE *fp,"wb"); floor=fopen("Floor.txt","wb"); dorm =fopen("dorm.txt","wb"); stu=fopen("student.txt","wb"); if(fp==NULL||floor==NULL||dorm==NULL ||stu==NULL) { printf("打开文件失败!"); return NULL; } fwrite(&B->date,fp); Floor *F=NULL; F=B->next1; for(int i=0; i { fwrite(&F->date,floor); Dorm *D=NULL; D=F->next1; for(int y=0; y { fwrite(&D->date,dorm); 学生* S = NULL; S = D-> NEXT1; for(int k = 0; k { fwrite(&S-> date,sizeof(Stu),1,stu); S = S->下; } D = D-> next; } F = F-> next; } fclose(floor); FCLOSE(宿舍); FCLOSE(STU); FCLOSE(FP); } int main() { Building * F = NULL,* D = NULL; printf(“欢迎进入宿舍管理系统 n”); FILE * fp; char ch; if((fp = fopen(“Build.txt”,“r”))== NULL) { printf(“文件没打开! n”); } ch = fgetc(fp); if(ch == EOF) { printf(“没有相应信息,请创建 n”); 睡眠(1000); 系统( “CLS”); CreatBuild(F); FileStore的(F); FILEREAD(d); OperationBuild(d); FILEREAD(d); } else { FileRead(&D); OperationBuild(d); } FileStore(F); }