TAILQ(3)

الاسم
TAILQ_CONCAT, TAILQ_EMPTY, TAILQ_ENTRY, TAILQ_FIRST, TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, TAILQ_HEAD, TAILQ_HEAD_INITIALIZER, TAILQ_INIT, TAILQ_INSERT_AFTER, TAILQ_INSERT_BEFORE, TAILQ_INSERT_HEAD, TAILQ_INSERT_TAIL, TAILQ_LAST, TAILQ_NEXT, TAILQ_PREV, TAILQ_REMOVE - تنفيذ طابور ذيل مزدوج الوصل

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <sys/queue.h>

TAILQ_ENTRY(TYPE);

TAILQ_HEAD(HEADNAME, TYPE);
TAILQ_HEAD TAILQ_HEAD_INITIALIZER(TAILQ_HEAD head);
void TAILQ_INIT(TAILQ_HEAD *head);

int TAILQ_EMPTY(TAILQ_HEAD *head);

void TAILQ_INSERT_HEAD(TAILQ_HEAD *head,
                         struct TYPE *elm, TAILQ_ENTRY NAME);
void TAILQ_INSERT_TAIL(TAILQ_HEAD *head,
                         struct TYPE *elm, TAILQ_ENTRY NAME);
void TAILQ_INSERT_BEFORE(struct TYPE *listelm,
                         struct TYPE *elm, TAILQ_ENTRY NAME);
void TAILQ_INSERT_AFTER(TAILQ_HEAD *head, struct TYPE *listelm,
                         struct TYPE *elm, TAILQ_ENTRY NAME);

struct TYPE *TAILQ_FIRST(TAILQ_HEAD *head);
struct TYPE *TAILQ_LAST(TAILQ_HEAD *head, HEADNAME);
struct TYPE *TAILQ_PREV(struct TYPE *elm, HEADNAME, TAILQ_ENTRY NAME);
struct TYPE *TAILQ_NEXT(struct TYPE *elm, TAILQ_ENTRY NAME);

TAILQ_FOREACH(struct TYPE *var, TAILQ_HEAD *head,
                         TAILQ_ENTRY NAME);
TAILQ_FOREACH_REVERSE(struct TYPE *var, TAILQ_HEAD *head, HEADNAME,
                         TAILQ_ENTRY NAME);

void TAILQ_REMOVE(TAILQ_HEAD *head, struct TYPE *elm,
                         TAILQ_ENTRY NAME);

void TAILQ_CONCAT(TAILQ_HEAD *head1, TAILQ_HEAD *head2,
                         TAILQ_ENTRY NAME);

الوصف
تُعرِّف هذه الكليّات وتُشغّل على طوابير ذيل مزدوجة الوصل.

في تعريفات الكليّات، TYPE هو اسم بنية مُعرَّفة من المستخدم، يجب أن تحتوي على حقل من نوع TAILQ_ENTRY، اسمه NAME. المعامل HEADNAME هو اسم بنية مُعرَّفة من المستخدم يجب أن تُصرَّح باستخدام الكلية TAILQ_HEAD().

  الإنشاء
يترأس طابور الذيل بنية مُعرَّفة بالكلية TAILQ_HEAD(). تحتوي هذه البنية على زوج من المؤشرات، واحد إلى أول عنصر في الطابور والآخر إلى آخر عنصر في الطابور. العناصر مزدوجة الوصل بحيث يمكن إزالة أي عنصر دون اجتياز الطابور. يمكن إضافة عناصر جديدة إلى الطابور بعد عنصر موجود، أو قبل عنصر موجود، أو في رأس الطابور، أو في نهاية الطابور. تُصرَّح بنية TAILQ_HEAD كالتالي:

    TAILQ_HEAD(HEADNAME, TYPE) head;

حيث struct HEADNAME هي البنية المراد تعريفها، و struct TYPE هو نوع العناصر المراد ربطها في الطابور. يمكن لاحقًا التصريح عن مؤشر لرأس الطابور كـ:

    struct HEADNAME *headp;

(الاسمان head و headp يمكن للمستخدم اختيارهما.)

تُصرِّح TAILQ_ENTRY() ببنية تربط العناصر في الطابور.

تُقيِّم TAILQ_HEAD_INITIALIZER() إلى مُهيِّئ للطابور head.

تهيئ TAILQ_INIT() الطابور المُشار إليه بـ

تُقيِّم TAILQ_EMPTY() إلى صواب إذا لم تكن هناك عناصر في الطابور. head.

  إدراج
