Linux TAILQ队列

删除节点,参考博客:关于TAILQ链表节点删除问题

队列操作宏
TAILQ_INIT 初始化队列
TAILQ_FOREACH 遍历队列
TAILQ_INSERT_BEFORE 在指定元素之前插入元素
TAILQ_INSERT_AFTER 在指定元素之后插入元素
TAILQ_INSERT_TAIL 在队列尾部插入元素
TAILQ_EMPTY 判断队列是否为空
TAILQ_REMOVE 从队列中移除元素
TAILQ_FIRST 获取队列第一个元素
TAILQ_LAST 获取队列最后一个元素

实例和说明

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/queue.h>

/* TAILQ_HEAD定义和队列元素定义 */
#ifndef TAILQ_END
#define TAILQ_END(head) (NULL)
#endif

#ifndef TAILQ_FOREACH_SAFE
#define TAILQ_FOREACH_SAFE(var, head, field, next) \
for ((var) = TAILQ_FIRST(head);                 \
        (var) != TAILQ_END(head) &&             \
        ((next) = TAILQ_NEXT(var, field), 1); (var) = (next))
#endif

typedef struct test_event {
    int value;
    TAILQ_ENTRY(test_event) tailq_entry;
} test_event_t;

TAILQ_HEAD(tailq_head, test_event) g_tailq;
/* ====== end ====== */

int main(int argc, char const *argv[])
{
    int i;
    test_event_t *event = NULL; /* 声明队列元素 */
    test_event_t *new_event = NULL; /* 声明队列元素 */
    test_event_t *next = NULL; /* 声明队列元素 */

    TAILQ_INIT(&g_tailq); /* 初始化队列 */

    /* 在在队列尾部插入元素 */
    for (i = 0; i < 5; i++) {
        event = (test_event_t *)malloc(sizeof(test_event_t));
        event->value = i;
        TAILQ_INSERT_TAIL(&g_tailq, event, tailq_entry);
    }

    /* 判断队列空 */
    if (TAILQ_EMPTY(&g_tailq)) {
        printf("empty\n");
    }

    /* 遍历队列元素 */
    TAILQ_FOREACH(event, &g_tailq, tailq_entry) {
        printf("event->value:%d\n", event->value);
    }

    /* 指定位置插入元素 */
    TAILQ_FOREACH(event, &g_tailq, tailq_entry) {
        /* 在 value == 1 元素之前插入元素 */
        if (event->value == 1) {
            new_event = (test_event_t *)malloc(sizeof(test_event_t));
            new_event->value = 10;
            TAILQ_INSERT_BEFORE(event, new_event, tailq_entry);
        }
        /* 在 value == 3 元素之后插入元素 */
        if (event->value == 3) {
            new_event = (test_event_t *)malloc(sizeof(test_event_t));
            new_event->value = 30;
            TAILQ_INSERT_AFTER(&g_tailq, event, new_event, tailq_entry);
        }
    }

    /* 获取队列第一个元素 */
    event = TAILQ_FIRST(&g_tailq);
    printf("first event->value: %d\n", event->value);

    /* 获取队列最后一个元素 */
    event = TAILQ_LAST(&g_tailq, tailq_head);
    printf("last event->value: %d\n", event->value);

    /* 从队列中移除元素,此段参考 http://www.cnblogs.com/chenyuejun/p/3867846.html */
    TAILQ_FOREACH_SAFE(event, &g_tailq, tailq_entry, next) {
        TAILQ_REMOVE(&g_tailq, event, tailq_entry);
        free(event);
    }

    return 0;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值