给结构体赋值

下面粗字体是我的程序中结构体的定义,在主函数中给结构体数组赋值,但是问题是给freetable赋值时控制循环的条件(i<n)中n的值为1~4的话就只能输入一组数据,n的值为5~8的话就只能输入两组组数据,n的值为9~10的话就只能输入三组数据,这是为什么?给job结构体数组赋值也是这样,还有sort函数功能好像没实现?是我调用错了?编译时候都没有错误了。。。

这是执行时的结果。。还会弹出下面那张错误窗口。。不懂,麻烦会的解释解释

http://img.mukewang.com/57527c6c0001b4f006740438.jpg

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();


}

http://img.mukewang.com/57527a9f00018df604420289.jpg

li222881
浏览 1613回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP