#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);
}
}
循环首次适应算法、首次适应算法、最佳适应算法_C语言版
最新推荐文章于 2022-05-24 13:32:49 发布