C语言实现动态分区分配

代码重复度还是很高的,存在简化的空间。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h> #define LEN sizeof(Qu)
int m = 0;typedef struct fenqu
{int num; //分区序号    long begin; //起始地址    long size;   //分区大小    int status;   //分区状态 struct fenqu* next;
}Qu;Qu* tin = NULL;//悬停指针Qu* creat()//初始化
{Qu* p1;Qu* h = NULL;h = (Qu*)malloc(LEN);if (h) {p1 = (Qu*)malloc(LEN);if (p1) {printf("用户空闲分区:");scanf_s("%d", &p1->size);p1->num = m++;p1->status = 0;p1->begin = 30;h->next = p1;p1->next = NULL;return h;}}
}
Qu* cr() {//分配内存Qu* h, * n, * u;h = n = u = NULL;n = h = (Qu*)malloc(LEN);if (h) {printf("分配大小:");scanf_s("%d", &h->size);h->num = m++;h->status = 1;h->begin = 0;h->next = NULL;return h;}
}
void xs(Qu* h) {//显示Qu* tou = h->next;printf("区号\t起始地址   大小\t状态(0为空闲)\n");while (tou){printf("%d\t%d\t   %d\t%d\n", tou->num, tou->begin, tou->size, tou->status);tou = tou->next;}
}
void Sort1(Qu* l) { //采用头插法Qu* p = l->next, * pre;Qu* r = p->next;p->next = NULL;p = r;while (p != NULL) {r = p->next;pre = l;while (pre->next != NULL && pre->next->size < p->size) {pre = pre->next;}p->next = pre->next;pre->next = p;p = r;}
}
void Sort2(Qu* l) { //采用头插法Qu* p = l->next, * pre;Qu* r = p->next;p->next = NULL;p = r;while (p != NULL) {r = p->next;pre = l;while (pre->next != NULL && pre->next->size > p->size) {pre = pre->next;}p->next = pre->next;pre->next = p;p = r;}
}
Qu* shouci(Qu* h, Qu* x) {//首次算法Qu* p, * n; //* u;n = h;p = h->next;int kk = 0;while (p){if (p->size > x->size && p->status == 0) {x->begin = p->begin;p->begin = x->begin + x->size;p->size = p->size - x->size;n->next = x;x->next = p;kk = 1;return p;break;}if (p->size = x->size && p->status == 0) {//刚好相等不用划分p->status = 1;free(x);kk = 1;return p;break;}n = p;p = p->next;}if (kk == 0)printf("没有足够空间!\n");
}
Qu* xhshouc(Qu* tou, Qu* h, Qu* x) {//循环首次Qu* p, * n, * u;int ll = 0;u = tou;n = tou->next;while (n) {if (n == h) {break;}u = n;n = n->next;}p = h;int kk = 0;while (p){if (p->size > x->size&& p->status == 0) {x->begin = p->begin;p->begin = x->begin + x->size;p->size = p->size - x->size;u->next = x;x->next = p;kk = 1;return p;break;}if (p->size = x->size && p->status == 0) {p->status = 1;free(x);kk = 1;return p;break;}p = p->next;ll++;if (p == NULL)p = tou;if (ll > m)break;}if (kk == 0)printf("没有足够空间!\n");
}
Qu* zuijia(Qu* h, Qu* x) {//最佳Sort1(h);Qu* p, * n;p = h->next;n = h;int kk = 0;while (p){if (p->size > x->size&& p->status == 0) {x->begin = p->begin;p->begin = x->begin + x->size;p->size = p->size - x->size;n->next = x;x->next = p;kk = 1;return p;break;}if (p->size = x->size&& p->status == 0) {p->status = 1;free(x);kk = 1;return p;break;}n = p;p = p->next;}if (kk == 0)printf("没有足够空间!\n");
}
Qu* zuicha(Qu* h, Qu* x) {//最差Sort2(h);Qu* p, * n;p = h->next;n = h;int kk = 0;while (p){if (p->size > x->size&& p->status == 0) {x->begin = p->begin;p->begin = x->begin + x->size;p->size = p->size - x->size;n->next = x;x->next = p;kk = 1;return p;break;}if (p->size = x->size && p->status == 0) {p->status = 1;free(x);kk = 1;return p;break;}n = p;p = p->next;}if (kk == 0)printf("没有足够空间!\n");
}
void huishou(Qu *h) {//回收1Qu* p = h->next;Qu* n, * u;n = h;int a;int kk = 0;printf("要回收的区号:");scanf_s("%d",&a);while (p){if (p->num == a) {//n->next = p->next;//free(p);//m--;p->status = 0;kk = 1;break;}n = p;p = p->next;}if (kk == 0)printf("找不到该分区!\n");
}
void hs(Qu* h) {//回收2Qu* p = h->next;Qu* n, * u;n = h;while (p){if (p->next) {if (p->status == 0 && p->next->status == 0) {p->next->begin = p->begin;p->next->size = p->next->size + p->size;p->next->num = p->num;n->next = p->next;free(p);p = n;}}n = p;p = p->next;}
}
void ff(Qu* h, Qu* x) {//方法Qu* head = h;int xuanze;int kk = 1;while (1){printf("1.首\t2.循环首    3.最佳\t4.最差\n");scanf_s("%d", &xuanze);switch (xuanze){case 1:tin = shouci(head, x);break;case 2:if (tin) {xhshouc(head, tin, x);}else{tin = shouci(head, x);}break;case 3:tin=zuijia(head, x);break;case 4:tin = zuicha(head, x);break;default:printf("重新选择!\n");kk = 0;break;}if (kk == 1)break;}
}
void main()
{Qu* n, * u, * x;Qu* head = NULL;int xuanze = 0;n = u = x = NULL;head = creat();while (1){printf("1.分配内存\t2.回收内存\t0.退出\n");scanf_s("%d", &xuanze);if (xuanze == 0)break;switch (xuanze){case 1:x = cr();ff(head, x);break;case 2:huishou(head);hs(head);break;case 3:xs(head);break;default:printf("重新选择!\n");xs(head);break;}xs(head);}
}```

C语言实现动态分区分配相关推荐

  1. 操作系统之动态分区分配与回收—C语言实现

    前言 这篇文章用来记录操作系统实验之 动态分区分配与回收. 不想从网上copy代码,打算自己从头到尾写一下,没想到却花了我整整两个晚上的时间,好在终于写完了- 动态分区分配采用的算法是最佳适应(bes ...

  2. 操作系统实验2—实现动态分区分配模拟程序

    操作系统实验2-实现动态分区分配模拟程序 文章目录 操作系统实验2-实现动态分区分配模拟程序 实验描述 设计思路 上机代码 测试结果 心得体会 实验描述 实验内容: 编写一个可变分区存储管理程序,模拟 ...

  3. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

  4. 内存管理-动态分区分配方式模拟

    内存管理 - 动态分区分配方式模拟 操作系统第二次课程作业 - 动态分区分配方式模拟 项目需求 假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法进行内存块的分 ...

  5. JS实现动态分区分配中的首次适应算法和最佳适应算法

    实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解. 实验内容 (1) 用C语言(不会C这里就用JS实现)分别实现采用首次适应算法和最佳适应 ...

  6. 二十八、动态分区分配算法

    一.知识总览 二.首次适应算法 算法思想:每次都从低地址开始查找,找到第一个能满足大小的空闲分区 如何实现:空闲分区以地址递增的次序排列.每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满 ...

  7. 操作系统(三十六)动态分区分配算法

    3.5 动态分区分配算法 上节讲述了连续分区分配方式中有动态分区分配的方式,如果在动态分区分配算法中有许多空闲分区都满足需求的时候,那该如何分配空间呢,今天来介绍四种分配方法解决这个问题. 目录 3. ...

  8. 基于顺序搜索的动态分区分配算法模拟内存动态分配--最佳适应算法(best fit,BF)

    BF算法.男朋友算法,哈哈 要实现动态分区分配,需要考虑三个方面的问题.分别是数据结构.分区分配算法.分区的分配与回收操作. 首数据结构 这里我们使用的是空闲分区链,采用双向链表表示空闲分区. 具体实 ...

  9. 七、操作系统——动态分区分配算法(详解)

    一.引入 动态分区分配算法:在动态分区分配方式中,当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? 二.首次适应算法(First Fit) 算法思想:每次都从低地址开始查找,找到第一个能满足 ...

最新文章

  1. 设计模式之模板方法模式(Template Method)摘录
  2. celery中间件:broker
  3. 双线性插值算法ARM NEON优化
  4. class ts 扩展方法_如使用Typescript撸Vue(Vue2 + TS +TSX+CSS module)
  5. jQuery自定义漂亮的下拉框插件8种效果演示
  6. SAP C4C里收藏了的客户,在什么地方能够快捷打开
  7. c++ 取两个链表的交集_使用C ++程序查找两个链表的交集
  8. 【转】怎样成为优秀的软件模型设计者(文末提供下载)
  9. 【Flink】Flink 1.12.2 TaskSlot
  10. verilog逻辑符
  11. 微信小程序图片转换成文字_涨知识!这个微信小程序,能将纸上文字转换成电子版...
  12. 文本聚类python fcm_模糊C均值聚类-FCM算法
  13. 第二章 数据模型 概念数据模型E-R图 设计E-R图,过程,例子 逻辑数据模型,分类
  14. 数位板软件测试工资,一位强迫症患者对板子的深度剖析,绘王H950P数位板测评...
  15. base_c:字符串翻转练习
  16. (保姆级教程)免费将pdf转化为word文档,不限页数
  17. ChinaSoft 论坛巡礼 | 云际计算系统软件
  18. 1GB等于2的多少次方
  19. wxpython多个面板_wxpython笔记:Wxpython pannel切换
  20. pycharm运行python程序没有解释器怎么办

热门文章

  1. 2022年六款最好用的运动耳机、骨传导耳机推荐
  2. 餐饮业的前景与发展趋势
  3. 解释一下浏览器解析HTTP的过程
  4. UiPath的下载安装与基本使用
  5. 西工大里的河南烩面的五一故事(数模、作业、课题组、考试)
  6. 胡忭利c语言第七章课后答案,c语言程序设计高职
  7. 手机计算机两用u盘,手机电脑两用u盘_手机电脑两用u盘弊端
  8. 开源创业者必读:Kong从明星开源项目进化为独角兽的商业化路径
  9. ElasticSearch全文搜索引擎
  10. 2023南京邮电大学通达学院《数学实验》MATLAB实验答案