• 链表的游标实现


    /*链表的游标实现的声明*/
    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头结点,由于不属于任何链表,所以等价于空

  • 相关阅读:
    KTorrent 2.1
    Krusader-双面板文件治理器
    VirtualBox 1.3.4
    QEMU 0.9.0 & QEMU Accelerator 1.3.0pre10
    Sweep:音频编辑器材
    USBSink-优盘同步备份东西
    玩转 MPlayer(1)
    玩转 MPlayer(2)
    活动目录之迁移
    再学 GDI+[26]: TGPPen 画笔对齐 SetAlignment
  • 原文地址:https://www.cnblogs.com/gabygoole/p/4607789.html
Copyright © 2020-2023  润新知