insque(3)

الاسم
insque, remque - إدراج/إزالة عنصر من طابور

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

موجز
#include <search.h>

void insque(void *elem, void *prev);
void remque(void *elem);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

insque()، remque():
    _XOPEN_SOURCE >= 500
        || /* glibc >= 2.19: */ _DEFAULT_SOURCE
        || /* glibc <= 2.19: */ _SVID_SOURCE

الوصف
تتعامل الدالتان insque() و remque() مع القوائم المرتبطة مزدوجة الاتجاه. كل عنصر في القائمة هو بنية يكون أول عنصرين فيها مؤشرًا أماميًا ومؤشرًا خلفيًا. قد تكون القائمة المرتبطة خطية (أي مؤشر أمامي NULL في نهاية القائمة ومؤشر خلفي NULL في بداية القائمة) أو دائرية.

تُدرج الدالة insque() العنصر المشار إليه بواسطة elem مباشرة بعد العنصر المشار إليه بواسطة prev.

إذا كانت القائمة خطية، فيمكن استخدام الاستدعاء insque(elem, NULL) لإدراج عنصر القائمة الأولي، ويضبط الاستدعاء المؤشرين الأمامي والخلفي لـ elem إلى NULL.

إذا كانت القائمة دائرية، يجب على المستدعي التأكد من تهيئة المؤشرين الأمامي والخلفي للعنصر الأول للإشارة إلى ذلك العنصر، ويجب أن تشير وسيطة prev لاستدعاء insque() أيضًا إلى العنصر.

تزيل الدالة remque() العنصر المشار إليه بواسطة elem من القائمة المرتبطة مزدوجة الاتجاه.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
insque(), remque() | سلامة الخيوط | MT-Safe

الإصدارات
في الأنظمة القديمة، كانت وسائط هذه الدوال من النوع struct qelem *، المُعرَّف كالتالي:

    struct qelem {
        struct qelem *q_forw;
        struct qelem *q_back;
        char          q_data[1];
    };

هذا ما ستحصل عليه إذا عُرِّف _GNU_SOURCE قبل تضمين <search.h>.

يختلف موقع النماذج الأولية لهذه الدوال بين عدة إصدارات من UNIX. ما سبق هو إصدار POSIX. تضعها بعض الأنظمة في <string.h>.

المعايير
POSIX.1-2008.

التاريخ
POSIX.1-2001.

العلل
في glibc 2.4 والإصدارات الأقدم، لم يكن من الممكن تحديد prev كـ NULL. وبالتالي، لبناء قائمة خطية، كان على المستدعي بناء قائمة باستخدام استدعاء أولي يحتوي على أول عنصرين من القائمة، مع تهيئة المؤشرين الأمامي والخلفي في كل عنصر بشكل مناسب.

أمثلة
يوضح البرنامج أدناه استخدام insque(). إليك مثال لتشغيل البرنامج:

    $ ./a.out -c a b c
    Traversing completed list:
        a
        b
        c
    That was a circular list

  مصدر البرنامج
    #include <search.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    struct element {
        struct element *forward;
        struct element *backward;
        char *name;
    };

    static struct element *
    new_element(void)
    {
        struct element *e;

        e = malloc(sizeof(*e));
        if (e == NULL) {
            fprintf(stderr, "malloc() failed\n");
            exit(EXIT_FAILURE);
        }

        return e;
    }

    int
    main(int argc, char *argv[])
    {
        struct element *first, *elem, *prev;
        int circular, opt, errfnd;

        /* The "-c" command-line option can be used to specify that the
           list is circular.  */

        errfnd = 0;
        circular = 0;
        while ((opt = getopt(argc, argv, "c")) != -1) {
            switch (opt) {
            case 'c':
                circular = 1;
                break;
            default:
                errfnd = 1;
                break;
            }
        }

        if (errfnd || optind >= argc) {
            fprintf(stderr,  "Usage: %s [-c] string...\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        /* Create first element and place it in the linked list.  */

        elem = new_element();
        first = elem;

        elem->name = argv[optind];

        if (circular) {
            elem->forward = elem;
            elem->backward = elem;
            insque(elem, elem);
        } else {
            insque(elem, NULL);
        }

        /* Add remaining command-line arguments as list elements.  */

        while (++optind < argc) {
            prev = elem;

            elem = new_element();
            elem->name = argv[optind];
            insque(elem, prev);
        }

        /* Traverse the list from the start, printing element names.  */

        printf("Traversing completed list:\n");
        elem = first;
        do {
            printf("    %s\n", elem->name);
            elem = elem->forward;
        } while (elem != NULL && elem != first);

        if (elem == first)
            printf("That was a circular list\n");

        exit(EXIT_SUCCESS);
    }

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

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

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

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