链表的游标实现

/*链表的游标实现的声明*/
typedef int PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;

struct Node{
    ElementType Element;
    Position Next;
};
struct Node CursorSpace[ SpaceSize ];
/*CursorSpace的初始化*/
for(i = 0; i <= SpazeSize-1; i++)
{
    CursorSpace[i].Element = 0;
    CursorSpace[i].Next = i+1;
}
CursorSpace[ SpaceSize - 1 ].Next = 0;
/*CursorAlloc*/
Position
CursorAlloc( void )
{
    Position p;
    p = CursorSpace[0].Next;
    CursorSpace[0].Next = CursorSpace[p].Next;
    return p;
}
/*CursorFree*/
void
CursorFree( Position p )
{
    CursorSpace[p].Next = CursorSpace[0].Next;
    CursorSpace[0].Next = p;
}
/*测试链表为空*/
/*return true if L is empty */
int
IsEmpty( List L )
{
    return CursorSpace[L].Next == 0;
}
/*测试p是不是链表的末尾*/
/*return true if p is the last position in list L*/
int
IsLast( List L, Position p )
{
    return CursorSpace[p].Next == 0;
}
/*Find游标实现*/
/* return position of X in L,0 is not found */
/* use a header node */
Position
Find( ElementType X, List L )
{
    Position p;
    p = CursorSpace[L].Next;
    while( p != 0 && CursorSpace[p].Element != X)
        p = CursorSpace[p].Next;
    return p;
}
/*FindPrevious*/
Position
FindPrevious( List L, ElementType X)
{
    Position p;
    p = L;
    while(CursorSpace[p].Next != 0 && CursorSpace[CousorSpace[p].Next].Element != X)
        p = CursorSpace[p].Next;
    return p;
}

/* 对链表进行删除操作 */
/* delete first occurrence of X */
/* assume header node */
void
Delete( List L, ElementType X )
{
    Position p,TmpCell;
    p = FindPrevious(L,X);
    if(!IsLast(p))
    {
        TmpCell = CursorSpace[p].Next;
        CursorSpace[p].Next = CursorSpace[TmpCell].Next;//如果是删除最后一项,就把前一项Next置为0
        CursorFree(TmpCell);
    }
}
/* 对链表进行插入操作 */
/*insert after position p */
/* header assumed */
/* L is not used */
void
Insert( Position p, ElementType X )
{
    Position TmpCell;
    TmpCell = CursorAlloc();
    if(TmpCell == 0)//当freelist为只有表头的空表会返回0
        FatalError( "Out of Space" );
    CursorSpace[TmpCell].Element = X;
    CursorSpace[CursorSpace].Next = CursorSpace[p].Next;
    CursorSpace[p].Next = TmpCell;
}
View Code

1.大致思想是把声明CursorSpace结构数组,每个结构里面放其他结构的下标,做指针

2.freelist即为该数组中闲置的单元构成的一个表,Free()就把该单元加在表头之后通常0元素是表头

3.CursorAlloc()则把表头之后的第一个元素删除,并返回其下标

4.1个数组可以有多个链表

5.链表无论是指针实现还是游标实现,Find就是指到当前真正意义上的第一个结点,并且查找该地址下的element是否与X相等

而FindPrevious则是地址指到前一个即表头,却在查看下一个结点的element

6.等于0相当于freelist头结点,由于不属于任何链表,所以等价于空

原文地址:https://www.cnblogs.com/gabygoole/p/4607789.html