学习之路——内存分配

实现功能:

1)增加内存节点

2)删除内存节点

3)遍历所有内存节点

实现简介:

主要算法:双链表

主要数据结构: 节点结构体  已删除节点表

增加节点:判断是否存在 已删除节点 1.存在 删除最后元素 即删除表表长减一 -> 用 已删除节点表尾数据作为新节点num值

  2.不存在,num++,直接新建新节点                 

删除节点:从根节点Root 起找到要删除节点,删除


遍历所有节点:从根节点Root 遍历整个表
代码:不习惯写注释。。。

#include<iostream>
#include<new>
#include<conio.h>
using namespace std;
char Buffer[1024];
typedef struct Node
{
int NodeNum;
int szBuffer;
char*pBuffer;
int nStart;
Node*NextNode,*FrontNode;
}Node;Node*Root,*pNowNode,*pBestNode;
int NodeTop=0,DeleteQueue[100],DeleteQueueTop=0;
Node * GetBestBuffer(Node*TempNode,int Size)
{

if(TempNode!=NULL)
{
if(TempNode->szBuffer>Size)
{
if(pBestNode==NULL)pBestNode=TempNode;
else
if(pBestNode->szBuffer>=TempNode->szBuffer)
pBestNode=TempNode;
}
return GetBestBuffer(TempNode->NextNode,Size);
}
else{
return pBestNode;
}
}
void AllotBuffer(Node*pTempNode,int Size)
{
int nTempVal;
if(DeleteQueueTop==0)
{
NodeTop++;
nTempVal=NodeTop;
}
else{
nTempVal=DeleteQueue[DeleteQueueTop-1];
DeleteQueueTop--;
}
cout<<"ss";
delete [] pTempNode->pBuffer;
pTempNode->szBuffer-=Size;
pTempNode->pBuffer=new (pTempNode->nStart+Buffer) char[pTempNode->szBuffer];
Node*pNewNode,*pNextNode=pTempNode->NextNode;
pNewNode=(Node*)malloc(sizeof(Node));
pTempNode->NextNode=pNewNode;
pNewNode->NextNode=pNextNode;
pNewNode->szBuffer=Size;
pNewNode->NodeNum=nTempVal;
pNewNode->nStart=pTempNode->nStart+pTempNode->szBuffer;
pNewNode->pBuffer=new (Buffer+pNewNode->nStart)char[pNewNode->szBuffer];
pNewNode->FrontNode=pTempNode;
if(pNewNode->NextNode!=NULL)
pNewNode->NextNode->FrontNode=pNewNode;


}
void PrintNode()
{
Node*pTempNode=Root->NextNode;
while(pTempNode)
{
cout<<"Num:"<<pTempNode->NodeNum<<endl;
cout<<"Size:"<<pTempNode->szBuffer<<endl;
cout<<"Real Address:"<<(int)(pTempNode->pBuffer)<<endl;
cout<<"Virtual Address:"<<pTempNode->nStart<<endl;
if(pTempNode->NextNode!=NULL)
cout<<"Next Num:"<<pTempNode->NextNode->NodeNum<<endl;
else cout<<"Next Num:NULL"<<endl;
cout<<"----------------------------------"<<endl;
pTempNode=pTempNode->NextNode;
}
}
void DeleteNode()
{
cout<<"Please input the num your want to delete:";
int nTempNum;
cin>>nTempNum;
bool bReg=true;//false 输入错误 true 输入正确 
if(nTempNum<0||nTempNum>NodeTop)
{
bReg=false;
}
for(int i=0;i<DeleteQueueTop;i++)
{
if(DeleteQueue[i]==nTempNum)
{
bReg=false;
break;
}
}
if(!bReg)
{
cout<<"ERROR:input errer!"<<endl;
}
else{
DeleteQueue[DeleteQueueTop++]=nTempNum;

Node*p=Root->NextNode;
while(p->NodeNum!=nTempNum)
{
p=p->NextNode;
}
if(p->FrontNode!=Root)
{
p->FrontNode->szBuffer+=p->szBuffer;
delete [] p->FrontNode->pBuffer;
p->FrontNode->pBuffer=new (Buffer+p->FrontNode->nStart) char[p->FrontNode->szBuffer];
p->FrontNode->NextNode=p->NextNode;
if(p->NextNode!=NULL)
p->NextNode->FrontNode=p->FrontNode;
delete [] p->pBuffer;
free(p);
}
else{
if(p->NextNode)
{
p->NextNode->szBuffer+=p->szBuffer;
delete [] p->NextNode->pBuffer;
p->NextNode->nStart-=p->szBuffer;
p->NextNode->pBuffer=new (Buffer+p->NextNode->nStart) char[p->NextNode->szBuffer];
p->NextNode->FrontNode=Root;
Root->NextNode=p->NextNode;
delete [] p->pBuffer;
free(p);
}
else{
cout<<"ERROR:can't delete"<<nTempNum<<endl;
DeleteQueueTop--;
}
}
}
}
int main()
{    
Root=(Node*)malloc(sizeof(Node));
pNowNode=(Node*)malloc(sizeof(Node));
pNowNode->szBuffer=1024;
pNowNode->nStart=0;
pNowNode->pBuffer=new (pNowNode->nStart+Buffer) char[pNowNode->szBuffer];
pNowNode->NodeNum=0;
pNowNode->NextNode=NULL;
pNowNode->FrontNode=Root;
Root->NextNode=pNowNode;
while(1)
{
cout<<"1.add Node"<<endl;
cout<<"2.delete Node"<<endl;
cout<<"3.print queue"<<endl;
cout<<"please input your choice:";
int ch;
cin>>ch;
switch(ch)
{
case 1:
cout<<"input the size of new buffer:";
int szBuffer;
cin>>szBuffer;
Node*pTempNode;
pBestNode=NULL;
pTempNode=GetBestBuffer(Root->NextNode,szBuffer);
if(pTempNode==NULL)
cout<<"ERROR:can't find suitable buffer!"<<endl;
else {
cout<<"find suitable buffer!\nNum:"<<pTempNode->NodeNum<<"\nSize"<<pTempNode->szBuffer<<endl;
cout<<"alloting..."<<endl;
AllotBuffer(pTempNode,szBuffer);

}
break;
case 2:
DeleteNode();
break;
case 3:
PrintNode();
break;
default:
cout<<"ERROR:input error!"<<endl;
break;
}
cout<<"press any key to continue!"<<endl;
getch();
system("cls");
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值