假设某校有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
#include
#include
using namespace std;
struct room{
string str;
int nums;
bool operator< (const room& f){//重载运算符,方便使用sort
if (f.nums > this->nums){
return true;
}
return false;
}
};
int main(){
listfree;
listused;
for (int i = 101; i <= 120; ++i) free.push_back(i);
int n;
cin >> n;
while (n--){
string str;
int nums;
cin >> str >> nums;
free.remove(nums);//直接使用list自带的remove函数
used.push_back({str,nums});
}
used.sort();
cin >> n;
while (n--){
string s;
cin >> s;
if (s[0] == 'a'){
cin >> s;
used.push_back({s, free.front()});
free.pop_front();
}
else if (s[0] == 'r'){
int nums;
cin >> nums;
for (auto item = used.begin(); item != used.end(); ++item){
if (item->nums == nums){
used.erase(item);
break;
}
}
free.push_back(nums);
}
else if (s == "display_used"){
bool flag = false;
used.sort();
for (auto item = used.begin(); item != used.end(); ++item){
if (!flag){
cout << item->str << "(" << item->nums << ")";
flag = true;
}
else cout << "-" << item->str << "(" << item->nums << ")";
}
cout << endl;
}
else if (s == "display_free"){
bool flag = false;
for (auto item = free.begin(); item != free.end(); ++item){
if (!flag){
cout << *item;
flag = true;
}
else cout << "-" << *item;
}
cout << endl;
}
}
return 0;
}
list是一种序列式容器, list实际上就构成了一个双向循环链,
List类使用的参考代码
包含头文件 : #include
List定义和初始化:
listlst1; //创建空list
list lst2(5); //创建含有5个元素的list
listlst3(3,2); //创建含有3个元素的list
listlst4(lst2); //使用lst2初始化lst4
listlst5(lst2.begin(),lst2.end()); //同lst4
List常用操作函数:
Lst1.assign() 给list赋值
Lst1.back() 返回最后一个元素
Lst1.begin() 返回指向第一个元素的迭代器
Lst1.clear() 删除所有元素
Lst1.empty() 如果list是空的则返回true
Lst1.end() 返回末尾的迭代器
Lst1.erase() 删除一个元素
Lst1.front() 返回第一个元素
Lst1.get_allocator() 返回list的配置器
Lst1.insert() 插入一个元素到list中
Lst1.max_size() 返回list能容纳的最大元素数量
Lst1.merge() 合并两个list
Lst1.pop_back() 删除最后一个元素
Lst1.pop_front() 删除第一个元素
Lst1.push_back() 在list的末尾添加一个元素
Lst1.push_front() 在list的头部添加一个元素
Lst1.rbegin() 返回指向第一个元素的逆向迭代器
Lst1.remove() 从list删除元素
Lst1.remove_if() 按指定条件删除元素
Lst1.rend() 指向list末尾的逆向迭代器
Lst1.resize() 改变list的大小
Lst1.reverse() 把list的元素倒转
Lst1.size() 返回list中的元素个数
Lst1.sort() 给list排序 本题重载了<
Lst1.splice() 合并两个list
Lst1.swap() 交换两个list
Lst1.unique() 删除list中重复的元素