题目描述
假设某校有20间宿舍,宿舍编号101,102,…,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。
宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。
备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。
输入
初始宿舍状态,第一行输入n,表示已用宿舍n间后跟n行数据,每行格式为:宿舍号 学生姓名
操作次数m,后跟m行操作,操作格式如下:
assign 学生 //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍,
//按宿舍号升序挂在已用宿舍链表中。return 宿舍号 //学生退宿舍,删除已用宿舍链表中对应结点,
//挂在可用宿舍链表尾部。display_free //输出可用宿舍链表信息。
display_used //输出已用宿舍链表信息。
输出
display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。display_used依次输出当前已用宿舍链表中的学生和宿舍号,具体格式见样例。
样例输入
5
李明 103
张三 106
王五 107
钱伟 112
章立 118
8
assign 李四
assign 赵六
return 118
return 101
assign 马山
display_used
assign 林立
display_free
样例输出
赵六(102)-李明(103)-马山(104)-张三(106)-王五(107)-钱伟(112)
108-109-110-111-113-114-115-116-117-119-120-118-101
#include<iostream>
#include<list>
#include<vector>
using namespace std;
const int maxx= 50;
string str[maxx];
list<int> l1;
list<int> l2;
void ass(string s){//安排学生
list<int>::iterator it= l2.begin();
// cout<<*it;
str[*it- 100]= s;
l1.push_back(*it);
l2.pop_front();
}
void ret(int i){//归还宿舍
list<int>::iterator it= l1.begin();
while(it!= l1.end()){
if(*it== i)
break;
it++;
}
l2.push_back(*it);
l1.erase(it);
}
void used(){//输出已用的宿舍号
l1.sort();
list<int>::iterator it= l1.begin();
while(it!= l1.end()){
cout<<str[*it- 100]<<'('<<*it<<')';
it++;
if(it!= l1.end())
cout<<'-';
}
cout<<endl;
}
void fre(){//输出可使用的宿舍号
list<int>::iterator it= l2.begin();
while(it!= l2.end()){
cout<<*it;
it++;
if(it!= l2.end())
cout<<'-';
}
}
int main(){
vector<int> vec(25, 0);
int n;
int j;
string s;
cin>>n;
for(int i= 0; i< n; i++){
cin>>s;
cin>>j;
str[j- 100]= s;
l1.push_back(j);
vec[j- 100]= 1;
}
for(int i= 1; i<= 20; i++){//记录可使用的宿舍号
if(!vec[i]){
l2.push_back(i+ 100);
}
}
int m;
cin>>m;
while(m--){
string s;
cin>>s;
if(s== "assign"){
string name;
cin>>name;
ass(name);
//cout<<'a';
}
else if(s== "return"){
int shu;
cin>>shu;
ret(shu);
}
else if(s== "display_used"){
used();
}
else{
fre();
}
}
return 0;
}