{
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