DS链表—学生宿舍管理
时间限制: 1 Sec 内存限制: 128 MB
题目描述
假设某校有20间宿舍,宿舍编号101,102,...,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。
约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。
宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。
备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。
输入
初始宿舍状态,第一行输入n,表示已用宿舍n间
后跟n行数据,每行格式为:宿舍号 学生姓名
操作次数m,后跟m行操作,操作格式如下:
assign 学生 //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍, //按宿舍号升序挂在已用宿舍链表中。
return 宿舍号 //学生退宿舍,删除已用宿舍链表中对应结点, //挂在可用宿舍链表尾部。
display_free //输出可用宿舍链表信息。
display_used //输出已用宿舍链表信息。
输出
display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。
display_used依次输出当前已用宿舍链表中的学生和宿舍号,具体格式见样例。
样例输入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 5 李明 103 张三 106 王五 107 钱伟 112 章立 118 8 assign 李四 assign 赵六 return 118 return 101 assign 马山 display_used assign 林立 display_free |
样例输出
1 2 | 赵六(102)-李明(103)-马山(104)-张三(106)-王五(107)-钱伟(112) 108-109-110-111-113-114-115-116-117-119-120-118-101 |
提示
解决方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | #include <iostream> #include <list> #include <string> #include <algorithm> class Student { public: std::string name; int room; Student(std::string &name, int room) : name(name), room(room) {} }; class DormMgr { public: DormMgr() { for (int i = 101; i <= 120; ++i) { freeDorm.push_back(i); } } void initialize() { std::string name; int room; std::cin >> name >> room; freeDorm.remove(room); usedDorm.push_back(Student(name, room)); } void operate() { std::string operation; std::cin >> operation; if (operation == "assign") { std::string name; std::cin >> name; int room = freeDorm.front(); freeDorm.pop_front(); usedDorm.push_back(Student(name, room)); usedDorm.sort(); } else if (operation == "return") { int room; std::cin >> room; for (std::list<Student>::iterator it = usedDorm.begin(); it != usedDorm.end(); ++it) { if (room == it->room) { usedDorm.erase(it); freeDorm.push_back(room); break; } } } else if (operation == "display_free") { std::cout << freeDorm.front(); for (std::list<int>::iterator it = ++freeDorm.begin(); it != freeDorm.end(); ++it) { std::cout << '-' << *it; } std::cout << std::endl; } else if (operation == "display_used") { std::cout << usedDorm.front().name << '(' << usedDorm.front().room << ')'; for (std::list<Student>::iterator it = ++usedDorm.begin(); it != usedDorm.end(); ++it) { std::cout << '-' << it->name << '(' << it->room << ')'; } std::cout << std::endl; } } private: std::list<int> freeDorm; std::list<Student> usedDorm; }; bool operator<(const Student &lhs, const Student &rhs) { return lhs.room < rhs.room; } int main() { class DormMgr dormMgr; int ctrl; std::cin >> ctrl; while (ctrl--) { dormMgr.initialize(); } std::cin >> ctrl; while (ctrl--) { dormMgr.operate(); } return 0; } |