DS链表-学生宿舍管理

题目描述
假设某校有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<vector>
using namespace std;
const int maxx= 50;
string str[maxx];
list<int> l1;
list<int> l2;
void ass(string s){//安排学生
    list<int>::iterator it= l2.begin();
//  cout<<*it;
    str[*it- 100]= s;
    l1.push_back(*it);
    l2.pop_front();



}
void ret(int i){//归还宿舍
    list<int>::iterator it= l1.begin();
    while(it!= l1.end()){
        if(*it== i)
         break;
         it++;
    }
    l2.push_back(*it);
    l1.erase(it);

}
void used(){//输出已用的宿舍号
    l1.sort(); 
    list<int>::iterator it= l1.begin();
    while(it!= l1.end()){
        cout<<str[*it- 100]<<'('<<*it<<')';
        it++;
        if(it!= l1.end())
         cout<<'-';
    }
    cout<<endl;
}
void fre(){//输出可使用的宿舍号
    list<int>::iterator it= l2.begin();
    while(it!= l2.end()){
        cout<<*it;
        it++;
        if(it!= l2.end())
         cout<<'-';
    }
}
int main(){


    vector<int> vec(25, 0);
    int n;
    int j;
    string s;
    cin>>n;
    for(int i= 0; i< n; i++){
        cin>>s;
        cin>>j;

        str[j- 100]= s;
        l1.push_back(j);
        vec[j- 100]= 1;

    } 

    for(int i= 1; i<= 20; i++){//记录可使用的宿舍号
        if(!vec[i]){
            l2.push_back(i+ 100);
        }
    }

    int m;
    cin>>m;
    while(m--){
        string s;
        cin>>s;
        if(s== "assign"){
            string name;
            cin>>name;
            ass(name);
            //cout<<'a';
        }
        else if(s== "return"){
            int shu;
            cin>>shu;
            ret(shu);
        }
        else if(s== "display_used"){
            used();
        }
        else{
            fre();
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/82663785