跳转至

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依次输出当前已用宿舍链表中的学生和宿舍号,具体格式见样例。

样例输入

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 <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;
}

评论