链表的数组实现 《算法导论》10.3-2

  • 实现链式数据结构有两种方式,指针和数组,与指针相比较,采用数组方式,对内存的使用更加紧凑,但对链表的最大长度有所限制。
  • 实现的思路是分别利用对象的prev,next字段表示前驱和后继对象的数组下标,另外将链表的头保存在一个全局变量中。当向链表中插入一个新对象时,必须分配一个尚未利用的对象的下标,因此,有必要对数组中尚未利用的对象空间进行管理,我们把空闲对象保存在一个单链表中,称为自由表。自由表表头同样保存在一个全局变量freeHead中,自由表只使用对象的next字段。
  • 自由表的AllocateObject方法,分配一个自由对象,返回其下标值,如果自由表为空,则返回-1。FreeObject方法,释放下标为参数pos的对象到自由表中。
#include <cassert>
#include <iostream>
using namespace std;

struct Object
{
    int prev;
    int key;
    int next;
};
constexpr int SIZE = 10;
Object array[SIZE];    
int freeHead = 0;   
     
void InitFreeList()
{
    for(int i = 0; i != SIZE-1; ++i)
        array[i].next = i+1;
    array[SIZE-1].next = -1;
}

int AllocateObject()
{
    int curFree = freeHead;
    if(curFree != -1)
        freeHead = array[curFree].next;
    return curFree;
}

void FreeObject(int pos)
{
    assert(pos >= 0 && pos < SIZE);
    int curFree = freeHead;
    freeHead = pos;
    array[freeHead].next =curFree;
}

void Test()
{
    InitFreeList();
    for(int i = 0; i != SIZE; ++i)
        cout << AllocateObject() << "\t";
    cout << endl;                                 //0 1 2...9
    cout << AllocateObject() << endl;    // -1
    for(int i = 0; i != SIZE; i += 2)
        FreeObject(i);
    for(int i = 0; i != SIZE/2; ++i)
        cout << AllocateObject() << "\t";
    cout << endl;                                //8 6 4 2 0
}
运行Test()输出结果为:
0 1 2 3 4 5 6 7 8 9
-1
8 6 4 2 0

转载于:https://www.cnblogs.com/meixiaogua/p/9782263.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值