C语言实现动态分区分配

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);
	}
}```

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值