您的位置:首页 > 编程语言 > C语言/C++

C语言实现动态分区分配

2020-02-03 04:14 831 查看

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) {//回收1
Qu* 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) {//回收2
Qu* 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);
}
}```
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Mr.星空 发布了3 篇原创文章 · 获赞 1 · 访问量 81 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: