为了账号安全,请及时绑定邮箱和手机立即绑定

给结构体赋值

给结构体赋值

C
li222881 2016-06-04 15:02:05
下面粗字体是我的程序中结构体的定义,在主函数中给结构体数组赋值,但是问题是给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();}
查看完整描述

1 回答

  • 1 回答
  • 1 关注
  • 1612 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信