BUAA数据结构期中考试题——空闲空间申请模拟

  • 看前须知
  • 题目内容
    • 问题描述
    • 输入形式
    • 输出形式
    • 样例
    • 样例说明
  • 题解
    • 笔者的抱怨和思路详解
    • 参考代码
    • 补充测试的数据

看前须知

要点介绍和简要声明.

题目内容

问题描述

在操作系统中,空闲存储空间通常以空闲块链表方式组织,每个块包含块起始位置、块长度及一个指向下一块的指针。空闲块按照存储位置升序组织,最后一块指向第一块(构成循环链表)。当有空间申请请求时,按照如下原则在空闲块循环链表中寻找并分配合适的空间:

  1. 从当前位置开始遍历空闲块链表(初始时从地址最小的第一个空闲块开始),寻找第一个大于等于请求空间的空闲块(即首次适应原则);
  2. 如果选择的空闲块恰好与请求的大小相符合,则将它从链表中移除并返回给用户;这时当前位置变为被移除的空闲块指向的下一空闲块
  3. 如果选择的空闲块大于所申请的空间大小,则将大小合适的空闲块返回给用户,剩下的部分留在空闲块链表中;这时当前位置仍然为该空闲块;
  4. 如果找不到足够大的空闲块,则申请失败;这时当前位置不变
    例如:下图示例给出了空闲块链表的初始状态,每个结点表示一个空闲块,结点中上面的数字指空闲块的起始位置,下面的数字指空闲块的长度,位置和长度都用正整数表示,大小不超过int表示范围。当前位置为最小地址为1024的空闲块。

例如:下图示例给出了空闲块链表的初始状态,每个结点表示一个空闲块,结点中上面的数字指空闲块的起始位置,下面的数字指空闲块的长度,位置和长度都用正整数表示,大小不超过int表示范围。当前位置为最小地址为1024的空闲块。


若有4个申请空间请求,申请的空间大小依次为:1024、2560、10240和512。则从当前位置开始遍历上图的链表,按照上述原则寻找到满足条件的空闲块为地址是16384的空闲块,其长度正好为1024,所以将其从链表中删除,这时链表状态如下图所示,当前位置变成地址为32768的空闲块。


从当前位置开始为第二个空间请求(大小为2560)遍历链表,按照上述原则寻找到满足条件的空闲块为当前位置的空闲块,其长度为3072,大于请求的空间大小,于是申请空间后该空闲块剩余的长度为512,当前位置不变,链表状态如下图所示:


从当前位置开始为第三个空间请求(大小为10240)遍历链表,遍历一圈后发现找不到足够大的空闲块,则忽略该请求,当前位置不变。下面继续为第四个空间请求(大小为512)遍历链表,按照上述原则寻找到满足条件的空闲块仍然为当前位置的空闲块,其长度等于请求的空间大小,于是将该空闲块删除后,链表状态变为下图所示:


编写程序,模拟上述空闲空间申请。

输入形式

先从控制台读入一正整数,表示当前空闲块的个数(大于0且小于等于100)。
然后按照起始位置由小到大的顺序分行输入每个空闲块的起始位置和长度,位置和长度都用正整数表示,大小不超过int表示范围,两整数间以一个空格分隔。
最后在新的一行上依次输入申请空间的大小,以-1表示结束,各整数间以一个空格分隔,申请请求的个数不超过100个。

输出形式

按照上述原则模拟完空闲空间申请后,输出当前空闲空间链表状态,即从当前位置开始,遍历链表,分行输出剩余空闲块的长度和起始位置,长度和起始位置间以一个空格分隔。若申请完后,链表中没有空闲块,则什么都不输出

样例

【样例输入】

12
1024 512
8192 512
16384 1024
32768 3072
65536 8192
77824 1024
80896 8192
96016 1024
101136 5120
119328 512
134448 1024
142640 3072
1024 2560 10240 512 2048 6400 2560 5600 2000 -1

【样例输出】
560 101136
512 119328
1024 134448
3072 142640
512 1024
512 8192
544 65536
1024 77824
1792 80896
1024 96016

样例说明

