游标链表

游标链表

不用指针和malloc()、free()函数构建链表。
核心的内容是:

  1. 数据储存在一组结构体中。每一个结构体包含有数据及指向下一个结构体的指针。
  2. 一个新的结构体可以通过调用malloc而从系统的全局内存得到,并可通过调用free而被释放。
#define Space 10

typedef int PtroNode;
typedef PtroNode List;
typedef PtroNode Position;

struct Node
{
    int num;

    Position Next;
};
struct Node CursorSpace[Space];
//malloc函数的实现
static Position CursorAlloc(void)
{
    Position P;

    P = CursorSpace[0].Next;
    CursorSpace[0].Next = CursorSpace[P].Next;

    return P;
}
//free函数的实现
static void CursorFree(Position P)
{
    CursorSpace[P].Next = CursorSpace[0].Next;
    CursorSpace[0].Next = P;
}

浮标链表使用前一定要初始化

void initializeCursorSpace(void)
{
    int i;

    for(i = 0; i < Space; i++)
    {
        CursorSpace[i].num = 0;
        CursorSpace[i].Next = i + 1;
    }

    CursorSpace[Space-1].Next = 0;
}
//生成一个表头
List MakeEmpty(int X)
{
    List P = CursorAlloc();

    CursorSpace[P].Next = 0;
    CursorSpace[P].num = X;

    return P;
}
//判断一个链表是否为空,或者是链表的末尾
int IsEmpty(List P)
{
    return (CursorSpace[P].Next == 0);
}
//延长链表
Position Insert(int X, List P)
{
    List TmpCell = CursorAlloc();

    CursorSpace[TmpCell].num = X;
    CursorSpace[TmpCell].Next = CursorSpace[P].Next;
    CursorSpace[P].Next = TmpCell;

    return TmpCell;
}
//找到指定的元素
Position Find(int X, List P)
{
    List TmpCell = CursorSpace[P].Next;

    while((CursorSpace[TmpCell].num != X) && (TmpCell != 0))
    {
        P = CursorSpace[P].Next;
    }

    return P;
}
//找前驱
Position FindPrevious(int X, List P)
{
    List TmpCell = CursorSpace[P].Next;

    while((TmpCell != 0) && (CursorSpace[CursorSpace[TmpCell].Next].num != X))
    {
        TmpCell = CursorSpace[TmpCell].Next;
    }

    return TmpCell;
}
//删除链表指定元素
void Delete(int X, List P)
{
    List TmpCell = FindPrevious(X, P), DeadCell;
    DeadCell = CursorSpace[TmpCell].Next;

    if(!IsEmpty(TmpCell))
    {
        CursorSpace[TmpCell].Next = CursorSpace[DeadCell].Next;
        CursorFree(DeadCell);
    }
}
//删除链表
void DeleteList(List P)
{
    List TmpCell;

    while(P != 0)
    {
        TmpCell = P;
        P = CursorSpace[P].Next;
        CursorFree(TmpCell);
    }
}

函数的属性

static Position 
CursorAlloc(void)__attribute__((unused));
static void 
CursorFree(Position P)__attribute__((unused));

__ attribute__((unused))这个是为了告诉编译器这个函数定义了之后如果没使用不用发出警告。类似的属性还有很多,以后慢慢学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值