前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DS链表—学生宿舍管理(双向列表容器List)

DS链表—学生宿舍管理(双向列表容器List)

作者头像
叶茂林
发布2023-07-30 11:27:43
1850
发布2023-07-30 11:27:43
举报
文章被收录于专栏:叶子的开发者社区

温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

题目描述

假设某校有20间宿舍,宿舍编号101,102,...,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。

约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。

宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。

备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。

输入

初始宿舍状态,第一行输入n,表示已用宿舍n间

后跟n行数据,每行格式为:学生姓名 宿舍号 

操作次数m,后跟m行操作,操作格式如下:

assign 学生  //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍,

//按宿舍号升序挂在已用宿舍链表中。

return  宿舍号   //学生退宿舍,删除已用宿舍链表中对应结点,

//挂在可用宿舍链表尾部。

display_free   //输出可用宿舍链表信息。

display_used   //输出已用宿舍链表信息。

输出

display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。

display_used依次输出当前已用宿舍链表中的宿舍号,具体格式见样例。

输入样例1

5 李明  103 张三  106 王五  107 钱伟  112 章立  118 8 assign 李四 assign 赵六 return 118 return 101 assign 马山 display_used assign 林立 display_free

输出样例1

赵六(102)-李明(103)-马山(104)-张三(106)-王五(107)-钱伟(112) 108-109-110-111-113-114-115-116-117-119-120-118-101

思路分析

C++的STL我也会一些,但里面的list从未用过,只会用set、vector、map之类的,主要是我觉得list不好用,但现在必须现学现用了。

先讲解决思路,用两个结构体链表操作,一个used存用过的,一个access存可用的,一上来先给access编上号,然后已用的就插入used,并从access里面删掉,这里必须要注意,删完一定要break出来,否则会运行异常。

分配宿舍就插入used,access弹掉前面的,退宿舍就删uesd,插入access,记得删完一定要break。

排序直接调用list自己的排序函数,不过要自己写排序规则函数,用算法库里面的sort会报错的。

AC代码 

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;
struct dorm {
	string student;
	int ID;
};
bool compare(dorm&a, dorm&b) {
	return a.ID < b.ID;
}
int main() {
	list<dorm>used, access;
	for (int i = 101; i <= 120; i++) {
		dorm temp;
		temp.ID = i;
		access.push_back(temp);
	}
	int n, m;
	cin >> n;
	while (n--) {
		dorm temp;
		cin >> temp.student >> temp.ID;
		used.push_back(temp);
		for (list<dorm>::iterator it = access.begin(); it != access.end(); it++) {
			if ((*it).ID == temp.ID) {
				access.erase(it);
				break;
			}
		}
	}
	cin >> m;
	while (m--) {
		string action;
		dorm temp;
		cin >> action;
		if (action == "assign") {
			cin >> temp.student;
			temp.ID = access.front().ID;
			access.pop_front();
			used.push_back(temp);
		} else if (action == "return") {
			cin >> temp.ID;
			access.push_back(temp);
			for (list<dorm>::iterator it = used.begin(); it != used.end(); it++)
				if ((*it).ID == temp.ID){
					used.erase(it);
					break;
				}				
		} else if (action == "display_free") {
			int i = 1;
			for (auto&it : access) {
				if (i++ < access.size())
					cout << it.ID << '-';
				else cout << it.ID << endl;
			}
		} else {
			int i = 1;
			for (auto&it : used) {
				if (i++ < used.size())
					cout << it.student << '(' << it.ID << ')' << '-';
				else cout << it.student << '(' << it.ID << ')' << endl;
			}
		}
		used.sort(compare);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路分析
  • AC代码 
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档