{
p=p->next; has=0; } }
if(has==0) /*输入作业名不存在*/ {
printf(\输入作业名错误!请重新输入!\\n\ input2(); } }
void init_sub() /*自动初始化空闲分区表*/ {
r=gettype(SUB);
strcpy(r->name,\r->addr=5; r->size=10; r->state='n'; sub=r; sub->pre=NULL;
s=gettype(SUB);
strcpy(s->name,\s->addr=20; s->size=120; s->state='n'; sub->next=s;
s->pre=sub; r=s;
r->next->next=NULL;
} void init_manual() /*手动初始化空闲分区表*/ {
int i,num3; char
s[][10]={\five\en\
printf(\请输入初始化空间块数,最大值10:\
scanf(\ for(i=0;i { r=gettype(SUB); printf(\块号:%s\\n\ strcpy(r->name,s[i]); printf(\输入块首地址:\ scanf(\ printf(\输入块的大小:\ scanf(\ r->state='n'; r->next=NULL; initsort(); /*按首尾将分区表连 s=gettype(SUB); 接起来*/ strcpy(s->name,\ } s->addr=160; s->size=40; s->state='n'; printf(\按任一键继续......\\n\ r->next=s; s->pre=r; r=s; s=gettype(SUB); getchar(); } strcpy(s->name,\ s->addr=220; s->size=10; s->state='n'; void disp() /*空闲分区表的显示函数 r->next=s; s->pre=r; r=s; */ { printf(\分区 首地址 长度 状态 \\n\ r=sub; s=gettype(SUB); strcpy(s->name,\ s->addr=250; s->size=20; s->state='n'; while(r!=NULL) r->next=s; { s->pre=r; 37 printf(\%s\\t\\t%d\\t\\t%d\\t\\t%c\\n\r->name,r->addr,r->size,r->state); r=r->next; } printf(\ } void disp2() /*显示已分配内存的作业表函数*/ { printf(\作业名 首地址 长度 状态 \\n\ p=as; while(p!=NULL) { printf(\%s\\t\\t%d\\t\\t%d\\t\\t%c\\n\p->name,p->addr,p->size,p->state); p=p->next; } printf(\} void firstfit(JCB *pr) /*首次适应算法对作业分区*/ { r=sub; /*从空闲表头开始寻找*/ while(r!=NULL) { if(((r->size)>(pr->size))&&(r->state=='n')) /*有空闲分区大于作业大小的情况*/ { system(\ system(\ flag=1; /*分配成 功标志位置1*/ q=pr; //q是已分配作业队列头指针 q->state='r'; lastsort(); /*对已分配作业按先后次序形成链表*/ printf(\作业%s的分区为[%s],首地址为%d.\\n\ break; } else if(((r->size)==(pr->size))&&(r->state=='n')) /*有空闲分区等于作业大小的情况*/ { pr->addr=r->addr; flag=1; /*分配成功标 志位置1*/ q=pr; lastsort(); /*插入已分配作业队列*/ //空闲分区已完成分配,应删除 if(r->pre==NULL) //该分区处在链表头 { sub=r->next; r->next->pre=NULL; } if(r->next==NULL) //该分区处在链表尾 { r->pre->next=NULL; } else //该分区处在链表中间 { r->pre->next=r->next; r->next->pre=r->pre; } printf(\作业%s的分区为 pr->addr=r->addr; r->size-=pr->size; // 更新空闲分区大小 r->addr+=pr->size; //更新空闲分区地址 38 [%s],首地址/*有下邻又有上邻*/ { s->size+=pr->size; r->pre->next=r->next; //合并上下邻需把指针指向下邻的下一个区域 邻标志位置1*/ } isup=1; /*上 为%d.\\n\ break; } else { r=r->next; } flag=0; } break; else /* if(flag==0) /*作业过大的情况*/ { printf(\作业%s长度过大,内存不足,分区分配出错!\\n\ is=1; } void reclfirst(JCB *pr) /*首次适应作业区域回收算法*/ { SUB *k; r=sub; while(r!=NULL) { } 继续搜索可能的上邻*/ { s=s->next; isup=0; /* 上邻标志位置0*/ } } if(isup==0) /*有下邻无上邻*/ { r->addr=pr->addr; r->size=pr->size; } break; } else { r=r->next; 位置0*/ isdown=0; /*下邻标志 if(r->addr==((pr->addr)+(pr->size))) /*作业回收区域有下邻*/ { pr->size+=r->size; s=sub; isdown=1; /*下邻标志 } } if(isdown==0) /*区域无下邻*/ { s=sub; while(s!=NULL) { 位置1*/ while(s!=NULL) { if(((s->addr)+(s->size))==(pr->addr)) /*无下邻但有上邻*/ if(((s->addr)+(s->size))==(pr->addr)) { 39 s->size+=pr->size; r->pre->next=k; k->pre=r->pre; r->pre=k; k->next=r; } break; } else { r=r->next; /*上邻空间+作业释放空间=新的区域空间*/ isup=1; /*上邻标志位置1*/ break; } else { } s=s->next; isup=0; /*上邻 标志位置0*/ } } } if(isup==0) /*无下邻且无上邻*/ { k=gettype(SUB); /*重新生成一个新的分区结点*/ if(r==NULL) /*新分区插入内存空间尾节点*/ { s=sub; strcpy(k->name,pr->name); while(s->next!=NULL) /*新空间名字*/ s=s->next; k->addr=pr->addr; k->size=pr->size; k->state='n'; r=sub; while(r!=NULL) { s->next=k; k->pre=s; k->next=NULL; } } 域 %s 己 回 if((r->addr)>(k->addr)) /*按分区首地址排列,回收区域插在合适的位置*/ { if(r==sub) } printf(\区收.\} /*新分区插入内存空间首节点*/ { k->next=r; r->pre=k; sub=k; void print() //初始化界面 { printf(\ printf(\*************\\n\ printf(\主存空间的分配与回收演示\\n\ printf(\ <<首次适应算法>>\\n\ printf(\ /*更新空闲队列首指针*/ k->pre=NULL; } else /*新分区插入内存空间中间*/ { 40