#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
struct map{
int s;//标志该表项是否空闲
int size; //本表项所指空闲区的大小。
int addr; //本表项所指分区的地址。
int name; //进程的名字
struct map*next,*prev; //本表项的前后表项。
int number;//唯一的进程标识
};
struct map *p,*q,*start;
float M=0;
int Num=0;
void show();//对内存信息进行输出
struct map * request();//输入内存信息
int recycle();//对内存空间进行回收
void begin();//初始化
void malloc(struct map *m);//分配空闲区的函数。
void init(){//初始化
p=(struct map *) malloc(sizeof(struct map));
p->prev=p->next=NULL;
p->addr=0;
p->s=0;
p->size=M;
p->name=0;
p->number=0;
q=p;
}
void malloc(struct map *m){//分配空闲区的函数。
start=q;
if((q->next==NULL)||(m->size<=q->size) &&(q->s==0)){
if(m->size==q->size){
q->s=1;
q->name=m->name;
m=q;
cout<<"内存分配成功!\n";//如果首次在空闲表表头找到空间而且空间大小刚好合适
q=start;
}
else if(m->size<q->size&&q->s==0) {
m->next=q;
m->prev=NULL;
q->prev=m;
m->addr=q->addr;
q->size=q->size-m->size;
q->addr=q->addr+m->size;
cout<<"内存分配成功!\n";//如果在表头找到了空间但是空间大小不相同
q=m;
}
else if((q->next==NULL&&q->s==1)||(q->next==NULL&&m->size>q->size)){
cout<<"没找到足够的可分配空间!\n";
}
}
else{
while( ((m->size)>(q->size)||(q->s)==1) && q->next!=NULL){
q=q->next;
}
if((q->size>=m->size)&&(q->s==0)){
if(m->size!=q->size){//将m插入到链表中 并且没在表头
m->next=q;
m->prev=q->prev;
q->prev->next=m;
q->prev=m;
m->addr=q->addr;
q->size=q->size-m->size;
q->addr=q->addr+m->size;
}
else{
q->s=1;q->name=m->name; //m->size==q->size 将m插入到链表中并且没在表头
}
cout<<"内存分配成功!\n";
}
else{
cout<<"没找到足够的可分配空间!\n";
}
q=start;
}
}
struct map * request(){ //输入内存信息
struct map *m;
m=(struct map *) malloc(sizeof(struct map));
Num++;
cout<<"输入要分配的内存名称:";cin>>m->name;
m->number=Num;
cout<<"输入要分配的内存大小:";cin>>m->size;
m->s=1;
return m;
}
void show(){//对内存信息进行输出
int i=0;
start=q;
/*输出空闲分区表*/
cout<<setw(10)<<"分区名称"<<setw(12)<<"分区大小"<<setw(12)<<"分区始址"<<setw(12)<<"分区状态"<<endl;
while(q->next!=NULL){
if(q->s==0){
cout<<setw(7)<<q->name<<setw(12)<<q->size<<setw(12)<<q->addr<<setw(14)<<"未分配"<<endl;
q=q->next;
i++;
}
else
q=q->next;
}
if((q->next==NULL)&&(q->s==0))
cout<<setw(7)<<q->name<<setw(12)<<q->size<<setw(12)<<q->addr<<setw(14)<<"未分配"<<endl;
q=start;
/*输出已分配分区表*/
if(q->name==0){
cout<<"";
}
else{
if(q->next==NULL&&q->s==1)
cout<<setw(7)<<q->name<<setw(12)<<q->size<<setw(12)<<q->addr<<setw(14)<<"已分配"<<endl;
while(q->next!=NULL){
if(q->s==1){
cout<<setw(7)<<q->name<<setw(12)<<q->size<<setw(12)<<q->addr<<setw(14)<<"已分配"<<endl;
q=q->next;
}
else
q=q->next;
}
if(q->next==NULL&&q->s==1)
cout<<setw(7)<<q->name<<setw(12)<<q->size<<setw(12)<<q->addr<<setw(14)<<"已分配"<<endl;
}
q=start;
}
int recycle(){//对内存空间进行回收
int k;
cout<<"请输入你想释放的内存空间名称:"; cin>>k;
start=q;
while((q->next!=NULL&&q->name!=k)||(q->next!=NULL&&q->s==0)){
q=q->next;
}
struct map *current;
current=q;
if(q->next==NULL && q->name!=k){
cout<<"没有找到您想释放的内存空间!\n";
q=start;
return 0;
}
else if(q->next!=NULL&&q->prev!=NULL){
if((q->prev->s==1)&&(q->next->s==1)){//前面后面都已分配出去
q->s=0;
cout<<"释放内存成功!\n"; }
else if(q->prev->s==0&&q->next->s==1){//前面未分配出去 后面已分配出去
q->prev->size= q->prev->size+q->size;
q->prev->next=q->next;
q->next->prev=q->prev;
delete current;
cout<<"释放内存成功!\n";}
else if(q->prev->s==1&&q->next->s==0){//后面未分配出去 前面已分配出去
q->next->size=q->next->size+q->size;
q->next->prev=q->prev;
q->prev->next=q->next;
q->next->addr=q->addr;
cout<<"释放内存成功!\n";
delete current;}
else if(q->prev->s==0&&q->next->s==0){//前面后面都未分配出去
if(q->next->next!=NULL) {
q->prev->size=q->prev->size+q->size+q->next->size;
q->prev->next=q->next->next;
q->next->next->prev=q->prev;
cout<<"释放内存成功!\n";
delete current->next;
delete current;
}
else if(q->next->next==NULL){// 到链表的最后面了
q->prev->size=q->prev->size+q->size+q->next->size;
q->prev->next=NULL;
cout<<"释放内存成功!\n";
delete current->next;
delete current; } } }
else{
if(q->next!=NULL&&q->prev==NULL){//该链表开始还未分配出去空间
if(q->next->s==0){ //后面未分配
q->next->size=q->size+q->next->size;
q->next->prev=NULL;
q->next->addr=q->addr;
start=q->next;delete current;
cout<<"释放内存成功!\n"; }
else if(q->next->s==1) {//后面已分配
q->s=0;cout<<"释放内存成功!\n";} }
else if(q->next==NULL){ //该链表最后
if(q->prev!=NULL){//指针的前面不为空
if(q->prev->s==0){
q->prev->size=q->prev->size+p->size;
q->prev->next=NULL;
cout<<"释放内存成功!\n";
delete current;
}
else if(q->prev->s==1){
q->s=0;cout<<"释放内存成功!\n";
}
}
else if(q->prev==NULL){
q->s=0;cout<<"释放内存成功!\n";
}
}
q=start;
}
q=start;
return 1;
}
int main() {
struct map *w;
int choice;
float m=0;
cout<<"*************模拟动态内存分配算法*************"<<endl;
cout<<"请输入模拟内存分配的模拟内存的大小:";cin>>m;M=m;
init();
int T=1;
while(T){
cout<<" 0-退出 1-分配内存 2-释放内存 3-显示内存 \n";
cout<<"______________________________________________\n";
cout<<"请输入功能号(0~3):";cin>>choice;
switch(choice){
case 1:w=request(); malloc(w);break;
case 2:recycle();break;
case 3:show();break;
case 0:cout<<"该模拟动态内存分配程序的演示过程结束,欢迎提出宝贵意见!"<<endl;T=0;break;
default:cout<<"输入的功能号无效,请正确选择功能号(0-3)!"<<endl;break;
}
};
return 0;
}
- 1
- 2
- 3
- 4
前往页