下面粗字体是我的程序中结构体的定义,在主函数中给结构体数组赋值,但是问题是给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
提交
取消