求高人相助,为什么不能分配啊。回收也有问题。。。
分配回收有问题啊 空闲区初始化的那个不能动的 是给os分配的 咋回事啊????#include<stdio.h>
#include<string.h>
#define N 10//最大作业数量为N
#define M 10//空闲区表最大为M
#define minsize 1 //最小
typedef struct
{
float address;//已分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为已存储
}used;
used ut[N];
typedef struct
{
float address;//未分配区的起始地址
float length;//长度
int flag;//标志 0为空区 1为未分配
}free;
free ft[M];
void csh()//初始化
{
int i;
ft[0].address=10;
ft[0].length=10;
ft[0].flag=1;
for(i=1;i<M;i++)
ft[i].flag=0;
for(i=0;i<N;i++)
ut[0].flag=0;
}
int fenpei(int name,float size)//分配内存
{
int i=0,j=0,k=-1;
float ad,l;
for(i=0;i<M;i++)
if(ft[i].length>=size&&ft[i].flag==1)
if(k==-1||ft[i].length<ft[k].length)
k=i;
if(k==-1)
{
printf("无可用空闲区\n");
return 0;
}
if(ft[k].length-size<=minsize)
{
ft[k].flag=0;
ad=ft[k].address;
l=ft[k].length;
}
else
{
ad=ft[k].address;
l=ft[k].length;
ft[k].address=ft[k].address+l;
ft[k].length=ft[k].length-l;
}
i=0;
while(ut[i].flag!=0 && i<N)
{
i++;
}
if(i>=N)
{
printf("没空间填写已分分区,错误\n");
if (ft[k].flag==0)
ft[k].flag=1;
else
ft[k].length=ft[k].length+l;
return 0;
}
else
{
ut[i].address=ad;
ut[i].length=l;
ut[i].flag=name;
}
return 0;
}
int huishou(int name)//回收内存
{
int i=0,t,j=0;
int k=-1;int n=-1;//k是上栏 n是下栏
int y=0;
float rad,rl;
while(y<=N-1&&(ut[y].flag!=name||ut[y].flag==0))
{y++;}
if(y>=N)
{
printf("找不到改作业\n");
return 0 ;
}
else
{
ut[y].flag=0;
rad=ut[y].address;
rl=ut[y].length;
}
while((i<M &&(k==-1||n==-1)))
{
if(ft[i].flag==0)
{
if(ft[i].address+ft[i].length==rad)
k=i;
if(ft[i].address==rad+rl)
n=i;
}
i=i+1;
}
if(k!=-1)//有上邻接区
if(n!=-1)//有下邻接区
{
ft[i].length=ft[n].length+ft[k].length+rl;
ft[n].flag=0;
}
else
ft[k].length+=rl;
else if(n!=-1)
{
ft[n].length+=rl;
ft[n].address=rad;
}
else//既没有上邻接区也没有下邻接区
{t=0;
while(ft[t].flag==1&& t<M)
{ t++;}
if(t>=M)
{
ut[y].flag=name;
printf("空闲区已经满了!!!!回收失败!!!!");
return 0;
}
else
{
ft[t].address=rad;
ft[t].length=rl;
ft[t].flag=1;
}
}
return name;
}
void show()
{int i;
printf("输出空闲区表:\n");
printf("起始地址 分区长度 标志\n");
for (i=0;i <M;i++)
printf("%5.0f%10.0f%6d\n",ft[i].address,ft[i].length,ft[i].flag);
printf("按任意键,输出已分分区表\n");
getch();
printf("输出已分分区表:\n");
printf("起始地址 分区长度 标志\n");
for (i=0;i <N;i++)
if (ut[i].flag!=0)
printf("%6.0f%9.0f%6d\n",ut[i].address,ut[i].length,ut[i].flag);
else
printf("%6.0f%9.0f%6d\n",ut[i].address,ut[i].length,ut[i].flag);
}
void main()
{int choice;
int name;
float size;
csh();
while(1)
{
printf("\t***********************************\n");
printf("\t\t1.分配\n");
printf("\t\t2.回收\n");
printf("\t\t3.显示分配情况\n");
printf("\t\t4.退出\n");
printf("\t***********************************\n");
printf("请输入选择1-4:");
scanf("%d",&choice);
if(choice<1||choice>4)
printf("您的输入有误");
switch(choice)
{
case 1:
printf("请输入你要分配的作业名:\n");
scanf("%d",&name);
printf("请输入你要分配的作业所需空间的大小:\n");
scanf("%f",&size);
fenpei(name,size);
getch();
system("cls");
break;
case 2:printf("请输入你要回收的作业名:\n");
scanf("%d",&name);
huishou(name);
getch();
system("cls");break;
case 3:show();
getch();
system("cls");break;
case 4:break;
default:;break;
}
}}
[ 本帖最后由 屎宝宝 于 2012-11-21 23:01 编辑 ]