SLIST(3)

الاسم
SLIST_EMPTY، SLIST_ENTRY، SLIST_FIRST، SLIST_FOREACH، SLIST_HEAD، SLIST_HEAD_INITIALIZER، SLIST_INIT، SLIST_INSERT_AFTER، SLIST_INSERT_HEAD، SLIST_NEXT، SLIST_REMOVE، SLIST_REMOVE_HEAD - تنفيذ قائمة مرتبطة منفردة

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

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

SLIST_ENTRY(TYPE);

SLIST_HEAD(HEADNAME, TYPE);
SLIST_HEAD SLIST_HEAD_INITIALIZER(SLIST_HEAD head);
void SLIST_INIT(SLIST_HEAD *head);

int SLIST_EMPTY(SLIST_HEAD *head);

void SLIST_INSERT_HEAD(SLIST_HEAD *head,
                        struct TYPE *elm, SLIST_ENTRY NAME);
void SLIST_INSERT_AFTER(struct TYPE *listelm,
                        struct TYPE *elm, SLIST_ENTRY NAME);

struct TYPE *SLIST_FIRST(SLIST_HEAD *head);
struct TYPE *SLIST_NEXT(struct TYPE *elm, SLIST_ENTRY NAME);

SLIST_FOREACH(struct TYPE *var, SLIST_HEAD *head, SLIST_ENTRY NAME);

void SLIST_REMOVE(SLIST_HEAD *head, struct TYPE *elm, TYPE,
                        SLIST_ENTRY NAME);
void SLIST_REMOVE_HEAD(SLIST_HEAD *head,
                        SLIST_ENTRY NAME);

الوصف
تُعرِّف هذه الكليّات وتُشغِّل القوائم المرتبطة منفردة.

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

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

    SLIST_HEAD(HEADNAME, TYPE) head;

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

    struct HEADNAME *headp;

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

SLIST_ENTRY() تُصرِّح ببنية تربط العناصر في القائمة.

SLIST_HEAD_INITIALIZER() تُقيَّم إلى مُهيِّئ للقائمة head.

SLIST_INIT() تُهيِّئ القائمة المُشار إليها بواسطة head.

SLIST_EMPTY() تُقيَّم إلى صحيح إذا لم تكن هناك عناصر في القائمة.

  إدراج
SLIST_INSERT_HEAD() تُدرج العنصر الجديد elm في رأس القائمة.

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

  اجتياز
SLIST_FIRST() تُعيد أول عنصر في القائمة، أو NULL إذا كانت القائمة فارغة.

SLIST_NEXT() تُعيد العنصر التالي في القائمة.

SLIST_FOREACH() تجتاز القائمة المشار إليها بواسطة head في الاتجاه الأمامي، مع تعيين كل عنصر بدوره إلى var.

  إزالة
SLIST_REMOVE() يزيل العنصر elm من القائمة.

SLIST_REMOVE_HEAD() يزيل العنصر elm من رأس القائمة. لتحقيق الكفاءة المثلى، يجب على العناصر التي تُزال من رأس القائمة استخدام هذا الماكرو صراحةً بدلاً من SLIST_REMOVE() العام.

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

SLIST_FIRST()، و SLIST_NEXT() تُرجعان مؤشرًا إلى أول أو تالي بنية TYPE، على التوالي.

SLIST_HEAD_INITIALIZER() تُرجع مُهيئًا يمكن تعيينه للقائمة head.

المعايير
BSD.

التاريخ
4.4BSD.

العلل
SLIST_FOREACH() لا يسمح بإزالة أو تحرير var داخل الحلقة، لأن ذلك سيتعارض مع الاجتياز. SLIST_FOREACH_SAFE()، الموجود في أنظمة BSD ولكنه غير موجود في glibc، يُصلح هذا القيد بالسماح بإزالة var بأمان من القائمة وتحريره من داخل الحلقة دون التدخل في الاجتياز.

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

    struct entry {
        int data;
        SLIST_ENTRY(entry) entries;             /* Singly linked list */
    };

    SLIST_HEAD(slisthead, entry);

    int
    main(void)
    {
        struct entry *n1, *n2, *n3, *np;
        struct slisthead head;                  /* Singly linked list
                                                   head */

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

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

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

        SLIST_REMOVE(&head, n2, entry, entries);/* Deletion */
        free(n2);

        n3 = SLIST_FIRST(&head);
        SLIST_REMOVE_HEAD(&head, entries);      /* Deletion from the head */
        free(n3);

        for (unsigned int i = 0; i < 5; i++) {
            n1 = malloc(sizeof(struct entry));
            SLIST_INSERT_HEAD(&head, n1, entries);
            n1->data = i;
        }

                                                /* Forward traversal */
        SLIST_FOREACH(np, &head, entries)
            printf("%i\n", np->data);

        while (!SLIST_EMPTY(&head)) {           /* List deletion */
            n1 = SLIST_FIRST(&head);
            SLIST_REMOVE_HEAD(&head, entries);
            free(n1);
        }
        SLIST_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.