📄 zuijiashiyingsuanfa.cpp
字号:
#include <stdio.h>//在根目录查找stdio.h
#include <stdlib.h>//在根目录下查找stdlib.h
#include <conio.h>//在根目录下查找conio.h
#include <dos.h>//在根目录下查找dos.h
#include <iostream.h>//在根目录下查找iostream.h
#define n 200//定义分配的最大值
#define m 200//定义空闲区最大值
#define minsize 10//定义最小空间为10
//#define getpch(type)(type*)mallco(sizeof(type))
struct{//定义分配区表
int address;//定义分配地址
int length;//定义分配长度
int flag;//分配状态
}used[n];
struct{//定义空闲区表
int address;//定义空闲地址
int length;//定义空闲长度
int flag;//空闲状态
}kongxian[m];
void allocate(char p,int x)//分配函数
{
int ad;//地址
int l=0;//用来放当前空闲区
int i=0;//容量
if(kongxian[i].length>=x&&kongxian[i].flag==0)//容量大于x并且未被分配
{if(kongxian[i].length<kongxian[l].length)//比全部都小
l=i;
{if(kongxian[l].length-x<minsize)//如果当前的空闲区(kongxian[l].length-x)小于minsize
{x=kongxian[l].length;//把空闲区l的长度kongxian[l]赋给x
ad=kongxian[l].address;}//把空闲区l的地址kongxian[l]赋给地址ad
}
}
else
{kongxian[l].length=kongxian[l].length-x;//空闲区l的长度kongxian[l]的长度指向空闲区l的长度kongxian[l]的长度减去x
kongxian[l].address=kongxian[l].address+x;//空闲区l的地址kongxian[l]指向kongxian[l]的地址加x
}
}
void Recycled(int j)//回收函数
{int s=0;//容量
while ((used[s].flag!=j)||(used[s].flag==0)&&s<n)//当used[s].flag不等于j或used[s].flag等于0并且s小于分配区的最大值n
{ s++;//s加1
}
if(s>n)//如果s大于分配区的最大容量n
printf("未找到该作业");//打印未找到该作业
int a;//地址
int len;//长度
a=used[s].address;//把分配区s的地址used[s]的地址赋给地址a
len=used[s].length;//把分配区s的长度used[s]的长度赋给长度len
int i=0;
int k=-1;//上邻
int h=-1;//下邻
if(kongxian[i].address+kongxian[i].length==s)//如果空闲区i的地址kongxian[i].address加上空闲区i的长度kongxian[i].length等于容量s
k=i;//把i赋给上邻k
if(kongxian[i].address==a+len)//如果空闲区i的地址kongxian[i].address等于地址a加上长度len
h=i;//把i赋给下邻h
if(k!=-1)//如果上邻k!=-1
if(h!=-1)//如果下邻h!=-1
kongxian[k].length=kongxian[k].length+len+kongxian[h].length;//空闲区k的长度kongxian[k].length加上长度len再加上空闲区h的长度kongxian[h].length赋给空闲区k的长度kongxian[k].length
else
{kongxian[k].length=kongxian[k].length+len;//空闲区k的长度kongxian[k].length加上长度len赋给空闲区k的长度kongxian[k].length
kongxian[k].address=kongxian[k].address;//空闲区k地址kongxian[k].address不变
}
else
{kongxian[h].address=a;//把地址a赋给分配区h的地址
kongxian[h].length=len+kongxian[h].length;//长度len加上空闲区h的长度kongxian[h].length赋给空闲区h的长度kongxian[h].length
}
}
void main()
{ //初始化空闲区表
kongxian[0].address=100;//空闲区表的起始地址等于100
kongxian[0].length=1024*2;//空闲区的起始地址等于1024*2
kongxian[0].flag=1;//状态为1表示空闲区表未被分配,状态为0表示空闲区表未被使用
int i,b;
int xk=0;//长度
int y=0;//作业名
for(i=1;i<m;i++)
{ kongxian[i].flag=0;//空闲区i状态为0表示未被使用
}
//初始化已分配区表
for(i=0;i<n;i++)
{ used[i].flag=0;//状态为1表示分配区表已分配,状态为0表示分配区表未被分配
{ printf("选择功能项(0~退出,1~分配主存,2~回收主存,3~显示主存)\n");//打印选择功能项(0~退出,1~分配主存,2~回收主存,3~显示主存)
printf("选择功能项(0~3)");//打印选择功能项(0~3)
scanf("%d",&b);//从键盘输入a值
switch(b)
{ case 0:exit(0);//退出
case 1:printf("输入作业名和所需长度xk:\n");//打印输入作业名和所需长度xk
scanf("%d%d",&y,&xk);//从键盘输入输入作业名y和所需长度xk
allocate(y,xk);//调用分配函数allocate(y,xk)
break;//退出
case 2:printf("回收主存\n");//打印回收主存
printf("输入作业名");
scanf("%d",&y);
Recycled(y);//调用回收函数Recycled(y)
break;//退出
case 3:printf("输出空闲区表:起始地址,分配长度, 标志\n");//打印输出空闲区表:起始地址,分配长度, 标志
for(i=0;i<m;i++)
{printf("%d,%d,%d",kongxian[i].address,kongxian[i].length,kongxian[i].flag);//打印空闲区i的地址kongxian[i].address,空闲区i的长度kongxian[i].length,空闲区i的状态kongxian[i].flag
}
break;//退出
//显示已分配区表
default:printf("没有该选项\n");//打印没有该选项
break;//退出
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -