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

  • 相关阅读:
    代码写界面的工厂类
    Masonry的一些等间距布局
    开发中的小细节随记
    ios7 实现应用内保真截屏
    利用GCD实现单利模式的宏代码
    AVAudioPlayer的锁屏播放控制和锁屏播放信息显示
    NSXMLParser自定义的一个xml解析工具
    利用NSURLSession完成的断点续传功能
    AVFoundation下的视频分帧处理
    Redis自学笔记:4.2进阶-过期时间
  • 原文地址:https://www.cnblogs.com/RbtreeLinux/p/3517514.html
Copyright © 2020-2023  润新知