资讯专栏INFORMATION COLUMN

queue.h的链表使用

2501207950 / 3515人阅读

摘要:在中有这样一个头文件也有,它定义了一系列的宏操作,实现了双向链表,双端队列和循环链表。

在FreeBSD中有queue.h这样一个头文件(Linux也有),它定义了一系列的宏操作,实现了双向链表,双端队列和循环链表。

下面给出一些链表常用操作的例子:

#include
#include
#include

struct element{
    int num;
    /*LIST_ENTRY 创建了一个匿名结构体,这个结构体有两个成员,
      分别为struct element* le_next;
           struct element** le_prev;
      即,elements的类型就是这个匿名的结构体,
      使得element成为双向链表中的节点
     */
    LIST_ENTRY(element) elements;
};
int main(void){
    /*LIST_HEAD 会自动构建一个名为listh的结构体,
      里面含有一个element指针 *lh_first
      这里的name一般没有什么用处,但是尽量注意有多个链表时,name不要相同造成冲突。
     */
    LIST_HEAD(listh,element) head; 
    struct element *n1,*np;
    //链表使用前,需要初始化
    LIST_INIT(&head);
    n1 = (struct element*)malloc(sizeof(struct element));
    n1->num = 1;
    //各种插入方式
    //插入到链表前端
    /*
       对于LIST_INSERT_HEAD为何需要用指针域作为参数,
       因为指针域的名字是用户自己定义的,函数内部并不知道,
       所以需要作为参数传入
    */
    LIST_INSERT_HEAD(&head,n1,elements);
    n1 = (struct element*)malloc(sizeof(struct element));
    n1->num = 2;
    //插入到某个节点之后,这里是插入到第一个节点之后
    LIST_INSERT_AFTER(LIST_FIRST(&head),n1,elements);    
    
    n1 = (struct element*)malloc(sizeof(struct element));
    n1->num=3;
    //插入到某个节点之前
    LIST_INSERT_BEFORE(LIST_FIRST(&head),n1,elements);
    
    //遍历链表
    //方法一
    for(np=LIST_FIRST(&head);np!=NULL;np=LIST_NEXT(np,elements)){
        printf("%d ",np->num);
    }
    //方法二(推荐)
    LIST_FOREACH(np,&head,elements){
        printf("%d ",np->num);
    }
    //方法三(最原始)
    for(np=(head).lh_first;np!=NULL;np=np->elements.le_next){
        printf("%d ",np->num);
    }    
    
    //删除,释放链表
    while(LIST_FIRST(&head)){
        struct element* tmp = LIST_FIRST(&head);
        LIST_REMOVE(tmp,elements);
        free(tmp);
    }
    return 0;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7582.html

相关文章

  • Nginx 源码分析:ngx_queue_t

    摘要:源文件路径版本主要作用分析是提供的双向链表。同时,由于这种链表没有节点成员变量,所以需要作为带有节点变量的结构体的成员变量存在,这种情况下,称这种链表为寄宿链表,链表所在结构体称为宿主。和常规的双向链表操作基本相同。 源文件路径 版本:1.8.0 srccoreNgx_queue.h srccoreNgx_queue.c 主要作用分析 ngx_queue_t是Nginx提供的...

    jsyzchen 评论0 收藏0
  • Nginx 源码分析:ngx_queue_t

    摘要:源文件路径版本主要作用分析是提供的双向链表。同时,由于这种链表没有节点成员变量,所以需要作为带有节点变量的结构体的成员变量存在,这种情况下,称这种链表为寄宿链表,链表所在结构体称为宿主。和常规的双向链表操作基本相同。 源文件路径 版本:1.8.0 srccoreNgx_queue.h srccoreNgx_queue.c 主要作用分析 ngx_queue_t是Nginx提供的...

    Yuqi 评论0 收藏0
  • Nginx 源码分析:ngx_queue_t

    摘要:源文件路径版本主要作用分析是提供的双向链表。同时,由于这种链表没有节点成员变量,所以需要作为带有节点变量的结构体的成员变量存在,这种情况下,称这种链表为寄宿链表,链表所在结构体称为宿主。和常规的双向链表操作基本相同。 源文件路径 版本:1.8.0 srccoreNgx_queue.h srccoreNgx_queue.c 主要作用分析 ngx_queue_t是Nginx提供的...

    IamDLY 评论0 收藏0
  • 数据结构之链表OJ练习检验你链表水平是否合格

    摘要:同时让当前结点的指针指向,从而实现从链表尾部开始的局部反转当递归函数全部出栈后,链表反转完成。这个链表的倒数第个节点是值为的节点。新链表是通过拼接给定的两个链表的所有节点组成的。 目录 1.反转链表 K个一组翻转链表 链表的中间节点: 链表倒数第k个节点: 删除链表倒数第k个节...

    andycall 评论0 收藏0
  • 用 JavaScript 实现链表操作 - 06 Insert Sort

    摘要:需求实现一个函数对链表进行升序排列插入排序。关于插入排序插入排序的介绍可以看,大体逻辑为建立一个新的空链表。遍历完成,返回新链表。代码如下总结因为有上个的函数的帮助,这个插入排序实现起来非常简单。 TL;DR 2016 年末最后一篇,对链表进行插入排序。系列目录见 前言和目录 。 需求 实现一个 insertSort() 函数对链表进行升序排列(插入排序)。实现过程中可以使用 上一个 ...

    doodlewind 评论0 收藏0

发表评论

0条评论

2501207950

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<