码迷,mamicode.com
首页 > 其他好文 > 详细

链表的游标实现

时间:2015-06-29 19:42:28      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
/*链表的游标实现的声明*/
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个数组可以有多个链表

链表的游标实现

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!