#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 -------------------------------------------------------