样例输入了12个空闲块的信息,形成了如上述第一个图所示的空闲块链表;然后读取了9个空间申请请求,为前4个申请请求分配空间后,空闲块链表状态为上述最后一张图所示。满足第五个请求后,地址为65536的空闲块剩余长度为6144;满足第六个请求后,地址为80896的空闲块剩余长度为1792;满足第七个请求后,地址为101136的空闲块剩余长度为2560;满足第八个请求后,地址为65536的空闲块剩余长度为544;满足第九个请求后,地址为101136的空闲块剩余长度为560,这时链表中剩余10个空闲块,当前位置为地址是101136的空闲块,从该空闲块开始依次遍历输出所有剩余空闲块的长度和起始位置。

题解

笔者的抱怨和思路详解

一开始搞那么多图,是在吓唬人吗,请问?

这道题相比于当时的文件加密(环)而言就是简单到不能再简单了,即使如此,也有许多需要注意的地方;

  1. 是从广义头节点开始寻找的(不是一开始的头节点,每输入一个数头节点都会发生变化)
  2. 如果是恰好相等,移除节点,此时广义头节点指向被移除的节点的的下一个节点
  3. 如果大于,广义头节点还是指向被减的节点
  4. 如果找了一圈没找到,那广义头节点不动
  5. 删除操作一定需要一个跟踪指针,不然删除操作有点困难
  6. 删除广义头节点和删除一般节点的操作不一样

参考代码

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdbool.h>
#define M 1000000
struct node{int ad;     //地址 int data;  //存储空间 struct node *next;
};
typedef struct node Node;
typedef struct node *Nodep;
Nodep head=NULL,p,t,q,o;
int n,i,j,ad,data,a;
int main()
{   scanf("%d",&n);while(n--)     //创建循环链表 {scanf("%d %d",&ad,&data);if(head == NULL){p=(struct node *)malloc(sizeof(struct node ));head = p;}else{p->next =(struct node *)malloc(sizeof(struct node));p = p->next;}p->ad=ad;p->data=data;p->next=NULL;}p->next=head;   //头尾相连 o=p;            //o的后继节点是 p (o 是用来记录 p的踪迹的) p=head;            //  p指向头 while(~scanf("%d",&a)){if(a==-1) //操作结束 {break;}else{if(o->next->data==a) //如果此时头指针等于 输入的数字 {q=p;p=p->next;o->next=p;free(q);     //删除头节点 }else if(p->data>a){p->data-=a;//减去 }else{t=p; //用t来记录p while(p->next!=t) //循环一圈 {if(p->next->data>a){p->next->data-=a; //减去 p=p->next;break;}else if(p->next->data==a){q=p->next;p->next=p->next->next;p=p->next;free(q);     //删除节点 break;}o=p; //跟踪 p p=p->next;}if(p->next==t) //如果循环一圈也没有找到符合标准的 {o=p,p=t; //重置 } }}}printf("%d %d\n",p->data,p->ad); //输出头节点信息 t=p->next;while(t!=p){ printf("%d %d\n",t->data,t->ad); //输出之后一圈的信息 t=t->next;}return 0;
}

补充测试的数据

其实吧,通过样例其实要考虑的情况就基本全了

