pcb结构链表_简单说说链表和一个应用实例

本文介绍了一个使用游标数组模拟malloc/free行为的CursorList实现。通过CursorInitSpace、CursorAlloc、CursorFree等函数,实现了链表的创建、插入、查找和删除操作。CursorList中的链表头不存储实际数据,只记录位置,简化了链表管理。
摘要由CSDN通过智能技术生成

#include "CursorList.h"

/*

使用一个游标数组来模拟 malloc/free行为。

返回的永远是一个数值,这个数值代表在 cursorspace中的数值,以及指向使用空间的

下标;

它为0则等同于NULL指针;

表头?表头是刚开始分配得到的位置;

一定要注意区分,cursorspace的0位置不是表头;

实现的关键,应该是首先实现 alloc/free

*/

/*

为了多重性,我的 分配 和 释放函数,要多传入一个 cursorspace

回顾之前的版本,我是没有真正理解 链表的一些使用细节。链表在使用时,

是无需另外记录 链表到达的最后位置的(那是普通数组下标记录方案的后遗症)

通过 malloc/free本身,已经可以获得这些信息,所有需要记住的,只是链表头

的位置;

另一点,元素进入链表后,元素的排列顺序其实并不重要,除非你已经明确要把某个

元素插入某个位置,否则都不重要;它们总是靠next指针按顺序连接在一起;

最后把 0 位置 定义成 CURSOR_NULL,则在语意上,它与 一般标准的可以使用

malloc/free的情形更加接近,更方便移植;

特别要注意的是,在cursorlist方案中,所有操作的指针 其实都是 数字,它们是

CursorPos,亦即 int;

而且,我要实现的cursorlist方案,更加接近 linux内核中的版本,只不过我并不

特别在意实现为 双向链表;

也就是,我的链表只是记录位置本身,而不涉及所操作的元素本身;

对于  游标情形而言,也可以简单理解为,cursorlist只是操作 下标,然后所操作的元素

通过下标来索引;

与此同时,将不再需要 DeleteList这个操作,因为这件事情已经没有意义;

*/

/*

pool表示即将要使用的cursor space,记录下标的数组;

*/

void CursorInitSpace(CursorPos *space,int Max)

{

int i;

for(i = 0;i < Max - 1;i++)

space[i] = i + 1;

space[i] = 0;

}

// 这不是一个纯粹的 alloc函数,因为它同时把下一个位置置零

CursorPos CursorAlloc(CursorPos *space)

{

CursorPos P;

P = space[0];

space[0] = space[P];

return P;

}

static void CursorFree(CursorPos *space,CursorPos pos)

{

space[pos] = space[0];

space[0] = pos;

}

CursorPos CursorCreate(CursorPos *space)

{

CursorPos Head;

Head = CursorAlloc(space);

if(Head == CURSOR_NULL)

return;

space[Head] = CURSOR_NULL;

return Head;

}

void CursorInsert(CursorPos *space,CursorPos pos)

{

CursorPos temp;

temp = CursorAlloc(space);

if(temp == CURSOR_NULL)

return;

space[temp] = space[pos];

space[pos] = temp;

}

CursorPos FindPrevCursor(CursorPos *space,CursorPos head,CursorPos pos)

{

CursorPos P;

P = head;

while( (space[P] != CURSOR_NULL) && space[P] != pos  )

P = space[P];

return P;

}

CursorPos LastCursor(CursorPos *space,CursorPos Head)

{

CursorPos P;

P = Head;

while(space[P] != CURSOR_NULL )

P = space[P];

return P;

}

// 在一般情况下,通过指定要删除的元素,来选择删除,但这里只是一个单纯的链,

// 而链表头不允许删除,除此以外,测试时,只能寻找一个相对确定的位置以方便删除;

// 这里我们选择 表尾;

void CursorDelete(CursorPos *space,CursorPos head,CursorPos pos)

{

CursorPos Prev,temp;

Prev = FindPrevCursor(space,head,pos);

if(space[Prev] == CURSOR_NULL)

return;

temp = space[Prev];

space[Prev] = space[temp];

CursorFree(space,temp);

}

// end of file -------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值