📄 复件 xdy.cpp
字号:
#include<iostream.h>
class List;
class ListNode
{
friend class List;
public:
ListNode(int item);
int getdata(){return data;}
ListNode *NextNode(){return link;}
ListNode *getnode(int item,ListNode *next);
private:
int data;
ListNode *link;
};
class List
{
public:
int Insert(int x, int i);
void Remove(int i);
List(int value){last=first=new ListNode(value);};
~List();
void makeempty();
ListNode *getfirst(){return first;}
ListNode *getlast(){return last;}
int get(int i);
void printf();
int find(int value);
void Remove(int name,int length);
int Length();
int find1(int k,int h);
int jack(int h);
void AA(int n,int h);
private:
ListNode * first,* last;
};
ListNode::ListNode(int item)
{
data=item;
link=NULL;
}
ListNode *ListNode::getnode(int item,ListNode *next)
{
ListNode *newnode=new ListNode(item);
newnode->link=next;
return newnode;
}
void List::makeempty()
{
ListNode *q;
while(first!=NULL){
q=first;first=q->link;delete q;}
last=first;
}
int List::Insert(int x, int i)//插入name
{
ListNode *p=first;int k=0;
while(p!=NULL&&k<i-1)
{
p=p->link;
k++;
}
if(p==NULL&&first!=NULL)
{
cout<<"Invaid position for Iosertation! \n";
return 0;
}
ListNode *newnode=new ListNode(x);
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;
}
void List::Remove(int i)//删除第i个数
{
ListNode *p=first,* q;int k=0;
while(p!=NULL&&k<i-1)
{
p=p->link;
k++;
}
if(p==NULL||p->link==NULL)
{
cout<<"Invalid position for Deletion!\n";
}
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;
}
List::~List()
{
ListNode *p;
while(first!=NULL)
{
p=first;first=first->link;delete p;
}
}
int List::get(int i)
{
ListNode *q=first;int h;
for(int j=0;j<i;j++)
{
if(q->link==NULL)
{ cout<<"Invalid position for Deletion!\n"<<endl;
return 0;
}
q=q->link;
}
h=q->data;
return h;//返回值
}
void List::printf()
{
ListNode *p=first;int k;
while(p!=NULL){k=p->data;p=p->link;cout<<k<<" ";}
}
int List::find(int value)//返回地址
{
ListNode *p=first;int i=0;
while(p!=NULL&&p->data!=value){p=p->link;i++;}
return i;
}
void List::Remove(int name,int length)//删除名为name,大小为length
{
int a=find(name);
for(int i=0;i<length;i++){Remove(i);Insert(0,i);}
}
int List::Length()
{
ListNode* p=first;int count=0;
while(p!=NULL){p=p->link;count++;}
return count;
}
int List::find1(int k,int h )//定位
{
int i=find(0);
if((i+h)<Length()){for(int j=0;j<h;j++){if(get(i+1)!=0){return 0;}
else i++;
continue;}}return 1;
}
int List::jack(int h)
{
int b[100];int k=0;
for(int i=0;i<Length();i++)
{
if(get(i)!=0){b[i]=0;}
else {b[i]=i;}
}
for(int n=0;n<(Length()-h);n++)
{
for(int i=n;i<(h+n);i++)
{
k+=b[i];
}
if(k=0)return n;
}return 0;
}
void List::AA(int n,int h)
{
int b[100];
for(int i=0;i<Length();i++)
{if(get(i)!=0){b[i]=1;}
else b[i]=0;}
for(int k=0;k<(Length()-h);k++)
{int m=0;
for(i=k;i<h+k;i++){m+=b[k];}
if(m=0){for(i=0;i<h;i++)Remove(k);
for(i=0;i<h;i++)Insert(n,k);}}
}
void main()
{
List a(0);
a.makeempty ();
int length;
cout<<"请输入内存的大小,用0表示内存未被使用: ";
cin>>length;
for(int j=0;j<length;j++)
a.Insert(0,j);a.printf();cout<<endl;
cout<<"以1代表操作系统 请输入操作系统的大小:"<<endl;
int len,x;cin>>len;if(len>length){cout<<"worng"<<endl;goto end;}
else {for(int f=0;f<len;f++)a.Remove(0);
for(int s=0;s<len;s++)a.Insert(1,0);
a.printf();cout<<endl;
cout<<"此时内存的空闲空间为:";
x=length-len;
cout<<x<<endl;}
char k;
while(k)
{cout<<"请选择:输入1时进行内存分配;输入2时进行内存回收;输入3时进行合并;输入4时退出程序!"<<endl;
cin>>k;
switch(k)
{
case '1':int n,h,g;
cout<<"输入作业名(0除外)和大小:";
cin>>n>>h;g=a.find(0);
if((g+h)>=length){cout<<"worng";}
else {int b[100];
for(int i=0;i<a.Length();i++)
{if(a.get(i)!=0){b[i]=1;}
else b[i]=0;}
for(int k=0;k<(a.Length()-h);k++)
{int m=0;
for(i=k;i<h+k;i++){m+=b[k];}
if(m=0){for(i=0;i<h;i++){a.Remove(k);
a.Insert(n,k);}}} a.printf();cout<<endl;}
if(h<=x)
{
cout<<"此时内存的空闲空间为:"<<x-h<<endl;
x-=h;
}
else cout<<"内存空间不够,无法分配"<<endl;
break;
case '2': cout<<"输入要回收的作业名和大小";int name,l,j,b;cin>>name>>l;
j=a.find(name);if(a.get(j+l-1)!=name){cout<<"内存回收大于已分配的内存!"<<endl;}
else {for(b=0;b<l;b++)a.Remove(j);
for(b=0;b<l;b++)a.Insert(0,j);
cout<<"此时内存的空闲空间为:"<<x+l<<endl;
x=x+l;
a.printf();cout<<endl;}
break;
case '3':
cout<<"你现在进行的是合并操作,你可以多次选择此操作,直到内存中只有一端有空闲空间"<<endl;
a.Remove(a.find(0));
a.Insert(0,length-2);a.printf ();cout<<endl;
break;
case '4':goto end;
}
}
end:;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -