queue.h的链表使用

转载 2016年08月29日 10:11:50

from  https://segmentfault.com/a/1190000000596749

在FreeBSD中有queue.h这样一个头文件(Linux也有),它定义了一系列的宏操作,实现了链表,尾队列和循环链表。其中,链表的功能最为简单,效率是最好的。
我们先看一下系统提供的链表的操作:

    LIST_ENTRY(TYPE)   
    LIST_HEAD(HEADNAME,TYPE)
    LIST_INIT(LIST_HEAD *head)
    LIST_INSERT_AFTER(LIST_ENTRY *listelm,TYPE *elm,LIST_ENTRY NAME)
    LIST_INSERT_HEAD(LIST_HEAD *head,TYPE *elm,LIST_ENTRY NAME)
    LIST_REMOVE(TYPE *elm,LIST_ENTRY NAME)

其中LIST_HEAD、LIST_INIT、LIST_INSERT_AFTER、LIST_INSERT_HEAD、LIST_REMOVE从名字可以看出其功能,但是它们的参数就不这么好理解了。下面我们来看一个例子和部分宏的源码,弄明白这组宏的使用方法。
部分宏源码

#define LIST_ENTRY(type)                                                \
struct {                                                                \
        struct type *le_next;   /** next element */                     \
        struct type **le_prev;  /** address of previous next element */ \
}
#define LIST_HEAD(name, type)                                           \
struct name {                                                           \
        struct type *lh_first;  /** first element */                    \
}
#define LIST_INSERT_HEAD(head, elm, field) do {                         \
        if (((elm)->field.le_next = (head)->lh_first) != NULL)          \
                (head)->lh_first->field.le_prev = &(elm)->field.le_next;\
        (head)->lh_first = (elm);                                       \
        (elm)->field.le_prev = &(head)->lh_first;                       \
} while (/**CONSTCOND*/0)



example

#include<stdio.h>
#include<stdlib.h>
#include<sys/queue.h>

struct element{
    int num;
    /*LIST_ENTRY 创建了一个以element为名的结构体定义
     这个结构体含有向后指针和向前指针
     le_next 和 le_prev
     并且声明了一个类型为element的变量elements
     */
    LIST_ENTRY(element) elements;
};
int main(void){
    /*LIST_HEAD 会自动构建一个名为listh的结构体,
      里面含有一个element指针 *lh_first
      所以 先调用LIST_HEAD之后,才会生成struct声明,后面才可以使用
      关于listh的指针
     */
    LIST_HEAD(listh,element) head; 
    struct listh *headp;
    struct element *n1,*np;
    int i=0;
    LIST_INIT(&head);
    printf("开始\n");
    do{

        printf("输入一个数字,输入0则结束\n");
        scanf("%d",&i);

        n1 = (struct element*)malloc(sizeof(struct element));
        n1->num = i;

        /*
       对于LIST_INSERT_HEAD为何需要用指针域作为参数,
       因为指针域的名字是用户自己定义的,函数内部并不知道,
       所以需要作为参数传入,并且在宏之内,可以连接字符串实现
       类似反射的功能。
       */

        LIST_INSERT_HEAD(&head,n1,elements);
    }while(i);
    for(np=(head).lh_first;np!=NULL;np=np->elements.le_next){
        printf("%d ",np->num);
    }   
    printf("\n");
    return 0;
}




使用linux中标准的queue.h头文件插件链表,队列,循环队列

#include #include #include #include int test_list() {     LIST_HEAD(listhead, entry)...
  • u010758403
  • u010758403
  • 2013年09月07日 04:15
  • 2312

【数据结构】顺序队列 Queue

08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de...
  • xiaowei_cqu
  • xiaowei_cqu
  • 2012年07月16日 11:59
  • 9431

sys/queue.h分析

这两天有兴趣学习使用了下系统头文件sys/queue.h中的链表/队列的实现,感觉实现的很是优美,关键是以后再也不需要自己实现这些基本的数据结构了,哈哈! 我的系统环境是 正好需要使用队列,那么本篇...
  • astrotycoon
  • astrotycoon
  • 2015年01月20日 14:23
  • 4882

IOS-usr/include-dispatch-queue.h

IOS-usr/include-dispatch-queue.h // 后台执行:dispatch_async(dispatch_get_global_queue(0, 0), ^{ // ...
  • u014222687
  • u014222687
  • 2016年07月13日 19:06
  • 289

sys/queue.h

from  http://www.cnblogs.com/imlgc/archive/2012/05/02/2479654.html 概述         sys/queue.h是...
  • u010820135
  • u010820135
  • 2016年08月29日 11:30
  • 402

queue.h之tailq.h尾队列理解使用

一、连接、组织方式 如图: 每个entry有两个关键元素:tqe_next(简称为next)、tqe_prev(简称为prev)。next指向下个entry的地址,prev指向上个entry的...
  • chen98765432101
  • chen98765432101
  • 2017年02月22日 22:46
  • 989

SeqCQueue.h 顺序循环队列

#include "stdio.h" #include "string.h" typedef struct { DataType queue[MaxQueueSize]; i...
  • zhoulingjie311
  • zhoulingjie311
  • 2011年04月27日 15:36
  • 589

queue.h

#ifndef QUEUE_H #define QUEUE_H /*==================================================================...
  • shuizhiyun
  • shuizhiyun
  • 2008年09月19日 18:03
  • 3470

Libevent0.1学习之queue.h

最近打算研究一下libevent网络库,发现用了FreeBSD的queue.h中的尾队列来存储各种事件队列。下面就是一些学习queue.h的一些笔记。 queue.h中定义了一系列的宏操作去实现单链表...
  • LYH66
  • LYH66
  • 2015年06月02日 13:44
  • 1620

sys/queue.h分析

from  http://blog.csdn.net/astrotycoon/article/details/42917367 这两天有兴趣学习使用了下系统头文件sys/queue.h中的链...
  • u010820135
  • u010820135
  • 2016年08月29日 11:58
  • 440
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:queue.h的链表使用
举报原因:
原因补充:

(最多只允许输入30个字)