下面粗字体是我的程序中结构体的定义,在主函数中给结构体数组赋值,但是问题是给freetable赋值时控制循环的条件(i<n)中n的值为1~4的话就只能输入一组数据,n的值为5~8的话就只能输入两组组数据,n的值为9~10的话就只能输入三组数据,这是为什么?给job结构体数组赋值也是这样,还有sort函数功能好像没实现?是我调用错了?编译时候都没有错误了。。。
这是执行时的结果。。还会弹出下面那张错误窗口。。不懂,麻烦会的解释解释
struct freetable
{
int num;//空闲分区号
int address; /*空闲区起始地址*/
int length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示已分配,用"1"表示空闲分区,用“2”代表空栏目*/
}; /*空闲区表*/
struct job
{
char name;
int size;
};
struct freetable free_table[10];//全局变量
struct job job_t[10];
//**********************************************初始化
void init()
{
struct freetable temp={0,0,2};
int i;
for(i=0;i<10;i++)
{
free_table[i]=temp;
}
}
//************************************************输出函数
void output()
{
/* clrscr();*/
printf("\n-----------------------------------------------------\n");
printf("%5s%15s%15s%15s","编号","起始地址","长度","标志位");
printf("\n-----------------------------------------------------\n");
for(int i=0;i<10 && free_table[i].flag!=2;i++)
{
printf("%5d%15.0f%15.0f%15s\n",i,free_table[i].address,free_table[i].length,free_table[i].flag!=1?"已分配":"空闲");
}
printf("\n-------------------------------------------------\n");
printf("按任意键继续.....................................\n");
getch();
}
void sort(int n,freetable free_table[])//按地址由小到大排序
{
int i,j;
int t;
for(i=0;i<n&& free_table[i].flag==1;i++)
{
for(j=0;j<n&& free_table[i].flag==1;j++)
{
if(free_table[j].address>free_table[j+1].address)
{
t=free_table[j].address;
free_table[j].address=free_table[j+1].address;
free_table[j+1].address=t;
t=free_table[j].num;
free_table[j].num=free_table[j+1].num;
free_table[j+1].num=t;
t=free_table[j].length;
free_table[j].length=free_table[j+1].length;
free_table[j+1].length=t;
t=free_table[j].flag;
free_table[j].flag=free_table[j+1].flag;
free_table[j+1].flag=t;
}
}
printf("\n分区号\t大小\t起始地址\t状态\n");
printf("\n%d \t%d \t%d \t%d \n",free_table[j].num,free_table[j].length,free_table[j].address,free_table[j].flag);
}
}
void First_allocate(int n,int m,freetable free_table[],job job_t[])/*采用首次适应算法分配x大小的空间*/
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<m&&free_table[j].flag==1;j++)
{
if( free_table[j].length>=job_t[i].size&&free_table[j].flag==1)
{
if(free_table[j].length-job_t[i].size<=20)
free_table[j].flag=0;// 全部分配给该进程
else
{
n=n+1;
for(int k=j;j<n;j++)
free_table[k+1]=free_table[k];
free_table[j+1].address=free_table[j].address+job_t[j].size;
free_table[j+1].length=free_table[j].length-job_t[j].size;
free_table[j+1].flag=1;//未分配
free_table[j].length=job_t[j].size;
free_table[j].flag=0;//已分配
}
break;
}
if(i==n||free_table[i].flag==2)/*未找到可用空闲区,返回*/
{
printf("无可用空闲区, 此次分配失败\n");
getchar();
}
}
break;
}
}
//****************************************************内存的回收
void reclaim(int n,int m)
{
int i,number;
printf("\n请输入您要回收的分区号:\n");
scanf("%d",&number);
for(i=0;i<m;i++)
{
if(free_table[i].num==number)
{
if(free_table[i].flag == 0) //输入的空间是使用的
{
free_table[i].flag =1; //标志为空闲
if(free_table[i+1].flag == 1) //右空间为空则合并
{
free_table[i].length+=free_table[i+1].length; //大小合并
for(i=i+1;i < n && free_table[i].flag !=2;i++)/* i后的空间信息表元素前移 */
{
if(i>0)
free_table[i]=free_table[i+1];
}
n=n-1;
}
if(i > 0 && free_table[i-1].flag==1) //左空间空闲则合并
{
free_table[i-1].length+=free_table[i].length;
for(;i<n && free_table[i].flag!=2;i++)
free_table[i]=free_table[i+1];
n=n-1;
}
}
else
{
printf("此回收空间不存在!\n ");
char exit;
exit=getchar();
if(exit!='q')
{
printf("请继续:");
reclaim(n,m);
}
}
}
}
}
void main( )
{
init();
int i,n,m;
printf("输入空闲分区个数:");
scanf("%d",&n);
printf("\n分区号\t大小\t起始地址 状态\n");
for(i=0;i<n;i++)
scanf("%d",&free_table[i]);
printf("输入作业个数:");
scanf("%d",&m);
printf("\n作业名\t大小\n");
for(i=0;i<m;i++)
{
scanf("%d",&job_t[i]);
}
sort(n,free_table);
First_allocate(n,m,free_table,job_t);
reclaim(n,m);/*回收主存空间*/
output();
}
相关分类