queue.h的链表使用
2016-08-29 10:11
316 查看
from https://segmentfault.com/a/1190000000596749
在FreeBSD中有queue.h这样一个头文件(Linux也有),它定义了一系列的宏操作,实现了链表,尾队列和循环链表。其中,链表的功能最为简单,效率是最好的。
我们先看一下系统提供的链表的操作:
其中
部分宏源码
example
在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; }
相关文章推荐
- cpp: 使用类模板以及链表实现队列Queue
- 使用linux中标准的queue.h头文件插件链表,队列,循环队列
- cpp: 使用链表实现queue 模型
- 使用STL之list实现链表逆置
- 使用双向链表
- JMS(Jboss Messaging)的一点使用心得(十四)Spring扩展应用—用单线程接收Queue
- C++链表使用完整代码
- 静态使用链表小例子
- 使用JAVA实现双向链表
- C#中链表的用使用LinkedList
- ActiveMQ (二) 使用Queue或者Topic发送/接受消息
- 使用链表(LinkedList) mix-in 到其中的栈(Stack)
- 在cocoa中使用C++STL 链表
- 使用dev_queue_xmit发送定制报文
- 队列(queue)的链表(list)实现及循环数组(circular array)实现 C++实现
- 链表的使用
- 使用链表编写的香农编码
- 如何使用c语言实现双向链表的插入删除操作
- 使用链表实现Josephus环问题
- std::priority_queue使用示例 STL