⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 susheguanli.cpp

📁 宿舍管理:实现学生姓名
💻 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 + -