#include<stdio.h>
#include<stdlib.h>
#define OK 1    //完成
#define ERROR 0 //出错
typedef int Status;
typedef struct free_table//定义一个空闲区说明表结构
{int num; //分区序号long address; //起始地址long length;//分区大小 int state; //分区状态
}ElemType;
typedef struct Node//线性表的双向链表存储结构
{ElemType data;struct Node*prior;//前趋指针struct Node *next;//后继指针
}Node, *LinkList;
LinkList first;//头结点
LinkList end;//尾结点
int flag;//记录要删除的分区序号Status Initblock()//开创带头结点的内存空间链表
{first = (LinkList)malloc(sizeof(Node));end = (LinkList)malloc(sizeof(Node));first->prior = NULL;first->next = end;end->prior = first;end->next = NULL;end->data.num = 1;end->data.address = 40;end->data.length = 600;end->data.state = 0;return OK;
}void sort()//分区序号重新排序
{Node *p = first->next, *q;q = p->next;for (; p != NULL; p = p->next){for (q = p->next; q; q = q->next){if (p->data.num >= q->data.num){q->data.num += 1;}}}
}//显示主存分配情况
void show()
{int flag = 0;//用来记录分区序号Node *p = first;p->data.num = 0;p->data.address = 0;p->data.length = 40;p->data.state = 1;sort();printf("\n\t\t》主存空间分配情况《\n");printf("**********************************************************\n\n");printf("分区序号\t起始地址\t分区大小\t分区状态\n\n");while (p){printf("%d\t\t%d\t\t%d", p->data.num, p->data.address, p->data.length);if (p->data.state == 0)printf("\t\t空闲\n\n");elseprintf("\t\t已分配\n\n");p = p->next;}printf("**********************************************************\n\n");
}//首次适应算法
Status First_fit(int request) {//为申请作业开辟新空间且初始化Node *p = first->next;LinkList temp = (LinkList)malloc(sizeof(Node));temp->data.length = request;temp->data.state = 1;p->data.num = 1;while (p){if ((p->data.state == 0) && (p->data.length == request)){//有大小恰好合适的空闲块p->data.state = 1;return OK;break;}else if ((p->data.state == 0) && (p->data.length > request)){//有空闲块能满足需求且有剩余temp->prior = p->prior;temp->next = p;temp->data.address = p->data.address;temp->data.num = p->data.num;p->prior->next = temp;p->prior = temp;p->data.address = temp->data.address + temp->data.length;p->data.length -= request;p->data.num += 1;return OK;break;}p = p->next;}return ERROR;
}//分配主存
Status allocation()
{int request;//申请内存大小printf("请输入申请分配的主存大小(单位:KB):");scanf("%d", &request);if (request < 0 || request == 0){printf("分配大小不合适,请重试!");return ERROR;}if (First_fit(request) == OK)printf("\t****分配成功!****");else printf("\t****内存不足,分配失败!****");return OK;
}
Status deal1(Node *p)//处理回收空间
{Node *q = first;for (; q != NULL; q = q->next){if (q == p){if (q->prior->data.state == 0 && q->next->data.state != 0){q->prior->data.length += q->data.length;q->prior->next = q->next;q->next->prior = q->prior;q = q->prior;q->data.state = 0;q->data.num = flag - 1;}if (q->prior->data.state != 0 && q->next->data.state == 0){q->data.length += q->next->data.length;q->next = q->next->next;q->next->next->prior = q;q->data.state = 0;q->data.num = flag;}if (q->prior->data.state == 0 && q->next->data.state == 0){q->prior->data.length += q->data.length;q->prior->next = q->next;q->next->prior = q->prior;q = q->prior;q->data.state = 0;q->data.num = flag - 1;}if (q->prior->data.state != 0 && q->next->data.state != 0){q->data.state = 0;}}}return OK;
}
Status deal2(Node *p)//处理回收空间
{Node *q = first;for (; q != NULL; q = q->next){if (q == p){if (q->prior->data.state == 0 && q->next->data.state != 0){q->prior->data.length += q->data.length;q->prior->next = q->next;q->next->prior = q->prior;q = p->prior;q->data.state = 0;q->data.num = flag - 1;}if (q->prior->data.state != 0 && q->next->data.state == 0){q->data.state = 0;}if (q->prior->data.state == 0 && q->next->data.state == 0){q->prior->data.length += q->data.length;q->prior->next = q->next;q->next->prior = q->prior;q = q->prior;q->data.state = 0;q->data.num = flag - 1;}if (q->prior->data.state != 0 && q->next->data.state != 0){q->data.state = 0;}}}return OK;
}//主存回收
Status recovery(int flag)
{Node *p = first;for (; p != NULL; p = p->next){if (p->data.num == flag){if (p->prior == first){if (p->next != end)//当前P指向的下一个不是最后一个时{if (p->next->data.state == 0)//与后面的空闲块相连{p->data.length += p->next->data.length;p->next->next->prior = p;p->next = p->next->next;p->data.state = 0;p->data.num = flag;}else p->data.state = 0;}if (p->next == end)//当前P指向的下一个是最后一个时{p->data.state = 0;}}//结束if(p->prior==block_first)的情况else if (p->prior != first){if (p->next != end){deal1(p);}else{deal2(p);}}//结束if(p->prior!=block_first)的情况}//结束if(p->data.num==flag)的情况}printf("\t****回收成功****");return OK;
}//主函数
void main()
{int i;//操作选择标记Initblock();//开创空间表while (1){show();printf("\t1: 分配内存\t2: 回收内存\t0: 退出\n");printf("请输入您的操作:");scanf("%d", &i);if (i == 1)allocation();//分配内存else if (i == 2)//内存回收{printf("请输入您要释放的分区号:");scanf("%d", &flag);recovery(flag);}else if (i == 0){printf("\n退出程序\n");break;//退出}else//输入操作有误{printf("输入有误,请重试!");continue;}}
}

feawfwefwf相关推荐

最新文章

  1. POJ 2955 Brackets (区间DP)
  2. WebChat 清爽来袭 -- JavaChat系统Ⅳ
  3. 往年包场丘赛的北大,今年被清华逆袭了
  4. 浪潮NF5270M3 刷uefi_新零售浪潮中,开为科技利用刷脸支付帮门店“运营”人
  5. 计算机网络优化是啥,浅析计算机网络优化的方案.doc
  6. UIAutomator简介
  7. Swift - 操作SQLite数据库(引用SQLite3库)
  8. macosx jdk_MacOSX环境上的多个Java JDK
  9. esp8266oled做时钟python_利用esp8266和鸿蒙带的OLED屏做了一个时钟
  10. selenium使用浏览器隐私模式加载网站
  11. 【JavaScript】查漏补缺 —数组中filter()方法
  12. bootstrap3-iframe-modal子页面在父页面显示模态框
  13. android的adb命令总结
  14. Arduino颜色分类器
  15. 整理:.NET 性能优化方法总结
  16. 死链对网站的影响、产生过程、解决办法汇总
  17. postgresql查看数据库及数据表占用空间
  18. windows安装虚拟机(VMware)
  19. saas系统的微服务器,基于微服务架构的SaaS服务应用的研究与实践
  20. 21级蓝桥选拔赛(1)

热门文章

  1. Win10系统下编译运行汇编程序的3种方法
  2. 一文深度解读音视频行业技术发展历程
  3. [二分图最大独立集] BZOJ4808:马
  4. git 文件夹不显示红色图标和绿色图标的问题
  5. mate40不能鸿蒙,mate40pro不能升级鸿蒙吗?我啥也不懂,完蛋了
  6. ajax上传图片java6,java ajax上传图片返回json数
  7. 高中计算机一级基础知识,2017全国计算机一级MS Office考证常考知识点-高中课件精选.doc...
  8. c#串口通讯 c#串口连接电子秤电子天平
  9. IFIX组态----语音报警实例
  10. 服务器支持低版本SSL/TLS协议 支持SSL弱密码套件