DS链表—学生宿舍管理(list实现)

题目描述

假设某校有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

C++实现

#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实际上就构成了一个双向循环链,

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中重复的元素

你可能感兴趣的:(数据结构,算法,链表,list,算法,c++)