您的位置:首页 > 其它

CLRS 10.3指针和对象的实现

2015-12-01 09:43 190 查看
10.3-1

大致如下图:



10.3-2

ALLOCATE-OBJECT()
if free == NIL
error "out of range"
else x = free
free =A[x+1]
return x

FREE-OBJECT()
A[x+1] = free
free = x


10.3-3

因为我们用不到它,有 freefree 链表就够了。

10.3-4

从数组开始位置开始存放,并记录当前已经分配的元素个数 nn。

删除一个元素时,假设待删除的元素的位置是 ii,先修改元素 prev[i]prev[i] 的 nextnext 指针和元素 next[i]next[i] 的 prevprev 指针,删除这个元素。这里数组中间就留下一个空位,我们用最后一个元素补入空缺,同时需要修改 prevprev 和 nextnext,具体方法是修改元素 prev[n]prev
的 nextnext 指针和元素 next[n]next
和 prevprev 指针。

10.3-5

1) 首先扫描一遍 FF 表,将 FF 表中的 prevprev 指针标记一个特殊值(prevprev 指针在 FF 中并没有使用到,所以可以添加特殊值);

2) 设置两个指针,分配从头和尾开始相向而行,左边的指针依次递增扫描到空(即没有分配的数组)停止,右边的指针依次递减扫描到非空,然后将右指针的数据复制到左指针区域,并在右指针 nextnext 区域设置左指针地址,然后继续扫描,直至两个指针相遇时停止;

3) 更新 LL 表 和 FF 表。

#include <iostream>
using std::cout;
using std::endl;

const int MAX_SIZE = 50;

int next[MAX_SIZE];
int prev[MAX_SIZE];
int data[MAX_SIZE];

int F, L;       //自由表和链表
bool empty;     //表是否为空
int count;      //记录表中元素个数

void init()
{
for(int i = 0; i < MAX_SIZE - 1; ++i)
next[i] = i + 1;
next[MAX_SIZE - 1] = -1;
F = 0;
L = -1;
empty = true;
count = 0;
}

int ALLOCATE_OBJECT()       //只是分配空间,并不移动以及赋值
{
if(F == -1)
{
cout << "out of space" << endl;
return -1;
}
int new_index = F;
F = next[F];
return new_index;
}

void FREE_OBJECT(int index)
{
next[index] = F;
F = index;
}

void INSERT(int key)
{
int new_index = ALLOCATE_OBJECT();
if(new_index != -1)
{
data[new_index] = key;
prev[new_index] = -1;   //没有前一个元素
next[new_index] = L;    //后一个元素是L所指位置

if(empty)               //第一次插入
empty = false;
else prev[L] = new_index;
L = new_index;

if(++count == MAX_SIZE) //表满则不能继续插入
F = -1;
}
}

void DELETE(int index)
{
if(next[index] != -1)   //修改下一个元素的前一个地址
prev[next[index]] = prev[index];
if(prev[index] != -1)   //修改前一个元素的下一个地址
next[prev[index]] = next[index];
else L = next[index];   //删除第一个元素时需要修改L表
if(next[index] == -1 && prev[index] == -1)  //最后一个元素被删除
empty = true;
--count;
FREE_OBJECT(index);
}

int SEARCH(int key)
{
int next_index = L;
while(next_index != -1 && data[next_index] != key)
next_index = next[next_index];
return next_index;
}

void PRINT()
{
int next_index = L;
while(next_index != -1)
{
cout << data[next_index] << ' ';
next_index = next[next_index];
}
}

void COMPACTIFY_LIST()
{
if(F == -1)                  //表满则无法移动,返回
return;
int i = F;
while(i != -1)               //标记F中的prev指针
{
prev[i] = -2;            //特殊值
i = next[i];
}
int left = 0, right = MAX_SIZE - 1;
while(true)
{
while(prev[left] != -2)  //寻找空区域
++left;
while(prev[right] == -2)
--right;
if(left >= right)
break;
prev[left] = prev[right];
data[left] = data[right];
next[left] = next[right];

next[right] = left;      //标记移动到的地方
++left;
--right;
}
++right;
for(int j = 0; j < right; ++j)  //更新L表
{
if(prev[j] >= right)
prev[j] = next[prev[j]];
if(next[j] >= right)
next[j] = next[next[j]];
}
if(L >= right)
L = next[L];    //更新L
for(int j = right; j < MAX_SIZE - 1; ++j)   //更新F表
next[j] = j + 1;
next[MAX_SIZE - 1] = -1;
F = right;
}

int main()
{
init();
INSERT(5);
PRINT();
cout << endl;
int index = SEARCH(5);
if(index != -1)
DELETE(index);
PRINT();
cout << endl;
for(int i = 1; i < 10; ++i)
INSERT(i);
PRINT();
cout << endl;
index = SEARCH(7);
if(index != -1)
DELETE(index);
index = SEARCH(2);
if(index != -1)
DELETE(index);
COMPACTIFY_LIST();
PRINT();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: