【3分】O. DS链表—学生宿舍管理(双向列表容器List)

时间限制1s

内存限制128MB

题目描述

假设某校有20间宿舍,宿舍编号101,102,...,120。每间只住一名学生。初始部分宿舍已用。用两个链表(已用宿舍链表和可用宿舍链表)维护宿舍的管理,实现宿舍分配、宿舍交回。

约定已用宿舍链表按宿舍号升序链接。初始可用宿舍链表也按宿舍号升序链接。

宿舍分配从可用宿舍链表中摘取第一间宿舍分配给学生。学生交回的宿舍挂在可用宿舍链表最后。

备注:使用list容器或静态链表。不用考虑宿舍分配和交回不成功的情况。

输入

初始宿舍状态,第一行输入n,表示已用宿舍n间

后跟n行数据,每行格式为:学生姓名 宿舍号 

操作次数m,后跟m行操作,操作格式如下:

assign 学生  //为学生分配宿舍,从可用宿舍链表头摘取一间宿舍,

//按宿舍号升序挂在已用宿舍链表中。

return  宿舍号   //学生退宿舍,删除已用宿舍链表中对应结点,

//挂在可用宿舍链表尾部。

display_free   //输出可用宿舍链表信息。

display_used   //输出已用宿舍链表信息。

输出

display_free依次输出当前可用宿舍链表中的宿舍号,具体格式见样例。

display_used依次输出当前已用宿舍链表中的宿舍号,具体格式见样例。

#include <iostream>
#include <list>
using namespace std;
struct room{
    string name;
    int stu_num;
};

bool operator< (const room& r1,const room& r2){//重载运算符,方便使用sort
    if (r1.stu_num < r2.stu_num){
        return true;
    }
    return false;
}
typedef list<room> LISTINT;
int main() {
    LISTINT used_room;
    LISTINT empty_room;
    int t;cin>>t;int room[t],no_room[20]={0};
    for (int i = 0; i < t; ++i) {
        string name;int stu_num;
        cin>>name>>stu_num;
        room[i]=stu_num;
        used_room.push_back({name,stu_num});
    }
    for (int i = 101; i <= 120; ++i) {
        int flag=0;
        for (int j = 0; j < t; ++j) {
            if(room[j]==i) flag=1;
        }
        if(flag==0)
            empty_room.push_back({"",i});
    }
    int n;cin>>n;
    while(n--){
        string control;cin>>control;
        if(control=="assign"){
            string name;cin>>name;
            int roomnum=empty_room.front().stu_num;
            empty_room.pop_front();
            used_room.push_front({name,roomnum});
        }
        else if(control=="return"){
            int num;cin>>num;
            for(auto it=used_room.begin();it!=used_room.end();it++){
                if(it->stu_num==num){
                    used_room.erase(it);
                    break;
                }
            }
            empty_room.push_back({"",num});
        }
        else if(control=="display_used"){
            LISTINT ::iterator it;
            used_room.sort();
            for( it = used_room.begin(); it !=used_room.end() ; it++) {
                if(it!=used_room.begin())cout<<"-";
                cout<<it->name<<"("<<it->stu_num<<")";
            }
            cout<<endl;
        }
        else if(control=="display_free"){
            LISTINT ::iterator it;
            for( it = empty_room.begin(); it !=empty_room.end() ; it++) {
                if(it!=empty_room.begin())cout<<"-";
                cout<<it->stu_num;
            }
            cout<<endl;
        }


    }

}

list使用

包含头文件<list>  :  #include <list>

List定义和初始化:

list<int>lst1;          //创建空list

list<int> lst2(5);       //创建含有5个元素的list

list<int>lst3(3,2);  //创建含有3个元素的list

list<int>lst4(lst2);    //使用lst2初始化lst4

list<int>lst5(lst2.begin(),lst2.end());  //同lst4

创建一个list对象l(注意list是模板类):list<char>  l; //堆栈的数据类型是字符型

把一个字符ct添加到链表末尾: s.push_back(ct);

把一个字符ct插入到链表头部: s.push_front(ct);

获取链表第一个元素和最后一个元素:front()和back(),获取链表第一个元素,放入变量c2: c2 = s.front();

删除链表第一个元素和最后一个元素pop_front()和pop_back();

删除某一个节点

list::iterator it; (listname).erase(it)

判断 判断list是否为空:empty(): l.empty(),如果为空则函数返回true,如果不空则返回false

begin() 返回指向第一个元素的迭代器

end() 返回末尾的迭代器

rbegin() 返回指向第一个元素的逆向迭代器

rend() 指向list末尾的逆向迭代器

.sort()给list链表排序

可以通过operator< 重定义sort函数,达到自己自定义排序方式的做法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值