循环首次适应算法、首次适应算法、最佳适应算法_C语言版

#include <stdio.h>
#define getpch(type) (type*)mallloc(sizeof(type))
strct LNode
{
	int size;
	int start;
	int end;
	struct LNode *next;
	struct LNode *front;
}*L;
typedeft struct LNode LN;
LN *find;
int n;
void InsertList(int size,int start)
{
	LN *p,*s,*t;
	p=L;
	printf("\n空闲区号 长度 起始位置 终止位置\n");
	for(i=1;i<=n;i++)
	{
		printf("%3d\t %3d\t%3d\t %4d\n",i,p->size,p->start,p->end);
		p=p->next;
	}
}

void BFSortList()
{
	LN *p,*s,*t;
	int min_size,i;
	int size,start,end;
	t=L->next;
	p=L->next;
	for(i=0;i<n;i++)
		{
			s=p->next;
			min_size=p->size;
			while(s)
			{
				if(min_size>s->size)
				{
					min_size=s->size;
					t=s;
				}
				s=s->next;
			}
			size=t->size;
			start=t->start;
			end=t->end;
			t->size=p->size;
			t->start=p->start;
			t->end=p->end;
			p->size=size;
			p->start=start;
			p->end=end;
			t=->next;
			p=p->next;
		}
}

void SortList()
{
	LN *p.*s,*t;
	int min_start,i;
	int size,start,end;
	t=L->next;
	p=L->next;
	for(i=0;i<n;i++)
		{
			s=p->next;
			min_start=p->start;
			while(s)
			{
				if(min_start>s->start)
				{
					min_start=s->start;
					t=s;
				}
				s=s->next;
			}
			size=t->size;
			start=t->start;
			end=t->end;
			t->size=p->size;
			t->start=p->start;
			t->end=p->end;
			p->size=size;
			p->start=start;
			p->end=end;
			t=->next;
			p=p->next;
		}
}

void GetFree()
{
	int size,start,i;
	L=getpch(LN);
	L->next=NULL;
	L->front=NULL;
	printf("请输入空闲区数:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		printf("请输入第%2d空闲区的大小和初始地址。\n",i);
		scanf("%3d,%3d",&size,&start);
		InsertList(size,start);
	}
	printf("\n按任意键继续。");
}

void Assign(int size)
{
	LN *p,*t;
	p=L->next;
	t=L;
	while(p)
	{
		p=p->next;
		t=t->next;
		if(!p)
		{
			printf("没有足够大的空间。\n");
		}
		else
		{
			p->size=p->size-size;
			p->start=p->start+size;
			if(p->size==0)
			{
				t->next=p->next;
				p->next->front=t;
				n--;
				free(p);
			}
		}
		printf("分配成功!\n");
		printf("分配后的空闲链表情况如下:\n");
		PrintList();
		break;
	}
}

int flag=-1;

void NF_Assign(int size)
{
	LN *P,*t;
	int i=n;
	p=find->next;
	t=find;
	while(p)
	{
		if(size>p->size)
		{
			p=p->next;
			t=t->next;
			if(!p)
			{
				printf("没有足够大的空间去分配!分配不成功。");
			}
		}
		else
		{
			p->size=p->size-size;
			p->start=p->start+size;
			find=p;
			if(p->size==0)
			{
				t->next=p->next;
				p->next-front=t;
				n--;
				free(p);
			}
			printf("分配成功!\n");
			flag=1;
			printf("分配后的空闲链表情况如下:\n");
			Print(L);
			break;
		}
	}
	if(flag==-1)
	{
		p=L->next;
		t=L;
		while(p!=find)
		{
			if(size>p->size)
			{
				p=p->size;
				t=t->next;
				if(!p)
				{
					printf("没有足够大的空间去分配!分配不成功。");
				}
			}
			else
			{
				p->size=p->size-size;
				p->start=p->start+size;
				find=t;
				if(p->size==0)
				{
					t->next=p->next;
					p->next-front=t;
					n--;
					free(p);
				}
				printf("分配成功!\n");
				printf("分配后的空闲链表情况如下:\n");
				PrintList(L);
				break;
			}
		}
	}
}

void Recover(int start,int end)
{
	LN *p,*t;
	int size,flag=0;
	size=end-start;
	p=L->next;
	t=p->next;
	while(p)
	{
		if(t&&p->end==start&&t->start==end)
		{
			p->size=p->size+size+t->size;
			p->end=t->end;
			p->next=t->next;
			t->next->front=p;
			free(t);
			n--;
			SortList(L);
			flag=1;
			break;
		}
		else if(p->end==start)
		{
			flag=1;
			p->size=p->size+size;
			p->end=p->end+size;
			SortList(L);
			break;
		}
		else if(p->start==end)
		{
			p->size=p->size+size;
			p->start=start;
			SortList(L);
			flag=1;
			break;
		}
		p=p->next;
		if(p)
			t=p->next;
	}
	if(flag==0)
	{
		InsertList(size,start);
		n++;
	}
	printf("回收后的空闲链表情况如下:");
	PrintList();
	printf("\n按任意间继续。");
}

void main()
{
	int start,end,size;
	int m;
	GetFree();
	getch();
	system("cls");
	printf("请选择服务类型:\n");
	printf("\t1:首次适应算法\n");
	printf("\t3:最佳适应算法\n");
	printf("\t4:最佳适应算法\n");
	printf("\t0:退出\n");
	printf("\t输入您要的选项:\n");
	scanf("%d",&m);
	if(m==2)find=L;
	while(m)
	{
		switch(m)
		{
			case 1:
				SortList();
				printf("\n空闲链表情况:\n");
				PrintList();
				printf("请输入进程需要的空闲区大小:");
				scanf("%d",&size);
				Assign(size);
				printf("\n按任意键继续");
				break;
			case 2:
				SortList();
				printf("\n空闲链表情况:\n");
				PrintList();
				printf("请输入进程需要的空闲区大小:");
				scanf("%d",&size);
				NF_Assign(size);
				printf("\n按任意键继续");
				break;
			case 3:
				BFSortList();
				printf("\n空闲链表情况:\n");
				PrintList();
				printf("请输入进程需要的空闲区大小:");
				scanf("%d",&size);
				Assign(size);
				printf("\n按任意键继续");
				break;
			case 4:
				printf("请输入回收去的首地址和中止地址:");
				scanf("%3d,%3d",&start,&end);
				Recover(start,end);
				break;
			case 0: exit(0);
			default:printf("\n\t\t输入错误,请重新输入");getch();
		}
		getch();
		system("cls");
		printf("请选择服务类型:\n");
		printf("\t1:首次适应算法\n");
		printf("\t3:最佳适应算法\n");
		printf("\t4:最佳适应算法\n");
		printf("\t0:退出\n");
		printf("\t输入您要的选项:\n");
		scanf("%d",&m);
	}
}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值