下面粗字體是我的程序中結(jié)構(gòu)體的定義,在主函數(shù)中給結(jié)構(gòu)體數(shù)組賦值,但是問題是給freetable賦值時(shí)控制循環(huán)的條件(i<n)中n的值為1~4的話就只能輸入一組數(shù)據(jù),n的值為5~8的話就只能輸入兩組組數(shù)據(jù),n的值為9~10的話就只能輸入三組數(shù)據(jù),這是為什么?給job結(jié)構(gòu)體數(shù)組賦值也是這樣,還有sort函數(shù)功能好像沒實(shí)現(xiàn)?是我調(diào)用錯(cuò)了?編譯時(shí)候都沒有錯(cuò)誤了。。。這是執(zhí)行時(shí)的結(jié)果。。還會(huì)彈出下面那張錯(cuò)誤窗口。。不懂,麻煩會(huì)的解釋解釋struct freetable{ int num;//空閑分區(qū)號(hào) int address; /*空閑區(qū)起始地址*/ int length; /*空閑區(qū)長度,單位為字節(jié)*/ int flag; /*空閑區(qū)表登記欄標(biāo)志,用"0"表示已分配,用"1"表示空閑分區(qū),用“2”代表空欄目*/}; /*空閑區(qū)表*/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; } }//************************************************輸出函數(shù)void output(){?/* clrscr();*/? ? printf("\n-----------------------------------------------------\n");? ? printf("%5s%15s%15s%15s","編號(hào)","起始地址","長度","標(biāo)志位");? ? 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("按任意鍵繼續(xù).....................................\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分區(qū)號(hào)\t大小\t起始地址\t狀態(tài)\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[])/*采用首次適應(yīng)算法分配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;// 全部分配給該進(jìn)程 ?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)/*未找到可用空閑區(qū),返回*/? { printf("無可用空閑區(qū), 此次分配失敗\n"); getchar(); }? } ?break;? }}//****************************************************內(nèi)存的回收void reclaim(int n,int m){? ? int i,number;? ? printf("\n請(qǐng)輸入您要回收的分區(qū)號(hào):\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; //標(biāo)志為空閑 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("請(qǐng)繼續(xù):"); reclaim(n,m); } } } }}void main( ){ init(); int i,n,m; printf("輸入空閑分區(qū)個(gè)數(shù):"); scanf("%d",&n); printf("\n分區(qū)號(hào)\t大小\t起始地址 ?狀態(tài)\n"); for(i=0;i<n;i++) scanf("%d",&free_table[i]); printf("輸入作業(yè)個(gè)數(shù):"); scanf("%d",&m); printf("\n作業(yè)名\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 關(guān)注
- 1658 瀏覽
添加回答
舉報(bào)
0/150
提交
取消