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