采用链表的方法模拟分页式存储空间的分配和去配,
MemManager.h
#pragma once
#define MAX_MEM_LEN 512
class CMemManager
{
private:
struct MemItem {
struct MemItem* prior;
struct MemItem* next;
bool bFree;
int nPos;
int nLen;
int nOwner;
MemItem(MemItem* pri, MemItem* nxt, bool bfree, int nPosition, int nLength)
{
prior = pri;
next = nxt;
bFree = bfree;
nPos = nPosition;
nLen = nLength;
nOwner = -1;
}
};
public:
CMemManager(void);
~CMemManager(void);
private:
const static int m_csnMemBlock = MAX_MEM_LEN;
int m_MemBlocks[MAX_MEM_LEN];
MemItem* m_pBase;
public:
void* GetMem(int nSize, int nOwner);
void FreeMem(void* p);
void Show(void);
};
MemManager.cpp
#include <iostream>
#include "MemManager.h"
using namespace std;
CMemManager::CMemManager(void)
{
m_pBase = new MemItem(0, 0, true, 0, m_csnMemBlock);
}
CMemManager::~CMemManager(void)
{
delete m_pBase;
m_pBase = 0;
}
void* CMemManager::GetMem(int nSize, int nOwner)
{
MemItem* p = 0;
for (MemItem* pTemp = m_pBase; pTemp; pTemp = pTemp->next)
{
if (pTemp->bFree && pTemp->nLen >= nSize)
{
int nLeft = pTemp->nLen - nSize;
if (0 == nLeft)
{
pTemp->bFree = false;
p = pTemp;
}
else
{
p = new MemItem(pTemp, pTemp->next, true, pTemp->nPos+nSize, nLeft);
if (!p) {
break;
}
if (pTemp->next) {
pTemp->next->prior = p;
}
pTemp->next = p;
pTemp->bFree = false;
pTemp->nLen = nSize;
p = pTemp;
}
p->nOwner = nOwner;
break;
}
}
return p; // fail
}
void CMemManager::FreeMem(void* p)
{
MemItem* pItem = static_cast<MemItem*>(p);
pItem->bFree = true;
bool bDelete = false;
if (pItem->next && pItem->next->bFree) {
MemItem* pTemp = pItem->next;
pItem->next = pTemp->next;
if (pTemp->next) {
pTemp->next->prior = pItem;
}
pItem->nLen += pTemp->nLen;
delete pTemp;
}
if (pItem->prior && pItem->prior->bFree) {
pItem->prior->next = pItem->next;
if (pItem->next) {
pItem->next->prior = pItem->prior;
}
pItem->prior->nLen += pItem->nLen;
delete pItem;
}
}
void CMemManager::Show(void)
{
cout << endl << "------------------------------------" << endl;
for (MemItem* p = m_pBase; p; p = p->next)
{
cout << "Free: " << (p->bFree ? "true " : "false") << " ";
if (!p->bFree) {
cout << "Owner: " << p->nOwner << " ";
}
cout << "Pos: " << p->nPos << " "
<< "Length: " << p->nLen << endl;
}
}
测试代码
#include <iostream>
#include <ctime>
#include "MemManager.h"
using namespace std;
CMemManager g_mem;
int main()
{
int a;
void* pArray[10] = {0};
srand((unsigned int)time(0));
while (cin >> a)
{
int i = rand() % 10;
cout << "i = " << i;
if (pArray[i]) {
g_mem.FreeMem(pArray[i]);
pArray[i] = 0;
} else {
int nLen = rand() % 128;
cout << " nLen = " << nLen;
pArray[i] = g_mem.GetMem(nLen, i);
}
g_mem.Show();
}
return 0;
}
分享到:
相关推荐
注意创建链表时,顺序法和倒叙法的不同。注意创建链表时,顺序法和倒叙法的不同。
用链表法实现josephus,开发工具为C语言。
大数四则运算 双链表法,满足广大学生的课设要求,强有力的堵住老师提问的嘴
自己实现的malloc 和 free 用的双向链表 尽量做了注释
C语言动态分配内存和链表共11页.pdf.zip
模拟实现内存分配——采用静态链表 数据结构课程设计 模拟实现内存分配——采用静态链表 数据结构课程设计 用静态链表是一种便于在不设“指针”的类型的高级程序设计语言中使用的链表类型。使用静态链表模拟内存...
1.chain-hash-onetime.exe:是使用链表法的散列程序,它是在n=100000,m=20000,即装载因子是5的情况下测试的。该程序显示了从开始到全部插入,再到全部成功查找,最后全部删除的过程,并统计和各项数据。 2.open_hash...
遍历数组和链表 数组和链表.pdf
根据王红梅教材《数据结构》C++版,第二章线性表的第7讲。主要介绍线性表的非顺序存储方法的静态链表和间接寻址方法的相关概念性内容。
使用vc++6.0版本,新建一个工程,在工程中建立cpp,以及头文件。
链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码
简答易懂的熟悉链表的方法,适用于初学c语言的菜鸟来学习如何使用链表
链表的创建和输出链表的创建和输出链表的创建和输出链表的创建和输出链表的创建和输出链表的创建和输出链表的创建和输出链表的创建和输出
易语言简单UI框架链表结构源码,简单UI框架链表结构,加入组件成员,取组件子组件尾,取组件子组件首,置整数类成员,取整数类成员,创建,取This指针,IsWindow,SetProp,GetProp
python利用数组和链表实现栈和队列 数组和链表.pdf
用向前构造法和向后构造法生成单向链表并显示链表数据用的是c++实现
课件主要讲了循环链表,双向链表的操作,插入,删除等 循环链表、双向链表及线性表应用示例
孩子兄弟链表法表示二叉树C++ 孩子兄弟链表法表示二叉树C++