📄 susheguanli.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
char name[20];
char sex[7];
int id;//学号
int room_id;//房号
int bed_id;//床号
struct student *next;
}stu;
//建立链表
stu *Create(stu *h,int n)
{
stu *p=h;
int i;
for(i=0;i<n;i++)
{
stu *s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学生姓名:");
scanf("%s",s->name);
printf("请输入学生性别:");
scanf("%s",s->sex);
while(1)
{
printf("请输入学生学号:");
scanf("%d",&s->id);
if(s->id<=0||s->id>20000)//确定学号范围
printf("输入错误,请重新输入\n");
else
break;
}
while(i!=0) //判断学号是否重复
{
int flag=0;
stu *q=h->next;
while(q)
{
if(s->id==q->id)
{
flag=1;
printf("此学号已存在,请重新输入\n请输入学生学号:");
scanf("%d",&s->id);
break;
}
else
{
q=q->next;
flag=0;
}
}
if(flag==0)
break;
}
while(1)
{
stu *q=h->next;
int count=0;
printf("请输入学生所在房间号:");
scanf("%d",&s->room_id);
if(s->room_id<=0||s->room_id>5000)
printf("输入错误,请重新输入\n");
else //判断房间是否已满
{
while(q)
{
if(s->room_id==q->room_id)
count++;
q=q->next;
}
if(count==4)
printf("此房间已满,请分配其他房间\n");
else break;
}
}
while(1)
{
printf("请输入学生所在床号:");
scanf("%d",&s->bed_id);
if(s->bed_id<=0||s->bed_id>4)
printf("输入错误,请重新输入\n");
else
break;
}
while(i!=0) //判断床位是否已分配
{
int flag=0;
stu *q=h->next;
while(q)
{
if(s->room_id==q->room_id)
{
if(s->bed_id==q->bed_id)
{
flag=1;
printf("此床位已分配,请重新输入\n请输入学生床号:");
scanf("%d",&s->bed_id);
break;
}
else
{
q=q->next;
flag=0;
}
}
else
{
q=q->next;
}
}
if(flag==0)
break;
}
p->next=s;
p=s;
printf("\n");
}
return h;
}
//按学号排序
void Sort_ID(stu *h)
{
stu *p=h;
stu *q=p->next;
stu *r=h->next;
int i,count=0;
while(r)
{
r=r->next;
count++;
}
for(i=0;i<count;i++)
{
while(q->next)
{
if((q->id)>(q->next->id))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
}
else
q=q->next;
p=p->next;
}
p=h;
q=p->next;
}
}
//按姓名排序
void Sort_Name(stu *h)
{
stu *p=h;
stu *q=p->next;
stu *r=h->next;
int i,count=0;
while(r)
{
r=r->next;
count++;
}
for(i=0;i<count;i++)
{
while(q->next)
{
int t=strcmp(q->name,q->next->name);
if(t>0)
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
}
else
q=q->next;
p=p->next;
}
p=h;
q=p->next;
}
}
//按房号排序
void Sort_RoomID(stu *h)
{
stu *p=h;
stu *q=p->next;
stu *r=h->next;
int i,count=0;
while(r)
{
r=r->next;
count++;
}
for(i=0;i<count;i++)
{
while(q->next)
{
if((q->room_id)>(q->next->room_id))
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
}
else
q=q->next;
p=p->next;
}
p=h;
q=p->next;
}
}
//全部显示
void Print(stu *h)
{
stu *p=h->next;
while(p)
{
printf("姓名:%s\n性别:%s\n学号:%d\n房号:%d\n床号:%d\n",p->name,p->sex,p->id,p->room_id,p->bed_id);
printf("\n");
p=p->next;
}
}
//增加
stu *Insert(stu *h)
{
stu *p=h;
stu *q=p->next;
int flag=0;
stu *s=(stu *)malloc(sizeof(stu));
s->next=NULL;
printf("请输入学生姓名:");
scanf("%s",s->name);
printf("请输入学生性别:");
scanf("%s",s->sex);
while(1)
{
printf("请输入学生学号:");
scanf("%d",&s->id);
if(s->id<=0||s->id>20000)//确定学号范围
printf("输入错误,请重新输入\n");
else
break;
}
while(1) //判断学号是否重复
{
int flag=0;
stu *q=h->next;
while(q)
{
if(s->id==q->id)
{
flag=1;
printf("此学号已存在,请重新输入\n请输入学生学号:");
scanf("%d",&s->id);
break;
}
else
{
q=q->next;
flag=0;
}
}
if(flag==0)
break;
}
while(1)
{
stu *q=h->next;
int count=0;
printf("请输入学生所在房间号:");
scanf("%d",&s->room_id);
if(s->room_id<=0||s->room_id>5000)
printf("输入错误,请重新输入\n");
else //判断房间是否已满
{
while(q)
{
if(s->room_id==q->room_id)
count++;
q=q->next;
}
if(count==4)
printf("此房间已满,请分配其他房间\n");
else break;
}
}
while(1)
{
printf("请输入学生所在床号:");
scanf("%d",&s->bed_id);
if(s->bed_id<=0||s->bed_id>4)
printf("输入错误,请重新输入\n");
else
break;
}
while(1) //判断床位是否已分配
{
int flag=0;
stu *q=h->next;
while(q)
{
if(s->room_id==q->room_id)
{
if(s->bed_id==q->bed_id)
{
flag=1;
printf("此床位已分配,请重新输入\n请输入学生床号:");
scanf("%d",&s->bed_id);
break;
}
else
{
q=q->next;
flag=0;
}
}
else
{
q=q->next;
}
}
if(flag==0)
break;
}
while(q)
{
if((q->id)>(s->id))
{
p->next=s;
s->next=q;
flag=1;
break;
}
else
{
p=p->next;
q=p->next;
}
}
if(flag==0)
{
p->next=s;
}
return h;
}
//删除
stu *Delete(stu *h,int d_id)
{
stu *p=h;
stu *q=p->next;
int flag=0;
while(p->next)
{
if(q->id==d_id)
{
p->next=q->next;
free(q);
flag=1;
printf("已删除此学生信息!\n");
}
else
{
p=p->next;
q=p->next;
}
}
if(flag=0)
printf("查无此人!\n");
return h;
}
//修改
void Modify(stu *h,int m_id)
{
stu *p=h;
stu *q=p->next;
int flag=0;
while(q)
{
if(q->id==m_id)
{
printf("请输入学生姓名:");
scanf("%s",q->name);
printf("请输入学生性别:");
scanf("%s",q->sex);
while(1)
{
int id_flag=0;
printf("请输入学生学号:");
scanf("%d",&q->id);
if(q->id<=0||q->id>20000)//确定学号范围
printf("输入错误,请重新输入\n");
else
break;
}
while(1) //判断房间分配是否出现问题
{
stu *r=h->next;
int count=0;
printf("请输入学生所在房间号:");
scanf("%d",&q->room_id);
if(q->room_id<=0||q->room_id>5000)
printf("输入错误,请重新输入\n");
else
{
while(r)
{
if(q->room_id==r->room_id)
count++;
r=r->next;
}
if(count==4)
printf("此房间已满,请分配其他房间\n");
else break;
}
}
while(1)
{
stu *r=h->next;
printf("请输入学生所在床号:");
scanf("%d",&q->bed_id);
if(q->bed_id<=0||q->bed_id>4)
printf("输入错误,请重新输入\n");
else
break;
}
flag=1;
break;
}
else
{
p=p->next;
q=p->next;
}
}
if(flag==0)
printf("查无此人!\n");
}
//按姓名查找
stu *Query_Name(stu *h,char *q_name)
{
stu *p=h->next;
int flag=0;
while(p)
{
int i=strcmp(p->name,q_name);
if(i==0)
{
printf(" 姓名:%s\n 性别:%s\n 学号:%d\n 房号:%d\n 床号:%d\n",p->name,p->sex,p->id,p->room_id,p->bed_id);
flag=1;
break;
}
else
{
p=p->next;
}
}
if(flag==0)
printf("查无此人!\n");
return h;
}
//按学号查找
stu *Query_ID(stu *h,int q_id)
{
stu *p=h->next;
int flag=0;
while(p)
{
if(p->id==q_id)
{
printf(" 姓名:%s\n 性别:%s\n 学号:%d\n 房号:%d\n 床号:%d\n",p->name,p->sex,p->id,p->room_id,p->bed_id);
flag=1;
break;
}
else
{
p=p->next;
}
}
if(flag==0)
printf("查无此人!\n");
return h;
}
//按房号查找
stu *Query_RoomID(stu *h,int q_roomid)
{
stu *p=h->next;
int flag=0;
while(p)
{
if(p->room_id==q_roomid)
{
printf(" 姓名:%s\n 性别:%s\n 学号:%d\n 房号:%d\n 床号:%d\n",p->name,p->sex,p->id,p->room_id,p->bed_id);
printf("\n");
flag=1;
}
p=p->next;
}
if(flag==0)
printf("此房间目前尚未安排人员入住!\n");
return h;
}
//保存
void Save(stu *h)
{
stu *p=h->next;
FILE *fp;
fp=fopen("信息.txt","w+");
while(p)
{
fprintf(fp,"%s %s %d %d %d\n",p->name,p->sex,p->id,p->room_id,p->bed_id);
p=p->next;
}
printf("已成功保存!\n");
fclose(fp);
}
//读取
void Load(stu *h)
{
FILE *fp;
stu *p=h;
if((fp=fopen("信息.txt","r+"))==NULL)
{
printf("找不到文件");
return;
}
while(!feof(fp))
{
stu *q=(stu *)malloc(sizeof(stu));
q->next=NULL;
p->next=q;
fscanf(fp,"%s %s %d %d %d\n",q->name,q->sex,&q->id,&q->room_id,&q->bed_id);
p=q;
}
printf("已成功读取!\n");
fclose(fp);
}
//退出并释放空间
void Quit(stu *h)
{
stu *p,*q;
p=h;
q=p->next;
while(q)
{
p->next=q->next;
free(q);
q=p->next;
}
free(p);
}
//输出菜单
void Display(void)
{
printf("*************************************\n");
printf(" 1 建立链表\n 2 排序\n 3 输出所有信息\n 4 查询信息\n 5 新生入宿\n 6 学生退宿\n 7 修改信息\n 8 保存信息\n 9 读取信息\n 0 退出系统\n");
printf("*************************************\n");
}
void main()
{
stu *head=(stu *)malloc(sizeof(stu));
head->next=NULL;
while(1)
{
Display();
int choice;
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("请输入需要录入的学生人数:");
int n;
scanf("%d",&n);
head=Create(head,n);break;
}//建立
case 2:
{
while(1)
{
printf("*************************************\n");
printf(" 请选择排序方式:\n\n");
printf(" 1.按姓名排序\n 2.按学号排序\n 3.按房号排序\n");
printf("*************************************\n");
int s_choice;
scanf("%d",&s_choice);
switch(s_choice)
{
case 1:
Sort_Name(head);break;
case 2:
Sort_ID(head);break;
case 3:
Sort_RoomID(head);break;
default:
printf("找不到您输入的排序方式,请重新输入\n");break;
}
if(s_choice==1||s_choice==2||s_choice==3)
{
printf("排序完成\n");
break;
}
}
}
case 3:
{
if(head->next==NULL)
printf("空,请先建立链表\n");
else Print(head);
break;
}//显示
case 4:
{
while(1)
{
printf("*************************************\n");
printf(" 请选择查询方式:\n\n");
printf(" 1.按姓名查询\n 2.按学号查询\n 3.按房号查询\n 4.退出查询\n");
printf("*************************************\n");
int q_choice;
scanf("%d",&q_choice);
switch(q_choice)
{
case 1:
{
printf("请输入要查询的学生姓名:");
char q_name[20];
scanf("%s",q_name);
Query_Name(head,q_name);
break;
}
case 2:
{
printf("请输入要查询的学生学号:");
int q_id;
scanf("%d",&q_id);
Query_ID(head,q_id);
break;
}
case 3:
{
printf("请输入要查询的学生房号:");
int q_roomid;
scanf("%d",&q_roomid);
Query_RoomID(head,q_roomid);
break;
}
case 4:
break;
default :
printf("没有您输入的选择,请重新选择\n");break;
}
if(q_choice==4)
break;
}
break;
}//查询
case 5:
Insert(head);break;//增加
case 6:
{
int d_id;
printf("请输入学号");
scanf("%d",&d_id);
Delete(head,d_id);
break;
}//删除
case 7:
{
int m_id;
printf("请输入学号");
scanf("%d",&m_id);
Modify(head,m_id);
break;
}//修改
case 8:
Save(head);break;//保存
case 9:
Load(head);break;//读取
case 0:
Quit(head);break;//退出
default:
printf("输入错误\n");break;
}
if(choice==0)
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -