链表的游标实现
/*链表的游标实现的声明*/ 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; }
1.大致思想是把声明CursorSpace结构数组,每个结构里面放其他结构的下标,做指针
2.freelist即为该数组中闲置的单元构成的一个表,Free()就把该单元加在表头之后通常0元素是表头
3.CursorAlloc()则把表头之后的第一个元素删除,并返回其下标
4.1个数组可以有多个链表
5.链表无论是指针实现还是游标实现,Find就是指到当前真正意义上的第一个结点,并且查找该地址下的element是否与X相等
而FindPrevious则是地址指到前一个即表头,却在查看下一个结点的element
6.等于0相当于freelist头结点,由于不属于任何链表,所以等价于空