2.5.1 有序链表类型

// 基本操作接口(函数声明)

 bool MakeNode( SLink &p, ElemType e );
 // 生成一个数据元素和 e 相同的新结点 *p,并返回TRUE,若存储分配失败,
 // 则返回 FALSE


 bool InitList(OrderedLinkList &L );
 // 构造一个空的有序链表L,若存储分配失败,令L.head为空并返回FALSE
 // 否则返回 TRUE。


 void DestroyList(OrderedLinkList &L );
 // 销毁有序链表 L,L 不再存在。

 bool ListEmpty (OrderedLinkList L );
 // 若有序链表 L 为空表,则返回TRUE,否则返回 FALSE
 
     
   int ListLength(OrderedLinkList L );
 // 返回有序链表L中元素个数。

 SLink PriorPos(OrderedLinkList L );
 // 移动有序链表L中当前指针到它当前所指结点的直接前驱并返回。

 SLink NextPos (OrderedLinkList L );
 // 移动有序链表L中当前指针到它当前所指结点的直接后继并返回。

 bool GetPos (OrderedLinkList L, int pos ) ;
 // 若1≤pos≤LengthList(L),则移动当前指针指向第 pos 个结点
 // 且返回函数值为TRUE,否则不移动当前指针且返回函数值为FALSE


 void GetCurElem(OrderedLinkList L, ElemType& e );
 // 以 e 带回当前指针所指结点中的数据元素。

 bool LocateElem (OrderedLinkList L, ElemType e,
     int (*compare)(ElemType, ElemType));
 // 若有序链表L中存在和e相同的数据元素,则当前指针指向第1个和e相同的结点,
 // 并返回TRUE,否则当前指针指向第一个大于e 的元素的前驱,并返回 FALSE。


 void ListTraverse(LinkList L, void (*visit)() );
 // 依次对L的每个元素调用函数 visit()。一旦 visit() 失败,则操作失败。

 void ClearList( LinkList &L );
 // 将有序链表L重置为空表,并释放原链表的结点空间。

 void SetcurElem( LinkList L , ElemType e );
 // 将有序链表L中当前指针所指结点中的数据元素修改为和 e 相同。

 void InsAfter ( LinkList &L, SLink s );
 // 在有序链表L中当前指针所指结点之后插入一个新的结点 *s
 // 并移动当前指针指向新插入的结点。


 bool DelAfter( LinkList &L, ElemType& e );
 // 若当前指针所指非单链表L中最后一个结点,则删除当前指针所指结点之后的
 // 结点,以e带回它的数据元素并返回TRUE,否则不进行删除操作且返回FALSE。

    因为有了length的属性,"求表长"操作的时间复杂度就降为O (1)了。
 
  若当前指针指向头结点,则不移动当前指针并返回NULL

  若当前指针指向最后一个结点,则令当前指针指向头结点并返回NULL




















  和顺序表类型中的操作定义相对比可见,根据链表的特点,在顺序表操作中返回"位序"的地方,在链表中则返回指示结点所在"位置"的指针更为恰当。例如,在链表中插入结点时需要知道的是插入的"位置"(插入在哪一个结点之后),而不是"位序"。所以我们说,在链表中,应该以"位置"的概念来代替"位序"的概念。