D. 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

提示

list是一种序列式容器, list实际上就构成了一个双向循环链,

List类使用的参考代码

包含头文件<列表> : #include <列表>

List定义和初始化:

list<int>lst1;创建空列表

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();

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

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

end() 返回末尾的迭代器

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

rend() 指向列表末尾的逆向迭代器

程序示列:

#include <iostream>

使用命名空间标准;

typedef list<int> listint;

空主()

{

用LISTINT创建一个list对象

LISTINT listOne;

声明i为迭代器

LISTINT::迭代器 i;

listOne.push_front(3);

listOne.push_front(2);

listOne.push_front(1);

listOne.push_back(4);

listOne.push_back(5);

listOne.push_back(6);

cout << “listOne.begin()--- listOne.end():” << endl;

for (i = listOne.begin(); i != listOne.end(); ++i)

cout << *i << “ ”;

库特<<恩德尔;正向输出

列表::reverse_iterator IR;

cout << “listOne.rbegin()---listOne.rend():” << endl;

for (ir = listOne.rbegin(); ir != listOne.rend(); ir++) {

cout << *ir << “ ”;

}

库特<<恩德尔;反向输出

}

这个提示我看不懂,后来看懂了一些但是也没按照它的来写,用了别的方法,也参考了网上的思路,这道题还是有点难的。

#include<iostream>
using namespace std;

class Node{
    public:
        int data;
        string name;
        Node *next;
        Node(){
            next=NULL;
        }
};

class LinkList{
    public:
        int len;
        Node *head;
        LinkList();
        ~LinkList();
        Node *L_index(int i);
        int L_get(int i);
        string get(int i);
        void insert(int i,string name,int item);
        void del(int i);
        void push_back(int data,string name);
        void used_display();
        void free_display();
};

LinkList::LinkList(){
    head=new Node();
    len=0;
}

LinkList::~LinkList(){
    Node *p=head,*q;
    while(p){
        q=p;
        p=p->next;
        delete p;
    }
}

Node *LinkList::L_index(int i){
    Node *p=head;
    for(int j=1;j<=i;j++){
        p=p->next;
    }
    return p;
}
    
int  LinkList::L_get(int i){
    return L_index(i)->data;
}

string LinkList::get(int i){
    return L_index(i)->name;
}

void LinkList::insert(int i,string name,int item){
    Node *p,*q;
    p=L_index(i-1);
    q=new Node();
    q->name=name;
    q->data=item;
    q->next=p->next;
    p->next=q;
    len++;
}

void LinkList::del(int i){
    Node *p=L_index(i-1),*q=L_index(i);
    p->next=q->next;
    q=NULL;
    delete q;
    len--;
}

void LinkList::push_back(int data,string name){
    Node *p,*q;
    p=L_index(len);
    q=new Node();
    p->next=q;
    q->data=data;
    q->name=name;
    len++;
}

void LinkList::used_display(){
    Node *p=head->next;
    while(p){
        cout<<p->name<<"("<<p->data<<")";
        if(p->next!=NULL){
            cout<<"-";
        }
        p=p->next;
    }
    cout<<endl;
}

void LinkList::free_display(){
    Node *p=head->next;
    while(p){
        cout<<p->data;
        if(p->next!=NULL){
            cout<<"-";
        }
        p=p->next;
    }
    cout<<endl;
}

int main(){
    int n1,n2;
    cin>>n1;
    string name;
    int data;
    LinkList free,used;
    for(int i=101;i<=120;i++){
        free.push_back(i,"0");
    }
    for(int i=1;i<=n1;i++){
        cin>>name>>data;
        used.push_back(data,name);
        for(int j=1;j<=free.len;j++){
        if(free.L_get(j)==data){
            free.del(j);
            break;
            }
        }
    }
    cin>>n2;
    string operation;
    int count=0;
    while(n2--){
        cin>>operation;
        if(operation=="assign"){
            cin>>name;
            for(int i=1;i<=used.len;i++){
                if(used.L_get(i)>free.L_get(1)){
                    count=i;
                    break;
                }
            }
            used.insert(count,name,free.L_get(1));
            free.del(1);
        }else if(operation=="return"){
            cin>>data;
            for(int i=1;i<=used.len;i++){
                if(used.L_get(i)==data){
                    free.push_back(data,used.get(i));
                        used.del(i);
                }
            }
        }else if(operation=="display_used"){
            used.used_display();
        }else{
            free.free_display();
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值