BUAA(2021春)空闲空间申请模拟(期中考试题)——注意读题,难度其实一般相关推荐

  1. BUAA(2021春)空闲空间合并(期末考试模拟题)——结构体二级排序

    BUAA数据结构期末模拟题--空闲空间合并 看前须知 考试回顾 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 思考和详解 参考代码 看前须知 要点介绍和简要声明. 考试回顾 格式控制输 ...

  2. BUAA(2021春)查家谱(士谔书院16级期末)——找最近公共祖先(已上传测试数据和代码)

    BUAA数据结构期末模拟题--查家谱 看前须知 考试回顾 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 思考和详解 参考代码 测试数据 看前须知 要点介绍和简要声明. 考试回顾 格式控 ...

  3. BUAA(2021春)实验:树的构造与遍历——根据提示循序渐进(可惜提示有问题Ծ‸Ծ)

    BUAA数据结构第五次编程题 --实验:树的构造与遍历 看前须知 第五次上机题汇总 实验目的与要求 实验内容 Huffman编码文件压缩 问题描述 实验准备 实验步骤 [步骤1] [步骤2] [步骤3 ...

  4. BUAA(2021春)第一次上机选择+填空(含解析)

    看前须知 要点介绍和简要声明. 第一次上机题汇总 扩展字符A--strchr的灵活使用. 表达式求值. 小数形式与科学计数法转换(简)--分类讨论一定要有逻辑. 超长正整数的减法(高精度减法)+其他三 ...

  5. BUAA(2021春)小型图书管理系统

    BUAA数据结构第二次编程题--小型图书管理系统 看前须知 第二次上机题汇总 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 易错点和难点 参考代码 补充测试的数据 推荐题单 看前须知 ...

  6. BUAA(2021春)文件加密(环)——要求循环链表熟练的删除操作

    BUAA数据结构第三次编程题--文件加密(环) 看前须知 第三次上机题汇总 题目内容 问题描述(建议用链表实现) 输入形式 输出形式 样例 样例说明 题解 易错点和难点 参考代码 补充测试的数据 看前 ...

  7. BUAA(2021春)大作业—— 文本摘要生成(数组字典树+快排=0.087s)

    BUAA数据结构大作业-- 文本摘要生成 看前须知 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 思考和详解 参考代码 看前须知 要点介绍和简要声明. 题目内容 问题描述 在自然语言文 ...

  8. BUAA(2021春)多项式相乘

    BUAA数据结构第三次编程题--多项式相乘 看前须知 第三次上机题汇总 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 易错点和难点 参考代码 补充测试的数据 看前须知 要点介绍和简要声 ...

  9. BUAA(2021春)机试检测异常(简)(期末考试题)——简单排序

    BUAA数据结构期末考试题--机试检测异常(简) 看前须知 题目内容 问题描述 输入形式 输出形式 样例 样例说明 题解 思路详解 参考代码 补充测试的数据 看前须知 要点介绍和简要声明. 题目内容 ...

最新文章

  1. debian php mysql 包_Linux+Varnish+Apache+MySQL+PHP一键包For Ubuntu/Debian
  2. 各厂商防火墙初始登录IP及密码信息
  3. ubuntu18+Eclipse+CDT开发QT5界面程序
  4. 虚无主义还是怀疑论?
  5. UVA 10129 Play on Words
  6. phpcms v9 打开网站特别慢 增加数据库缓存方法
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的大学生综合成绩测评系统
  8. pytest测试框架(二)---fixture介绍
  9. Web后端学习笔记 Flask(13)memcached
  10. hbase1.1.1 连接集群_hbase1.2.3集群搭建
  11. 27.go list
  12. 内部排序算法(Golang版本)
  13. sift算法matlab详解,sift算法原理详解及应用
  14. 牛b硬件信息修改大师_太好玩了!Github 上的这个库也能帮你逛 B站!
  15. HTML指南针源码zip,指南针指标公式源码
  16. 大智慧行情服务器文件夹,大智慧行情分析系统炒股软件常用三大菜单操作
  17. Docker:Unable to find image ‘mysql:latest‘ locally
  18. 递归:昆虫繁殖C++实现
  19. lumen php命令,lumen控制器调用artisan
  20. 饮料如何畅销市场?看农夫山泉如何玩转营销

热门文章

  1. 【数据结构学习】有关B树
  2. 服务器系统装usb没有用,服务器全包安装RHEL6.x操作系统USB接口使用异常
  3. SpringBoot Redis使用scan扫描keys出前诡异的乱码前缀
  4. matlab种子点 边缘,如何只做种子点和某个区域(假如额叶)的功能连接
  5. error link2005
  6. 2023 开源骰子微信小程序源码 附流量主
  7. [易飞]同一产品原料成本明细表与成本分析表异常
  8. java.sql.SQLException: java.lang.RuntimeException: serious problem
  9. 基于java+springboot+mybatis+vue+elementui的网上书籍购买商城
  10. Office 2010 回车符号诡异