تُدرج TAILQ_INSERT_HEAD() العنصر الجديد elm في رأس الطابور.

تُدرج TAILQ_INSERT_TAIL() العنصر الجديد elm في نهاية الطابور.

تُدرج TAILQ_INSERT_BEFORE() العنصر الجديد elm قبل العنصر listelm.

تدرج TAILQ_INSERT_AFTER() العنصر الجديد elm بعد العنصر listelm.

  اجتياز
ترجع TAILQ_FIRST() أول عنصر في الطابور، أو NULL إذا كان الطابور فارغًا.

ترجع TAILQ_LAST() آخر عنصر في الطابور. إذا كان الطابور فارغًا، تكون القيمة المرجعة NULL.

ترجع TAILQ_PREV() العنصر السابق في الطابور، أو NULL إذا كان هذا العنصر هو الأول.

ترجع TAILQ_NEXT() العنصر التالي في الطابور، أو NULL إذا كان هذا العنصر هو الأخير.

تعبر TAILQ_FOREACH() الطابور المشار إليه بـ head في الاتجاه الأمامي، مع تخصيص كل عنصر بدوره إلى var. يُضبط var إلى NULL إذا اكتملت الحلقة بشكل طبيعي، أو إذا لم تكن هناك عناصر.

تعبر TAILQ_FOREACH_REVERSE() الطابور المشار إليه بـ head في الاتجاه العكسي، مع تخصيص كل عنصر بدوره إلى var.

  إزالة
تزيل TAILQ_REMOVE() العنصر elm من الطابور.

  ميزات أخرى
تسلسل TAILQ_CONCAT() الطابور الذي يرأسه head2 إلى نهاية الطابور الذي يرأسه head1 مع إزالة جميع الإدخالات من الأول.

قيمة الإرجاع
ترجع TAILQ_EMPTY() قيمة غير صفرية إذا كان الطابور فارغًا، وصفرًا إذا كان الطابور يحتوي على إدخال واحد على الأقل.

ترجع TAILQ_FIRST() وTAILQ_LAST() وTAILQ_PREV() وTAILQ_NEXT() مؤشرًا إلى بنية TYPE الأولى أو الأخيرة أو السابقة أو التالية، على التوالي.

ترجع TAILQ_HEAD_INITIALIZER() مُهيئًا يمكن تخصيصه للطابور head.

المعايير
BSD.

التاريخ
4.4BSD.

تحذيرات
لا تسمح TAILQ_FOREACH() وTAILQ_FOREACH_REVERSE() بإزالة أو تحرير var داخل الحلقة، لأن ذلك سيتداخل مع العبور. تعمل TAILQ_FOREACH_SAFE() وTAILQ_FOREACH_REVERSE_SAFE()، الموجودتان في أنظمة BSD ولكن غير موجودتين في glibc، على إصلاح هذا القيد بالسماح بإزالة var بأمان من القائمة وتحريره من داخل الحلقة دون التداخل مع العبور.

أمثلة
    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/queue.h>

    struct entry {
        int data;
        TAILQ_ENTRY(entry) entries;             /* Tail queue */
    };

    TAILQ_HEAD(tailhead, entry);

    int
    main(void)
    {
        struct entry *n1, *n2, *n3, *np;
        struct tailhead head;                   /* Tail queue head */
        int i;

        TAILQ_INIT(&head);                      /* Initialize the queue */

        n1 = malloc(sizeof(struct entry));      /* Insert at the head */
        TAILQ_INSERT_HEAD(&head, n1, entries);

        n1 = malloc(sizeof(struct entry));      /* Insert at the tail */
        TAILQ_INSERT_TAIL(&head, n1, entries);

        n2 = malloc(sizeof(struct entry));      /* Insert after */
        TAILQ_INSERT_AFTER(&head, n1, n2, entries);

        n3 = malloc(sizeof(struct entry));      /* Insert before */
        TAILQ_INSERT_BEFORE(n2, n3, entries);

        TAILQ_REMOVE(&head, n2, entries);       /* Deletion */
        free(n2);
                                                /* Forward traversal */
        i = 0;
        TAILQ_FOREACH(np, &head, entries)
            np->data = i++;
                                                /* Reverse traversal */
        TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
            printf("%i\n", np->data);
                                                /* TailQ deletion */
        n1 = TAILQ_FIRST(&head);
        while (n1 != NULL) {
            n2 = TAILQ_NEXT(n1, entries);
            free(n1);
            n1 = n2;
        }
        TAILQ_INIT(&head);

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
insque(3)، queue(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.