我模糊地记得TAILQ_SPLICE()或梅里特门控源代码中的提供此类功能的函数。 Google搜索未找到任何此类参考。 BSD和Linux中的sys / queue.h似乎都没有这样的内容。

我有一个大清单和一个小清单。我想将小名单与大名单合并。

 struct some_type {
    int some_field;
    TAILQ_ENTRY(some_type) list_next;
}

TAILQ_HEAD(,some_type) big_list;
TAILQ_HEAD(,some_type) small_list1;

TAILQ_SPLICE(&big_list, &small_list, list_next);


调用之后,small_list将为空,所有元素都将移至big_list。我想使用一些经过验证的代码(如果有),而不是自己编写。

最佳答案

根据我的测试,以下代码似乎有效。

#define TAILQ_SPLICE(head1, head2, headname, field) do {                \
   if (!TAILQ_EMPTY(head2)) {                                           \
       typeof((head1)->tqh_first) first2 = TAILQ_FIRST(head2);          \
       typeof((head1)->tqh_first) last2  = TAILQ_LAST(head2, headname); \
       first2->field.tqe_prev          = (head1)->tqh_last;             \
       if (TAILQ_EMPTY(head1)) {                                        \
           (head1)->tqh_first        = first2;                          \
      } else {                                                          \
           *(head1)->tqh_last    = first2;                              \
      }                                                                 \
      (head1)->tqh_last        = &last2->field.tqe_next;                \
      (head2)->tqh_first = NULL;                                        \
      (head2)->tqh_last = &((head2)->tqh_first);                        \
   }                                                                    \
} while (0);

关于c - 是否有用于合并两个TAILQ的sys/queue.h宏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32491120/

10-11 15:20
查看更多