..
#include
int n1;//空闲分区的个数 int n2;//作业区的个数 struct kongxian { int start; //起址 int end; //结束 int length; //长度 }kongxian[N]; struct zuoye { int start; //起址 int end; //结束 int length; //长度 }zuoye[N];
int cmp1(const void *a,const void *b) { return (*(struct kongxian *)a).start-(*(struct kongxian *)b).start; }
int cmp2(const void *a,const void *b) { return (*(struct zuoye *)a).start-(*(struct zuoye *)b).start; }
void init() { n1=1; //初始时只有一个空闲区 n2=0; //初始没有作业 kongxian[0].start=0; kongxian[0].end=1023; kongxian[0].length=1024; }
void print1() //打印空闲分区 { int i; for(i=0;i } void print2() //打印作业分区 { w 束:%d 长 .. int i; for(i=0;i } int main() { int i,j,k,t,len,flag,id; int front,middle, behind; int t1,t2; init(); print1(); printf(\输入1装入新作业,输入0回收作业,输入-1结束\\n\ while(scanf(\ { if(t==1) //装入新作业 { printf(\请输入作业的占用空间的长度 \ scanf(\ flag=0; for(i=0;i { for(j=i;j w .. kongxian[j].start=kongxian[j+1].start; kongxian[j].end=kongxian[j+1].end; kongxian[j].length=kongxian[j+1].length; } n1--; } else //该空闲分区部分用于分配,剩余的留在空闲分区中 { kongxian[i].start+=len; kongxian[i].length-=len; } } } else if(t==0) { printf(\输入要回收的作业ID \ scanf(\ front=middle=behind=0; for(i=0;i { front=1; t1=i; } if(kongxian[i].start==zuoye[id].end) //待回收的作业下面有空闲分区 { behind=1; t2=i; } } if(!front&&!behind) //待回收的作业上下均没有空闲分区 { kongxian[n1].start=zuoye[id].start; kongxian[n1].end=zuoye[id].end; kongxian[n1].length=zuoye[id].length; n1++; //空闲分区增加一个 qsort(kongxian,n1,sizeof(struct kongxian),cmp1); //插入空闲分区后排序 for(j=id;j w .. { zuoye[j].start=zuoye[j+1].start; zuoye[j].end=zuoye[j+1].end; zuoye[j].length=zuoye[j+1].length; w } n2--; } if(front &&behind) //待回收的作业上下均有空闲分区 middle=1; if(front&&!middle) //合并待回收的作业和上面的空闲分区 { kongxian[t1].end+=zuoye[id].length; kongxian[t1].length+=zuoye[id].length; for(j=id;j if(behind &&!middle) //合并待回收的作业和下面的分区 { kongxian[t2].start-=zuoye[id].length; .. kongxian[t2].length+=zuoye[id].length; for(j=id;j w