一、链表结构
typedef struct ListNode { struct ListNode *prevPtr; /* 链表中前一节点 */ struct ListNode *nextPtr; /* 链表中后一节点*/ unsigned int useCount:8, /* 使用这一节点的函数数目。只有数目为0,节点才可以被删除*/ flags:8; /* 节点状态标志 */ void *datum; /* 节点存放的数据 */ } *ListNode;
typedef struct List { ListNode firstPtr; /* 链表的第一个节点*/ ListNode lastPtr; /* 链表的最后一个节点 */ Boolean isCirc; /* 是否是循环链表*/ /* * 顺序访问用到的成员变量 */ Where atEnd; /* 链表最后一次访问的位置 */ Boolean isOpen; /* 链表是否被打开 */ ListNode curPtr; /* 如果链表打开,为当前节点。如果链表关闭,则为NULL*/ ListNode prevPtr; /* 如果链表打开,则为上一节点。Lst_Remove 中使用*/ } *List;
二、 接口函数
/* * 创建/销毁函数 */ Lst Lst_Init(Boolean); /*创建新链表*/
Lst Lst_Duplicate(Lst, DuplicateProc *); /*复制已有链表*/ void Lst_Destroy(Lst, FreeProc *); /*销毁链表*/
Boolean Lst_IsEmpty(Lst); /*链表是否为空*/
/* * 链表修改函数 */ ReturnStatus Lst_InsertBefore(Lst, LstNode, void *); /*在已知节点前插入新节点*/ ReturnStatus Lst_InsertAfter(Lst, LstNode, void *); /*在已知节点后插入新节点*/
ReturnStatus Lst_AtFront(Lst, void *); /*在链表前端添加新节点*/
ReturnStatus Lst_AtEnd(Lst, void *); /*在链表末尾添加新节点*/
ReturnStatus Lst_Remove(Lst, LstNode); /*删除链表相应节点*/
ReturnStatus Lst_Replace(LstNode, void *); /*替换相应节点*/
ReturnStatus Lst_Concat(Lst, Lst, int); /*合并两个链表*/
/* *节点相关操作函数
*/ LstNode Lst_First(Lst); /*返回链表的第一个节点*/
LstNode Lst_Last(Lst); /*返回链表的最后一个节点*/
LstNode Lst_Succ(LstNode); /*返回给定节点的下一节点*/
LstNode Lst_Prev(LstNode); /*返回给定节点的上一节点*/
void *Lst_Datum(LstNode); /*取得节点数据*/
/* * 整个链表相关操作函数 */ LstNode Lst_Find(Lst, const void *, int (*)(const void *, const void *)); /*在链表中查找节点*/
LstNode Lst_FindFrom(Lst, LstNode, const void *, int (*cProc)(const void *, const void *)); /*在链表某处开始查找节点*/
LstNode Lst_Member(Lst, void *); /*查看给定的数据是否在链表中,返回含有数据的节点*/
int Lst_ForEach(Lst, int (*)(void *, void *), void *); /*对链表每个节点应用指定函数*/
int Lst_ForEachFrom(Lst, LstNode, int (*)(void *, void *), /*从某处开始对链表每个节点应用指定函*/
void *);
/* * 这些函数把链表当作表来处理。
* 在Lst_Open()与Lst_Close()之间的函数都使用了“当前元素(当前节点)”的概念。 */ ReturnStatus Lst_Open(Lst); /*打开表*/
LstNode Lst_Next(Lst); /*下一元素*/
Boolean Lst_IsAtEnd(Lst); /*是否已到表的末尾*/
void Lst_Close(Lst); /*关闭表*/
/* * 把链表用作队列 */ ReturnStatus Lst_EnQueue(Lst, void *); /*入队*/
void *Lst_DeQueue(Lst); /*出队*/