FOJ 1893 内存管理

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值