_memory.h
#include<string>
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct Lnode
{
string name;
int startaddress;
int size;
int state;
string sign;
}Lnode;
typedef struct process
{
string name;
int size;
}Process;
void _print();
static void _First_Distribution();
void _First_Distribution_Print();
static void _Cycle_First_Distribution();
void _Cycle_First_Distribution_Print();
static void _Worst_Distribution();
void _Worst_Distribution_Print();
static void _Best_Distribution();
void _Best_Distribution_Print();
static void _Recycle();
void _Recycle_Print();
static void _Merge_Blank_Partitions();
void _Merge_Blank_Partitions_Print();
_memory.cpp
#include<stdio.h>
#include<string>
#include"_memory.h"
#include<iostream>
using namespace std;
#define L 40
Lnode P[L] = { {"a",0,128,0},{"b",200,256,0},{"c",500,512,0},{"d",1500,1024},{"e",5000,2048}};
int Num = 5;
int f = 0;
int G = 30;
void _print()
{
int i = 0;
cout << "分区名字 起始地址 分区 状态" << endl;
for (i = 0; i < Num; i++)
{
for (int j = 0; j < Num - i - 1; j++)
{
if (P[j].startaddress > P[j + 1].startaddress)
{
swap(P[j], P[j + 1]);
}
}
}
for (i=0; i < Num; i++)
{
cout<<P[i].name << " " << P[i].startaddress << " " << P[i].size << " " << P[i].state << " " << endl;
}
}
static void _First_Distribution()
{
int i = 0;
Process A;
int log = 0;
cout << "输入请求分区的进程名字和大小" << endl;
cin >> A.name>>A.size;
for (; i < Num; i++)
{
if (P[i].size < A.size)
continue;
else
if (P[i].size ==A.size|| P[i].size - A.size < G)
{
P[i].state = 1;
P[i].sign = P[i].name;
P[i].name = A.name;
log = 1;
break;
}
else
{
P[Num].startaddress = P[i].startaddress +A.size;
P[Num].size = P[i].size - A.size;
P[Num].name = P[i].name;
P[i].size =A.size;
P[i].sign = P[i].name;
P[i].name = A.name;
P[i].state = 1;
log = 1;
Num++;
break;
}
}
if (log == 1 || i < Num)
{
cout << "地址分配成功" << endl;
cout << "地址分配成功后的状态" << endl;
_print();
}
else
{
cout << "没有足够的分配空间" << endl;
}
}
static void _Cycle_First_Distribution()
{
Process A;
int t = 0;
int log = 0;
cout << ("请输入需要分配分区的大小") << endl;
cin >> A.name >> A.size;
while (f < Num)
{
if (P[f].size <A.size)
{
f = f + 1;
if (f % Num == 0)
{
f = 0;
t = 1;
}
continue;
}
if (P[f].size == A.size && P[f].state != 1)
{
P[f].state = 1;
P[f].name = A.name;
log = 1;
f = f + 1;
break;
}
if (P[f].size > A.size && P[f].state != 1)
{
P[Num].startaddress = P[f].startaddress + A.size;
P[Num].size = P[f].size - A.size;
P[Num].name = P[f].name;
P[f].size = A.size;
P[f].sign = P[f].name;
P[f].name = A.name;
P[f].state = 1;
log = 1;
Num = Num + 1;
f = f + 1;
break;
}
}
if (log == 1)
{
cout << ("内存已经分配成功") << endl;
cout << ("内存分配后的状态:") << endl;
_print();
}
else
{
cout << ("没有足够的内存空间") << endl;
}
}
static void _Worst_Distribution()
{
int log = 0;
int t = 0;
Process A;
int i = 0;
int temp[L];
cout << ("请输入要分配分区的大小") << endl;
cin >> A.name >> A.size;
for (; i < Num; i++)
{
temp[i] = 0;
if (P[i].size < A.size)
{
continue;
}
else
if (P[i].size == A.size)
{
P[i].state = 1;
P[i].sign = P[i].name;
P[i].name = A.name;
log = 1;
break;
}
else
{
temp[i] = P[i].size - A.size;
}
}
if (log == 0)
{
for (i = 0; i < Num; i++)
{
if (temp[i] != 0)
{
t = i;
}
}
for (i = 0; i < Num; i++)
{
if (temp[i] != 0 && temp[i] > temp[t])
{
t = i;
}
}
P[Num].startaddress = P[t].startaddress + A.size;
P[Num].size = P[t].size - A.size;
P[Num].name = P[t].name;
P[t].size = A.size;
P[t].sign = P[t].name;
P[t].name = A.name;
P[t].state = 1;
log = 1;
Num = Num + 1;
}
if (log == 1||i<Num)
{
cout << ("内存已经分配成功") << endl;
cout << ("内存分配后的状态:") << endl;
_print();
}
else
{
cout << ("没有足够的内存空间") << endl;
}
}
static void _Best_Distribution()
{
int log = 0;
int t = 0;
Process A;
int i = 0;
int temp[L];
cout << ("请输入要分配分区的大小") << endl;
cin >> A.name >> A.size;
for (; i < Num; i++)
{
temp[i] = 0;
if (P[i].size < A.size)
{
continue;
}
else
if (P[i].size == A.size)
{
P[i].state = 1;
P[i].sign = P[i].name;
P[i].name = A.name;
log = 1;
break;
}
else
{
temp[i] = P[i].size - A.size;
}
}
if (log == 0)
{
for (i = 0; i < Num; i++)
{
if (temp[i] != 0)
{
t = i;
}
}
for (i = 0; i < Num; i++)
{
if (temp[i] != 0 && temp[i] < temp[t])
{
t = i;
}
}
P[Num].startaddress = P[t].startaddress + A.size;
P[Num].size = P[t].size - A.size;
P[Num].name = P[t].name;
P[t].size = A.size;
P[t].sign = P[t].name;
P[t].name = A.name;
P[t].state = 1;
log = 1;
Num = Num + 1;
}
if (log == 1 || i < Num)
{
cout << ("内存已经分配成功") << endl;
cout << ("内存分配后的状态:") << endl;
_print();
}
else
{
cout << ("没有足够的内存空间") << endl;
}
}
void _First_Distribution_Print()
{
cout << ("分配前状态为") << endl;
_print();
_First_Distribution();
}
void _Cycle_First_Distribution_Print()
{
cout << ("分配前状态为") << endl;
_print();
_Cycle_First_Distribution();
}
void _Worst_Distribution_Print()
{
cout << ("分配前状态为") << endl;
_print();
_Worst_Distribution();
}
void _Best_Distribution_Print()
{
cout << ("分配前状态为") << endl;
_print();
_Best_Distribution();
}
static void _Recycle()
{
Process A;
cout << ("请输入要回收的进程名字");
cin >>A.name;
int i = 0;
for (i = 0; i < Num; i++)
{
if (P[i].name == A.name)
{
P[i].state = 0;
P[i].name = P[i].sign;
}
}
}
void _Recycle_Print()
{
_Recycle();
_print();
}
static void _Merge_Blank_Partitions()
{
int i = 0;
for (i = 0; i < Num; i++)
{
for (int j = 0; j < Num - i - 1; j++)
{
if (P[j].startaddress > P[j + 1].startaddress)
{
swap(P[j], P[j + 1]);
}
}
}
for (i = 0; i < Num-1; i++)
{
if (P[i].state == 0 && P[i].startaddress + P[i].size == P[i + 1].startaddress)
{
P[i].name = P[i + 1].name;
}
}
for (i = 0; i < Num-1; i++)
{
if (P[i].name == P[i + 1].name)
{
P[i].size = P[i].size + P[i + 1].size;
P[i + 1] = P[Num-1];
Num = Num - 1;
for (i = 0; i < Num; i++)
{
for (int j = 0; j < Num - i - 1; j++)
{
if (P[j].startaddress > P[j + 1].startaddress)
{
swap(P[j], P[j + 1]);
}
}
}
}
}
}
void _Merge_Blank_Partitions_Print()
{
_Merge_Blank_Partitions();
_print();
}
main.cpp
#include<stdio.h>
#include<string>
#include"_memory.h"
#include<iostream>
using namespace std;
int main()
{
int run = 1;
while (run == 1)
{
int selct = 1;
while (selct == 1)
{
cout << "******************************************\n";
cout << "*****1.******** 首次适应算法 ************\n";
cout << "*****2.******** 循环首次适应算法 ************\n";
cout << "*****3.******** 最坏适应算法 ************\n";
cout << "*****4.******** 最佳适应算法 ************\n";
cout << "*****5.******** 回收已分配内存 ************\n";
cout << "*****6.******** 合并空白分区 ************\n";
int a;
cin >> a;
switch (a)
{
case 1:
_First_Distribution_Print();
break;
case 2:
_Cycle_First_Distribution_Print();
break;
case 3:
_Worst_Distribution_Print();
break;
case 4:
_Best_Distribution_Print();
break;
case 5:
_Recycle_Print();
break;
case 6:
_Merge_Blank_Partitions_Print();
break;
default:
break;
}
cout << "是否继续进行实验" << endl;
cout << "1继续 0退出" << endl;
cin >> selct;
}
cout << "是否更新数据再次进行实验" << endl;
cout << "1继续 0退出" << endl;
cin >> run;
}
return 0;
}