# 迴圈首次適應演算法、首次適應演算法、最佳適應演算法_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);
}
}``````