zoukankan      html  css  js  c++  java
  • 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);        /*出队*/

  • 相关阅读:
    PHP版根据经纬度和半径计算出经纬度的范围
    使用GPS经纬度定位附近地点(某一点范围内查询)
    sql语句查询经纬度范围
    Android检测是否安装了指定应用
    Android 定时器实现的几种方式和removeCallbacks失效问题详解
    Android Service与Activity之间通信的几种方式
    Android操作系统11种传感器介绍
    Android录音--AudioRecord、MediaRecorder
    Android广播接收者应用(电话拦截器)
    收藏夹
  • 原文地址:https://www.cnblogs.com/RbtreeLinux/p/3517514.html
Copyright © 2011-2022 走看看