ono。纠结一下午。大一的校赛题,大三才解决,而且算是做了操作系统的作业。嘿嘿,偷懒下。
过段时间,贴上代码。
最佳适配算法,要选择足够大的而且最左边的。。。
#include <stdio.h>
struct node{
bool state;
short id;
short pre,next;
}m[110];
void Initial()
{
int i;
for(i=0;i<=101;++i)
{
m[i].id = 0;
m[i].pre = 1;
m[i].next = 101;
m[i].state = false;
}
}
bool Creat(int pid,int ps)
{
int now = 1,pos = 0;
while(now<=100)
{
if(!m[now].state)
{
if(m[now].next-now>=ps)
{
pos = now;
break;
}
}
now = m[now].next;
}
if(pos>0)
{
if(pos+ps<m[pos].next)
{
m[pos+ps].next = m[pos].next;
m[pos+ps].pre = pos;
m[pos+ps].state = false;
m[pos+ps].id = 0;
m[m[pos].next].pre = pos + ps;
m[pos].next = pos + ps;
}
m[pos].state = true;
m[pos].id = pid;
return true;
}
return false;
}
int Delete(int pid)
{
int now = 1,ps;
while(now<=100)
{
if(m[now].id==pid)
{
ps = m[now].next - now;
if(!m[m[now].pre].state&&!m[m[now].next].state)
{
m[m[now].pre].next = m[m[now].next].next;
m[m[m[now].next].next].pre = m[now].pre;
}
else if(!m[m[now].pre].state)
{
m[m[now].pre].next = m[now].next;
m[m[now].next].pre = m[now].pre;
}
else if(!m[m[now].next].state)
{
m[m[m[now].next].next].pre = now;
m[now].next = m[m[now].next].next;
}
m[now].id = 0;
m[now].state = false;
return ps;
}
now = m[now].next;
}
return 0;
}
void Print()
{
int now = 1;
while(now<=100)
{
if(m[now].state)
printf("P %d %d\n",m[now].id,m[now].next-now);
else
printf("H %d\n",m[now].next-now);
now = m[now].next;
}
}
int main()
{
int t,pid,ps;
char ch[10];
scanf("%d",&t);
Initial();
while(t)
{
scanf(" %s",ch);
if(ch[0]=='E')
{
Initial();
t--;
continue;
}
else if(ch[0]=='C')
{
scanf(" %d%d",&pid,&ps);
if(Creat(pid,ps))
printf("Create process %d of size %d successfully!\n",pid,ps);
else
printf("No enough memory!\n");
}
else if(ch[0]=='D')
{
scanf(" %d",&pid);
ps = Delete(pid);
if(ps>0)
printf("Delete process %d of size %d successfully!\n",pid,ps);
else
printf("No such process!\n");
}
else if(ch[0]=='P')
Print();
}
return 0;
}