• DS链表—学生宿舍管理(双向列表容器List)


    温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。

    目录

    题目描述

    思路分析

    AC代码 


    题目描述

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

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

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

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

    输入

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

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

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

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

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

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

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

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

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

    输出

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

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

    输入样例1

    5
    李明  103
    张三  106
    王五  107
    钱伟  112
    章立  118
    8
    assign 李四
    assign 赵六
    return 118
    return 101
    assign 马山
    display_used
    assign 林立
    display_free

    输出样例1

    赵六(102)-李明(103)-马山(104)-张三(106)-王五(107)-钱伟(112)
    108-109-110-111-113-114-115-116-117-119-120-118-101

    思路分析

    C++的STL我也会一些,但里面的list从未用过,只会用set、vector、map之类的,主要是我觉得list不好用,但现在必须现学现用了。

    先讲解决思路,用两个结构体链表操作,一个used存用过的,一个access存可用的,一上来先给access编上号,然后已用的就插入used,并从access里面删掉,这里必须要注意,删完一定要break出来,否则会运行异常。

    分配宿舍就插入used,access弹掉前面的,退宿舍就删uesd,插入access,记得删完一定要break。

    排序直接调用list自己的排序函数,不过要自己写排序规则函数,用算法库里面的sort会报错的。

    AC代码 

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. struct dorm {
    4. string student;
    5. int ID;
    6. };
    7. bool compare(dorm&a, dorm&b) {
    8. return a.ID < b.ID;
    9. }
    10. int main() {
    11. list<dorm>used, access;
    12. for (int i = 101; i <= 120; i++) {
    13. dorm temp;
    14. temp.ID = i;
    15. access.push_back(temp);
    16. }
    17. int n, m;
    18. cin >> n;
    19. while (n--) {
    20. dorm temp;
    21. cin >> temp.student >> temp.ID;
    22. used.push_back(temp);
    23. for (list<dorm>::iterator it = access.begin(); it != access.end(); it++) {
    24. if ((*it).ID == temp.ID) {
    25. access.erase(it);
    26. break;
    27. }
    28. }
    29. }
    30. cin >> m;
    31. while (m--) {
    32. string action;
    33. dorm temp;
    34. cin >> action;
    35. if (action == "assign") {
    36. cin >> temp.student;
    37. temp.ID = access.front().ID;
    38. access.pop_front();
    39. used.push_back(temp);
    40. } else if (action == "return") {
    41. cin >> temp.ID;
    42. access.push_back(temp);
    43. for (list<dorm>::iterator it = used.begin(); it != used.end(); it++)
    44. if ((*it).ID == temp.ID){
    45. used.erase(it);
    46. break;
    47. }
    48. } else if (action == "display_free") {
    49. int i = 1;
    50. for (auto&it : access) {
    51. if (i++ < access.size())
    52. cout << it.ID << '-';
    53. else cout << it.ID << endl;
    54. }
    55. } else {
    56. int i = 1;
    57. for (auto&it : used) {
    58. if (i++ < used.size())
    59. cout << it.student << '(' << it.ID << ')' << '-';
    60. else cout << it.student << '(' << it.ID << ')' << endl;
    61. }
    62. }
    63. used.sort(compare);
    64. }
    65. return 0;
    66. }
  • 相关阅读:
    论文阅读《Nougat:Neural Optical Understanding for Academic Documents》
    解决分布式锁bug,shiro-01
    Java集合详解
    DL2:A Deep Learning-Driven Scheduler for Deep Learning Clusters 阅读思考+组会
    2022江西省·振兴杯·数字经济职业技能竞赛&中国工业互联网安全大赛·江西选拔赛初赛wp
    PHP去除字符串前或后的字符或空格
    GitLab 卸载步骤 - 完全卸载
    WebRTC系列--track的set_enabled详解
    uniapp vue2 首页生命周期函数等待app.vue加载完毕后执行
    Rhodamine/Cy3/Cy3.5/Cy5/FITC荧光素标记羧甲基纤维素CMC/羧甲基壳聚糖/羧甲基凝胶多糖
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/127093040