设计动态分区首次适应分配、回收算法

  1. 设计动态分区首次适应分配、回收算法。
  2. 设计“未分配区说明表”,格式为: 序号 始址 长度 状态
  3. 设计“已分配区说明表”,格式为: 作业名 始址 长度 状态

  4. 设计显示程序,将“未分配区说明表”和“已分配区说明表”的 内容,显示在屏幕上

  5. 初始分配从一个空闲区分配起,回收时要合并空区。

     
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<windows.h>
    
    #define N 5
    #define MINSIZE 0.5
    
    typedef struct EMP
    {
    	int num;
    	int start;
    	int length;
    	int status;
     
    }EMP;
    typedef struct USE
    {
    	int num;
    	int start;
    	int length;
    	int status;
    	char pname[10];
    }USE;
    
    void show(EMP e[], USE u[])
    {
    	int i;
    	printf("************空闲分区表************\n");
    	printf("分区编号  起始地址  长度  状态\n");
    	for (i = 0;i < N;i++)
    	{
    		if (e[i].status == 1)
    			printf("  %d        %d      %d    %d\n", i, e[i].start, e[i].length, e[i].status);
    	}
    	printf("\n************分区使用表*************\n");
    	printf("编号  起始地址  长度  状态  作业名\n");
    	for (i = 0;i < N;i++)
    	{
    		if (u[i].status == 1)
    			printf("  %d      %d     %d    %d   %s\n", i, u[i].start, u[i].length, u[i].status, u[i].pname);
    	}
    
    }
    
    
    void fenpei(EMP e[], USE u[])
    {
    	char name[10];
    	int i,j,k,space=0;
    	printf("请输入作业名:\n");
    	scanf("%s", name);
    	printf("请输入请求的内存空间:\n");
    	scanf("%d", &space);
    	for ( i = 0;i < N;i++)
    		if (e[i].status == 1 && e[i].length > space)
    			break;
    	if (i == N) printf("wait a monnent\n");
    	else
    	{
    		k = e[i].length - space;
    		if (k >= MINSIZE)			
    		{
    			e[i].start = e[i].start+space;
    			e[i].length = k;
    		}
    		else e[i].status = 0;
    		for (j = 0;j < N;j++)
    		{
    			if (u[j].status == 0)
    			{
    				u[j].start = e[i].start-space;
    				u[j].length = space;
    				u[j].status = e[i].status;
    				strcpy(u[j].pname,name);
    				break;
    			}
    			printf("分配成功!\n");
    		}
    	}
    }
    
    void huishou(EMP e[], USE u[])
    {
    	char name[10];
    	int i,n,m,j;
    	printf("请输入结束的作业名:\n");
    	scanf("%s", &name);
    	getchar();
    	for (i = 0;i < N;i++)
    		if(strcmp(u[i].pname,name)==0)
    		{ 
    			u[i].status = 0;
    			for(m=0;m<N;m++)
    				for (n= 0;n < N;n++)
    				{
    					if (e[n].start + e[n].length == u[i].start)
    						if (e[m].start = u[i].length + u[i].start)//有上下相邻的空闲分区
    						{
    								e[n].length = e[n].length + e[m].length + u[i].length;
    								e[m].status = 0;
    						}
    						else e[n].length = e[n].length + u[i].length;//只有上相邻的空闲分区
    					else//无上相邻
    						if (e[m].start == u[i].length + u[i].start)//只有下相邻的空闲分区
    						{
    							e[m].length = e[m].length + u[i].length;
    							e[m].start = u[i].start;
    						}
    				}
    			if (m = N && n != N)
    				for(j=0;j<N;j++)
    					if (e[j].status == 0)
    					{
    						e[j].start = u[i].start;
    						e[j].length = u[i].length;
    						e[j].status = u[i].status;
    				    }	
    			printf("回收成功!\n");
    			break;
    		}
    	for (i = 0;i < N - 1, e[i].status == 1;i++)//按首次适应算法调整空闲分区表的顺序
    		for (j = i + 1;j < N, e[j].status == 1;j++)
    			if (e[j].start < e[i].start) {
    				EMP temp;
    				temp = e[j];
    				e[j] = e[i];
    				e[i] =temp;
    			}
    	if (i == N) printf("未找到!");
    }
    
    void main()
    {
    	EMP e[N];
    	USE u[N];
    	e[0].start = 400;
    	e[0].length = 2160;
    	e[0].status = 1;
    	u[0].status = 0;
    	for (int i = 1;i < N;i++)
    	{
    	  u[i].status = 0;
    	  e[i].status = 0;
        }
    	int sel, flag=1;
    	while (flag) {
    		printf("************系统菜单************\n");
    		printf("\t1\t分配\n");
    		printf("\t2\t回收\n");
    		printf("\t3\t显示\n");
    		printf("\t0\t退出\n");
    		printf("*********************************\n");
    		printf("input your choice:");
    		scanf("%d",&sel);
    		getchar();
    		switch (sel)
    		{
    		case 1:fenpei(e, u);break;
    		case 2:huishou(e, u);break;
    		case 3:show(e, u);break;
    		case 0:flag = 0;break;
    		}
    	}
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值