Can some one provide minimal example of TAILQ usage out of linux system library with explanation in c which can be compiled using gcc in Linux?
The TAILQ_ENTRY macro is used to establish the pointers used to insert items into the list. You place it into your structure that you want to list up.
Creation A tail queue is headed by a structure defined by the TAILQ_HEAD() macro. This structure contains a pair of pointers, one to the first element in the queue and the other to the last element in the queue. The elements are doubly linked so that an arbitrary element can be removed without traversing the queue.
The TAILQ_ENTRY
macro is used to establish the pointers used to insert items into the list. You place it into your structure that you want to list up.
struct foo {
TAILQ_ENTRY(foo) tailq;
int datum;
/* ... */
};
The TAILQ_HEAD
is used to define a structure that will act as the container for your link list elements. You provide it with a structure name, and the name of the type that it will contain.
TAILQ_HEAD(fooq, foo);
Use TAILQ_INIT
to initialize an instance of your list container.
struct fooq q;
TAILQ_INIT(&q);
Use the TAILQ_INSERT_*
macros to add elements.
struct foo data[3] = { foo(3), foo(7), foo(1) };
TAILQ_INSERT_HEAD(&q, &data[0], tailq);
TAILQ_INSERT_AFTER(&q, &data[0], &data[1], tailq);
TAILQ_INSERT_TAIL(&q, &data[2], tailq);
You can use TAILQ_FOREACH
and TAILQ_FOREACH_REVERSE
to traverse the list.
struct foo *p;
TAILQ_FOREACH(p, &q, tailq) {
printf(" %d", p->datum);
}
puts("");
If you want to iterate over the list while removing all its elements, it is probably easier to use a while loop and use the TAILQ_EMPTY
and TAILQ_FIRST
macros.
while (!TAILQ_EMPTY(&q)) {
p = TAILQ_FIRST(&q);
TAILQ_REMOVE(&q, p, tailq);
/* ... */
}
The above code was mostly taken verbatim from an example I wrote and tested on IDEONE.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With