📄 cpp1.cpp
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
//#include<iomanip.h>
#include<stdlib.h>
const int MAXJOB=100;//定义表最大记录数
typedef struct node{
int adr;
int length;
char tag[20];
}job;
job frees[MAXJOB];//定义空闲区表
int free_num=0;
job used[MAXJOB];//定义已分配区表
int used_num;
//初始化函数
void ready()
{
int i;
for(i=0;i<MAXJOB;i++){
frees[i].adr=-1;
frees[i].length=0;
strcpy(frees[i].tag,"free");
used[i].adr=-1;
used[i].length=0;
strcpy(used[i].tag,"");
}
free_num=0;
used_num=0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
int create_free() //申请空间
{ int j=0;
int k=32767;
frees[free_num].adr=j;
frees[free_num].length=k;
free_num++;
return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////
//order
void order() //按首地址从小到大排序
{
int i,k,j,p,h,m,n;
for(k=0;k<free_num-1;k++)
{
p=k;
for(j=k+1;j<free_num;j++)
{
if(frees[j].adr<frees[p].adr) { p=j; }
}
if(p!=k)
{
frees[free_num]=frees[k];
frees[k]=frees[p];
frees[p]=frees[free_num];
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////
//显示函数
void print()
{
int i;
cout<<"***********************************************************"<<endl;
cout<<"当前空闲表:"<<endl;
cout<<"序号 起始地址 长度 终止地址 状态"<<endl;
for(i=0;i<free_num;i++){
cout.setf(2);
cout.width(12);
cout<<i+1;
cout.width(10);
cout<<frees[i].adr;
cout.width(10);
cout<<frees[i].length;
cout.width(9);
cout<<frees[i].adr+frees[i].length-1;
cout.width(8);
cout<<frees[i].tag<<endl;
}
cout<<"***********************************************************"<<endl;
cout<<"当前已分配表:"<<endl;
cout<<"序号 起始地址 长度 终止地址 占用作业名"<<endl;
for(i=0;i<used_num;i++){
cout.setf(2);
cout.width(10);
cout<<i+1;
cout.width(12);
cout<<used[i].adr;
cout.width(8);
cout<<used[i].length;
cout.width(15);
cout<<used[i].adr+used[i].length-1;
cout.width(8);
cout<<used[i].tag<<endl;
}
}
///////////////////////////////////////////////////////////////////////////////////////////
//最先适应分配算法
int first_fit()
{
char job_name[20];
int job_length;
int i,j,flag,t;
cout<<"请输入新申请内存空间的作业名 : ";
cin>>job_name;
cout<<"请输入新申请内存空间的大小 : ";
cin>>job_length;
flag=0;
for(i=0;i<free_num;i++)
{
if(frees[i].length>=job_length){ flag=1; } //判断是否能够满足申请
}
if(flag==0)
{
cout<<endl<<"申请失败,请稍候再试!"<<endl;
return 1;
}
else
{
t=0;
i=0;
while(t==0) //按顺序寻找满足条件的分区
{
if(frees[i].length>=job_length){ t=1; }
i++;
}
i--; //分配
used[used_num].adr=frees[i].adr;
strcpy(used[used_num].tag,job_name);
used[used_num].length=job_length;
used_num++;
if(frees[i].length>job_length) //判断空闲区的长度是否大于申请
{
frees[i].adr+=job_length;
frees[i].length-=job_length;
}
else
{
for(j=i;j<free_num-1;j++)
{ frees[j]=frees[j+1]; }
free_num--;
}
cout<<"内存空间分配成功!"<<endl;
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////
//最优适应分配算法
int best_fit()
{
char job_name[20];
int job_length;
int i,j,flag,t;
cout<<"请输入新申请内存空间的作业名 : ";
cin>>job_name;
cout<<"请输入新申请内存空间的大小 : ";
cin>>job_length;
flag=0;
for(i=0;i<free_num;i++) //判断是否能够满足申请
{
if(frees[i].length>=job_length){ flag=1; }
}
if(flag==0){
cout<<endl<<"申请失败,请稍候再试!"<<endl;
return 1;}
else{
t=0;
i=0;
while(t==0){
if(frees[i].length>=job_length){ t=1; }
i++;
}
i--;
for(j=0;j<free_num;j++) //找出最小满足申请的空闲分区
{
if((frees[j].length>=job_length)&&(frees[j].length<frees[i].length)){
i=j;
}
}
//分配
used[used_num].adr=frees[i].adr;
strcpy(used[used_num].tag,job_name);
used[used_num].length=job_length;
used_num++;
//判断空闲分区的长度是否大于申请
if(frees[i].length>job_length){
frees[i].adr+=job_length;
frees[i].length-=job_length;
}
else{
for(j=i;j<free_num-1;j++){
frees[j]=frees[j+1];
}
free_num--;
}
cout<<"内存空间分配成功!"<<endl;
}
return 0;}
/////////////////////////////////////////////////////////////////////////////////////////
//最优回收算法
int best_back()
{
char job_name[20];
int i,j,flag,p=0;
int adr;
int length;
cout<<"请输入要撤消的作业名:";
cin>>job_name;
flag=-1;
for(i=0;i<used_num;i++) //寻找是否有此作业名
{
if(!strcmp(used[i].tag,job_name))
{
flag=i;
adr=used[i].adr;
length=used[i].length;
}
}
if(flag==-1){ cout<<"没有这个作业名"<<endl;return 1; }
else
{
//加入空闲表
for(i=0;i<free_num;i++)
{
if((frees[i].adr+frees[i].length)==adr) //上下相邻
{
if(((i+1)<free_num)&&(frees[i+1].adr==adr+length))
{
frees[i].length=frees[i].length+frees[i+1].length+length;
for(j=i+1;j<free_num;j++)
{
frees[j]=frees[j+1];
}
free_num--;
p=1;
}
else
{
frees[i].length+=length; //下相邻
p=1;
}
}
if(frees[i].adr==(adr+length)){ //上相邻
frees[i].adr=adr;
frees[i].length+=length;
p=1;
}
}
}
//无相邻
if(p==0){
frees[free_num].adr=adr;
frees[free_num].length=length;
free_num++;
}
//删除分配表中的该作业
for(i=flag;i<used_num;i++){
used[i]=used[i+1];
}
used_num--;
return 0;}
//显示函数
void start()
{
cout<<"\n ************************************************"<<endl;
cout<<" * 可变分区存储管理模拟系统 *"<<endl;
cout<<" ************************************************"<<endl;
cout<<" * 姓名: 蔡得怀 *"<<endl;
cout<<" * 学号: 20064440222 *"<<endl;
cout<<" * 班级: 计算机0602 *"<<endl;
cout<<" ************************************************"<<endl;
}
void main()
{
int k=0;
int flag=0;
int t=1;
char chioce='0',ch1='0',ch2;
start();
ready();
flag=create_free();
print();
while(flag==1){
k=0;
cout<<"***********************************************************"<<endl;
cout<<" 1.申请空间 2.回收空间 0.退出"<<endl;
cout<<"***********************************************************"<<endl;
cout<<"请选择:";
cin>>chioce;
switch(chioce){
case '1':
cout<<"1.最先适应分配算法 2.最优适应分配算法 ch1: ";
cin>>ch1;
switch(ch1)
{
case '1':k=first_fit(); if(k==0) order(), print(); break;
case '2':k=best_fit(); if(k==0) order() ,print(); break;
default:k=first_fit(); if(k==0) order(),print(); //默认为最先适应分配算法
}
break;
case '2':
k=best_back(); if(k==0) order(),print(); break;
case '0':
flag=0;
break;
default:
cout<<"选择错误!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -