NetBSD Make源代码阅读一:链表之概览

 一、链表结构

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);        /*出队*/

原文地址:https://www.cnblogs.com/RbtreeLinux/p/3517514.html