C语言之尾队列tailq
2016-06-24 14:25
447 查看
queue和list的结构定义和操作都在'sys/queue.h'中完成, 主要定义了下面四种数据结构:
单向列表(single-linked lists)
单向尾队列(single-linked tail queue)
列表(lists)
尾队列(tail queues)
![](http://blog.linuxphp.org/attachments/date_201201/thumb_c7351a0315666a6eed44efc913851879.png)
顶
单向列表(single-linked lists)
单向尾队列(single-linked tail queue)
列表(lists)
尾队列(tail queues)
尾队列图示
![](http://blog.linuxphp.org/attachments/date_201201/thumb_c7351a0315666a6eed44efc913851879.png)
尾队列常用宏
宏名称 | 操作 |
TAILQ_INIT | 初始化队列 |
TAILQ_FOREACH | 对队列进行遍历操作 |
TAILQ_INSERT_BEFORE | 在指定元素之前插入元素 |
TAILQ_INSERT_TAIL | 在队列尾部插入元素 |
TAILQ_EMPTY | 检查队列是否为空 |
TAILQ_REMOVE | 从队列中移除元素 |
使用示例
#include <stdio.h> #include <stdlib.h> #include <sys/queue.h> /* 定义一个结构体,它只是尾队列的一个元素 它必须包含一个TAILQ_ENTRY来指向上一个和下一个元素 */ struct tailq_entry { int value; TAILQ_ENTRY(tailq_entry) entries; }; //定义队列的头部 TAILQ_HEAD(, tailq_entry) my_tailq_head; int main(int argc, char *argv[]) { //定义一个结构体指针 struct tailq_entry *item; //定义另外一个指针 struct tailq_entry *tmp_item; //初始化队列 TAILQ_INIT(&my_tailq_head); int i; //在队列里添加10个元素 for(i=0; i<10; i++) { //申请内存空间 item = malloc(sizeof(*item)); if (item == NULL) { perror("malloc failed"); exit(-1); } //设置值 item->value = i; /* 将元素加到队列尾部 参数1:指向队列头的指针 参数2:要添加的元素 参数3:结构体的变量名 */ TAILQ_INSERT_TAIL(&my_tailq_head, item, entries); } //遍历队列 printf("Forward traversal: "); TAILQ_FOREACH(item, &my_tailq_head, entries) { printf("%d ",item->value); } printf("\n"); //添加一个新的元素 printf("Adding new item after 5: "); TAILQ_FOREACH(item, &my_tailq_head, entries) { if (item->value == 5) { struct tailq_entry *new_item = malloc(sizeof(*new_item)); if (new_item == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } new_item->value = 10; //插入一个元素 TAILQ_INSERT_AFTER(&my_tailq_head, item, new_item, entries); break; } } TAILQ_FOREACH(item, &my_tailq_head, entries) { printf("%d ", item->value); } printf("\n"); //删除一个元素 printf("Deleting item with value 3: "); for(item = TAILQ_FIRST(&my_tailq_head); item != NULL; item = tmp_item) { if (item->value == 3) { //删除一个元素 TAILQ_REMOVE(&my_tailq_head, item, entries); //释放不需要的内存单元 free(item); break; } tmp_item = TAILQ_NEXT(item, entries); } TAILQ_FOREACH(item, &my_tailq_head, entries) { printf("%d ", item->value); } printf("\n"); //清空队列 while (item = TAILQ_FIRST(&my_tailq_head)) { TAILQ_REMOVE(&my_tailq_head, item, entries); free(item); } //查看是否为空 if (!TAILQ_EMPTY(&my_tailq_head)) { printf("tail queue is NOT empty!\n"); } return 0; }
顶
相关文章推荐
- C++11中的std::function
- 【WIN32】IntelliSense: "const char *" 类型的实参与 "LPCWSTR" 类型的形参不兼容
- std::set::lower_bound与std::lower_bound的效率问题
- 最全面的 C++ 资源、框架大全
- How to find size of array in C/C++ without using sizeof ?
- 第16周———用二进制文件处理学生成绩
- 【C/C++】深入预处理之line
- 处理C++源代码的程序
- 大一下学期C++总结
- leetcode_c++:Find the Duplicate Number(287)
- 一个学期的c++课程结束啦,总结一下~
- 增量式PID推导及C语言实现
- 最常用的两种C++序列化方案的使用心得
- 银行家算法(操作系统)(c++)
- C语言题库的上机题
- 快速中值滤波利用VC++和OpenCV调用其封装的动态链接库出现的错误和处理
- c++学习心得
- 处理C++源代码的程序
- 阅读程序
- 处理C++源代码的程序