📄 内存管理.cpp
字号:
#include<iostream.h>
#include<conio.h>
class list;
class node{
friend class list;
public:
node(int a=0,int b=0,node*next=NULL):data(a),size(b),link(next){}
private:
int data;
int size;
node *link;
};
class list{
public:
list():last(NULL),first(NULL){}
~list();
int insert(int x,int y,int i);
int judg(int b);
int judgg(int x);
int jia(int jia);
int jiaa(int jiaa);
int remove(int a);
int find(int value);
int judggg();
int jiaaa();
void print();
void makeempty(){
while(first!=NULL){node *q=first;
first=q->link;delete q;
}
}
private:
node * first;
node * last;
};
list::~list(){
makeempty();
}
int list::find(int value){
node *p=first; int i=0;
while(p!=NULL && p->data!=value){p=p->link;i++;}
return i;
}
int list::insert(int x,int y,int i){
node *p=first;int k=0;
while(p!=NULL&&k<i-1){p=p->link;k++;}
if(p==NULL && first!=NULL){
cout<<"出错!"<<endl;
return 0;
}
node* newnode=new node(x,y,NULL);
if(first==NULL || i==0){
newnode->link=first;
if(first==NULL) last=newnode;
first=newnode;
}
else{
newnode->link=p->link;
if(p->link==NULL)last=newnode;
p->link=newnode;
}
return 1;
}
int list::remove(int i){
node *p=first;node *q;int k=0;
while(p!=NULL&&k<i-1){p=p->link;k++;}
if(i==0){q=first;p=first=first->link;}
else{q=p->link;p->link=q->link;}
if(q==last)last=p;
k=q->data;delete q;return k;
}
int list::judg(int b){int z;int zz=0;
if(first!=NULL){
node *s=first;
while(s!=NULL){
int y=s->size;z=s->data;
if(y==b){int d=find(z);remove(d);zz=1;break;}
else if(y>b){int e=y-b;int g=find(z);
int f=z+b;insert(f,e,g+1);remove(g);zz=1;break;}
else s=s->link;
} if(zz==0){cout<<"空间不足"<<endl;z='x';}
}
else{cout<<"空间不足"<<endl;z='x';}
return z;}
void list::print(){
node *p=first;
while(p!=NULL){
cout<<"起始地址:"<<p->data<<" 内存空间:"<<p->size<<endl;
p=p->link;
}
}
int list::jia(int jia){
node* p=first;
for(int i=0;i<jia;i++){
p=p->link;}
return p->size;}
int list::jiaa(int jiaa){
node* p=first;
for(int i=0;i<jiaa;i++){
p=p->link;}
return p->data;}
int list::judgg(int x){
node *p=first;int y;int z=0;
while(p!=NULL){
if(p->data>x){y=find(p->data);z=1;break;}
p=p->link;
}if(z==0)return -1;
if(z==1)return y;
}
int list::jiaaa(){
int a=find(last->data);
return a;
}
int list::judggg(){
if(first==NULL)return 0;
else return 1;
}
void main(){
list a; list c;cout<<"现有一块1000的内存供分配:"<<endl;
a.insert(0,1000,0);
int n; while(1){
cout<<"请选择1:分配,2:回收"<<endl;
cin>>n;
if(n==1){cout<<"请输入你要分配的内存大小"<<endl;
int b;cin>>b;int x=a.judg(b);cout<<"空闲的内存:"<<endl;a.print();
if(x=='x'){cout<<"运行的内存:"<<endl;c.print();}
else{c.insert(x,b,0);cout<<"运行的内存:"<<endl;c.print();}
}
if(n==2){cout<<"请输入你要结束的内存空间的首地址:"<<endl;
int aa;cin>>aa;
int bb=c.find(aa);int dd=c.jia(bb);c.remove(bb);int cc=a.judggg();
if(cc==0){a.insert(aa,dd,0);}
else{
int ee=a.judgg(aa);
if(ee!=-1){
int hh=a.jiaa(ee);
int ff=a.jiaa(ee-1);int gg=a.jia(ee-1);
int ss=a.jia(ee);int xx=0;int zz=0;
if(ff+gg==aa){a.remove(ee-1);a.insert(ff,dd+gg,ee-1);xx=1;
if(dd+gg+ff==hh){a.insert(ff,dd+gg+ss,ee);
a.remove(ee+1);a.remove(ee-1);}zz=1;}
if(zz=0){
if(aa+dd==hh){a.remove(ee);a.insert(aa,dd+ss,ee);xx=1;}}
if(xx==0){a.insert(aa,dd,ee);}
}
else{int aaa=a.jiaaa();int bbb=a.jia(aaa);
int ccc=a.jiaa(aaa);int xx=0;
if(ccc+bbb==aa){a.remove(aaa);a.insert(ccc,bbb+dd,aaa);xx=1;}
if(xx==0){a.insert(aa,dd,aaa+1);}
}
}
cout<<"空闲的内存:"<<endl;a.print();
cout<<"运行的内存:"<<endl;c.print();
}
}
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -