首次适应算法代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <string.h>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
const int maxn = 10;
int N;          ///操作次数
int init_room;  ///总的内存可用空间
char s[] = "申请";typedef struct Node{int start;  ///地址起点int ended;  ///地址终点int room;   ///地址长度int id = 0;     ///任务序号(空闲内存都为0,占用则为对应的序号)Node* next;
}Node;Node* HE;  ///空闲内存链表的头结点
Node* HF;   ///占用内存链表的头结点void add_next(int start, int ended, int room, int id, Node* next){next -> start = start;next -> ended = ended;next -> room = room;next -> id = id;next -> next = NULL;
}void init(){HE = (Node*)malloc(sizeof(Node));HF = (Node*)malloc(sizeof(Node));HE -> next = (Node*)malloc(sizeof(Node));if(HE == NULL || HF == NULL || HE -> next == NULL){cout << "链表头结点分配内存失败或链表尾部添加结点时分配内存失败" << endl;exit(-1);}add_next(0, init_room - 1, init_room, 0, HE -> next);HF -> next = NULL;
}void out_put_empty(){Node* p = HE -> next;cout << "空闲内存情况"  << endl;cout << "---------------------------" << endl;printf("%10s %10s %10s\n", "起始地址", "结束地址", "内存大小");while(p != NULL){printf("%10d %10d %10d\n", p -> start, p -> ended, p -> room);p = p -> next;}cout << "---------------------------" << endl;
}void out_put_full(){Node* p = HF -> next;cout << "占用内存情况"  << endl;cout << "---------------------------" << endl;printf("%10s %10s %10s %10s\n", "任务id", "起始地址", "结束地址", "内存大小");while(p != NULL){printf("%10d %10d %10d %10d\n",p -> id, p -> start, p -> ended, p -> room);p = p -> next;}cout << "---------------------------" << endl;
}/** 指向尾结点*/
Node* get_tail(){Node* p = HF;while(p -> next != NULL){p = p -> next;}return p;
}void insert_full(Node* p, int id, int room){Node* tail = get_tail();tail -> next = (Node*)malloc(sizeof(Node));if(tail -> next == NULL){cout << "占用内存链表尾部添加结点时分配内存失败" << endl;exit(-1);}add_next(p -> start, p -> start + room - 1, room, id, tail -> next);
}void delete_emtpy(Node* p, int room){p -> start += room;p -> room -= room;
}/** 在空闲内存中查找是否有连续的room空间* 有则返回空闲内存块的指针,没有则返回NULL*/
bool search_delete_empty_insert_full(int id, int room){Node* p = HE -> next;while(p != NULL){if(p -> room >= room){insert_full(p, id, room);delete_emtpy(p, room);return true;}p = p -> next;}
}void free_full(Node* p, Node* pre){pre -> next = p -> next;free(p);p = NULL;
}/** 将释放的空间加回空闲内存链表*/
void add_empty(Node* pFull){Node* p = HE;while(p != NULL){if(p -> next == NULL || !(pFull -> start > p -> next -> ended)){Node * new_empty = (Node*)malloc(sizeof(Node));if(new_empty == NULL){cout << "空闲内存链表创建新的结点失败" << endl;exit(-1);}new_empty -> start = pFull -> start;new_empty -> ended = pFull -> ended;new_empty -> room = pFull -> room;new_empty -> next = p -> next;p -> next = new_empty;return ;}p = p -> next;}return ;
}bool search_id_free_full_add_empty(int id){Node* p = HF -> next;Node* pre = HF;while(p != NULL){if(p -> id == id){add_empty(p);free_full(p, pre);return true;}pre = p;p = p -> next;}return false;
}void conbine_empty(){Node* p = HE -> next;//printf("%d %d\n", p == NULL, p -> next == NULL);while(p != NULL && p -> next != NULL){if(p -> ended + 1 == p -> next -> start){p -> ended = p -> next -> ended;p -> room += p -> next -> room;Node* tem = p -> next;p -> next = p -> next -> next;free(tem);tem = NULL;}else{p = p -> next;}}
}void solve(int id, char* behave, int room){if(strcmp(behave, s) == 0){///申请操作if(search_delete_empty_insert_full(id, room)){cout << "申请成功" << endl;}else{cout << "空间不足,申请失败" << endl;}}else{///释放if(search_id_free_full_add_empty(id)){cout << "释放成功" << endl;}else{cout << "无此任务,释放失败" << endl;}}conbine_empty();
}int main(){cout << "请输入操作次数:";cin >> N;cout << "请输入内存可用空间:";cin >> init_room;getchar();init();while(N--){int id, room;char behave[maxn];   ///要执行的操作scanf("作业%d %s %dKB", &id, behave, &room);getchar();solve(id, behave, room);out_put_empty();out_put_full();}return 0;
}
/*
11
640
作业1 申请 130KB
作业2 申请 60KB
作业3 申请 100KB
作业2 释放 60KB
作业4 申请 200KB
作业3 释放 100KB
作业1 释放 130KB
作业5 申请 140KB
作业6 申请 60KB
作业7 申请 50KB
作业8 申请 60KB
*/

最佳适应代码

合并连续空闲内存的模块要改
增加一个空闲内存链表大小 从小到大排序的模块,用插入排序就好,这里不用改变指针的排序方式,用结点赋值的方式。

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <string.h>
#include <cstdio>
#include <cstdlib>
#include <queue>
using namespace std;
const int maxn = 10;
int N;          ///操作次数
int init_room;  ///总的内存可用空间
char s[] = "申请";typedef struct Node{int start;  ///地址起点int ended;  ///地址终点int room;   ///地址长度int id = 0;     ///任务序号(空闲内存都为0,占用则为对应的序号)Node* next;
}Node;Node* HE;  ///空闲内存链表的头结点
Node* HF;   ///占用内存链表的头结点void add_next(int start, int ended, int room, int id, Node* next){next -> start = start;next -> ended = ended;next -> room = room;next -> id = id;next -> next = NULL;
}void init(){HE = (Node*)malloc(sizeof(Node));HF = (Node*)malloc(sizeof(Node));HE -> next = (Node*)malloc(sizeof(Node));if(HE == NULL || HF == NULL || HE -> next == NULL){cout << "链表头结点分配内存失败或链表尾部添加结点时分配内存失败" << endl;exit(-1);}add_next(0, init_room - 1, init_room, 0, HE -> next);HF -> next = NULL;
}void out_put_empty(){Node* p = HE -> next;cout << "空闲内存情况"  << endl;cout << "---------------------------" << endl;printf("%10s %10s %10s\n", "起始地址", "结束地址", "内存大小");while(p != NULL){printf("%10d %10d %10d\n", p -> start, p -> ended, p -> room);p = p -> next;}cout << "---------------------------" << endl;
}void out_put_full(){Node* p = HF -> next;cout << "占用内存情况"  << endl;cout << "---------------------------" << endl;printf("%10s %10s %10s %10s\n", "任务id", "起始地址", "结束地址", "内存大小");while(p != NULL){printf("%10d %10d %10d %10d\n",p -> id, p -> start, p -> ended, p -> room);p = p -> next;}cout << "---------------------------" << endl;
}/** 指向尾结点*/
Node* get_tail(){Node* p = HF;while(p -> next != NULL){p = p -> next;}return p;
}void insert_full(Node* p, int id, int room){Node* tail = get_tail();tail -> next = (Node*)malloc(sizeof(Node));if(tail -> next == NULL){cout << "占用内存链表尾部添加结点时分配内存失败" << endl;exit(-1);}add_next(p -> start, p -> start + room - 1, room, id, tail -> next);
}void delete_emtpy(Node* p, int room){p -> start += room;p -> room -= room;
}/** 在空闲内存中查找是否有连续的room空间* 有则返回空闲内存块的指针,没有则返回NULL*/
bool search_delete_empty_insert_full(int id, int room){Node* p = HE -> next;while(p != NULL){if(p -> room >= room){insert_full(p, id, room);delete_emtpy(p, room);return true;}p = p -> next;}
}void free_full(Node* p, Node* pre){pre -> next = p -> next;free(p);p = NULL;
}/** 将释放的空间加回空闲内存链表*/
void add_empty(Node* pFull){Node* p = HE;while(p != NULL){if(p -> next == NULL || !(pFull -> start > p -> next -> ended)){Node * new_empty = (Node*)malloc(sizeof(Node));if(new_empty == NULL){cout << "空闲内存链表创建新的结点失败" << endl;exit(-1);}new_empty -> start = pFull -> start;new_empty -> ended = pFull -> ended;new_empty -> room = pFull -> room;new_empty -> next = p -> next;p -> next = new_empty;return ;}p = p -> next;}return ;
}bool search_id_free_full_add_empty(int id){Node* p = HF -> next;Node* pre = HF;while(p != NULL){if(p -> id == id){add_empty(p);free_full(p, pre);return true;}pre = p;p = p -> next;}return false;
}void conbine_empty(){Node* p = HE -> next;while(p != NULL && p -> next != NULL){Node* p2 = p -> next;Node* pre = p;bool flag = false;///标记是否有发生合并while(p2 != NULL){if(p -> ended + 1 == p2 -> start){p -> ended = p2 -> ended;p -> room += p2 -> room;pre -> next = p2 -> next;free(p2);p2 = NULL;flag = true;}else{pre = p2;p2 = p2 -> next;}}if(!flag){p = p -> next;}}
}void swap_Node(Node* a, Node* b){Node tem = *a;a -> start = b -> start;a -> ended = b -> ended;a -> room = b -> room;b -> start = tem.start;b -> ended = tem.ended;b -> room= tem.room;
}void sort_empty(){Node* p = HE;while(p != NULL && p -> next != NULL){Node* tem = p -> next;Node* pmini = tem;while(tem != NULL){if(tem -> room < pmini -> room){pmini = tem;}tem = tem -> next;}swap_Node(p -> next, pmini);p = p -> next;}
}void solve(int id, char* behave, int room){if(strcmp(behave, s) == 0){///申请操作if(search_delete_empty_insert_full(id, room)){cout << "申请成功" << endl;}else{cout << "空间不足,申请失败" << endl;}}else{///释放if(search_id_free_full_add_empty(id)){cout << "释放成功" << endl;}else{cout << "无此任务,释放失败" << endl;}}conbine_empty();sort_empty();
}int main(){cout << "请输入操作次数:";cin >> N;cout << "请输入内存可用空间:";cin >> init_room;getchar();init();while(N--){int id, room;char behave[maxn];   ///要执行的操作scanf("作业%d %s %dKB", &id, behave, &room);getchar();solve(id, behave, room);out_put_empty();out_put_full();}return 0;
}
/*11
640
作业1 申请 130KB
作业2 申请 60KB
作业3 申请 100KB
作业2 释放 60KB
作业4 申请 200KB
作业3 释放 100KB
作业1 释放 130KB
作业5 申请 140KB
作业6 申请 60KB
作业7 申请 50KB
作业8 申请 60KB*/

操作系统 首次适应算法 最佳适应算法(C++)相关推荐

  1. 最坏适应算法c语言源码,首次适应算法,最佳适应算法,最坏适应算法源代码

    这是一个非常完美的程序,输出显示的格式也很棒,里面包含首次适应算法,最佳适应算法,最坏适应算法 #include #include #define Free 0 //空闲状态 #define Busy ...

  2. 页面置换算法——最佳置换算法、最近最少使用算法、先进先出算法、时钟置换算法

    计算机操作系统--页面置换算法 根据中国大学MOOC计算机操作系统(电子科技大学)而写. 如果自己要设计页面置换,要根据什么原则来设计?我们首先想到的是存储器的局部性原理(时间局部性.空间局部性) P ...

  3. 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)

    最佳置换算法(OPT) 什么是OPT 最佳置换算法,其所选择的被淘汰的页面将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面.采用最佳置换算法通常可保证最低的缺页率.但是人们目前还无法与之, ...

  4. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理

    湖南师范大学 信息科学与工程学院 操作系统课程实验报告 实验项目名称: 可变分区存储管理 题目 实验一.可变分区存储管理 一.实验目的: 加深对可变分区存储管理的理解: 提高用C语言编制大型系统程序的 ...

  5. 操作系统页面置换算法(最佳置换算法,FIFO,LRU,Clock)

    页面置换算法 为什么要页面置换 最佳置换算法 先进先出页面置换算法 LRU置换算法 Clock置换算法 为什么要页面置换 缺页中断: 在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断 ...

  6. 操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)

    操作系统--动态分配 写的时间早了,有些许漏洞和不足,请大家不要介意 分配方式可分为四类:单一连续分配.固定分区分配.动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的 ...

  7. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  8. 【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF)

    一.首次适应算法 1.算法思想 每次从低地址开始查找,找到第一个能满足大小的空闲分区. 2.如何实现 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区 ...

  9. 3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

    文章目录 0.思维导图 1.首次适应算法 2.最佳适应算法 3.最坏(大)适应算法 4.临近适应算法 5.四种算法归纳比较 0.思维导图 本篇文章是对上一篇文章内存的分配与回收提到的动态分区分配算法的 ...

最新文章

  1. 2016年宜昌楼市将迎来史上最激烈一战
  2. 设计模式学习笔记(十六:桥接模式)
  3. questions for the exploitation of technologies
  4. oracle 以1开头以9结尾_为什么你看到的价格总以数字“9”结尾?
  5. 收集很实用的 Linux 高级命令
  6. python可以处理哪些文件_4招小技巧,带你迅速提升Python文件处理的逼格
  7. stm32内部低速rtc_STM32时钟RCC详解
  8. cacti支持中文办法
  9. C++_public、private、protected权限介绍
  10. 毕业后,两个月,第二家公司上班第一天
  11. 「Mac新手必备」自定义 Mac 上的控制中心和菜单栏
  12. python处理xps文件_如何在Windows 10系统中处理XPS文件
  13. 【机器学习】SVM核方法
  14. 向量场_方向向量和梯度
  15. S5P4418裸机开发(六):串口初试,简单回显(轮询模式)
  16. 国内的智能家居品牌有哪些
  17. 投资、投机、赌博、交易
  18. 影视影评类微信公众号图文排版有哪些技巧?
  19. 第四届蓝桥杯JavaC组国(决)赛真题
  20. 笔记本不能用无线网策略服务器,笔记本不能上网的解决方法适用于使用无线路由器上网...

热门文章

  1. diff linux文件夹patch,diff 文件差异和patch打补丁工具
  2. 大型分布式电商系统架构是如何从 0 开始演进的?
  3. 用python-pptx库提取ppt中的全部备注
  4. ChatGPT 会毁掉教育吗?
  5. win7运行软件时每次都提示您允许以下程序对计算机进行更改吗?,WIN7运行软件时每次都提示您准许以下程序对计算机进行更改吗?...
  6. js模仿微信语音播放的小功能
  7. Spark Hint
  8. 下载量已超越千万的爆红游戏2048(同名小3传奇、1024)源代码解密和下载(第一篇)
  9. cobra结合java_Cobra – 开源的多语言源代码安全审计工具
  10. GOOGLE高级搜索的秘籍