Minimal example of TAILQ usage out of library

后端 未结 1 849
一生所求
一生所求 2021-01-31 11:07

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?

1条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-31 11:40

    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.

    0 讨论(0)
提交回复
热议问题