.\" -*- coding: UTF-8 -*- .\" Copyright 1993, The Regents of the University of California. .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: BSD-3-Clause .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH CIRCLEQ 3 "17 مايو 2025" "صفحات دليل لينكس 6.18" .SH الاسم CIRCLEQ_EMPTY، CIRCLEQ_ENTRY، CIRCLEQ_FIRST، CIRCLEQ_FOREACH، CIRCLEQ_FOREACH_REVERSE، CIRCLEQ_HEAD، CIRCLEQ_HEAD_INITIALIZER، CIRCLEQ_INIT، CIRCLEQ_INSERT_AFTER، CIRCLEQ_INSERT_BEFORE، CIRCLEQ_INSERT_HEAD، CIRCLEQ_INSERT_TAIL، CIRCLEQ_LAST، CIRCLEQ_LOOP_NEXT، CIRCLEQ_LOOP_PREV، CIRCLEQ_NEXT، CIRCLEQ_PREV، CIRCLEQ_REMOVE \- تنفيذ طابور دائري مزدوج الوصل .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBCIRCLEQ_ENTRY(TYPE);\fP .P \fBCIRCLEQ_HEAD(HEADNAME, TYPE);\fP \fBCIRCLEQ_HEAD CIRCLEQ_HEAD_INITIALIZER(CIRCLEQ_HEAD \fP\fIhead\fP\fB);\fP \fBvoid CIRCLEQ_INIT(CIRCLEQ_HEAD *\fP\fIhead\fP\fB);\fP .P \fBint CIRCLEQ_EMPTY(CIRCLEQ_HEAD *\fP\fIhead\fP\fB);\fP .P \fBvoid CIRCLEQ_INSERT_HEAD(CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid CIRCLEQ_INSERT_TAIL(CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid CIRCLEQ_INSERT_BEFORE(CIRCLEQ_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIlistelm\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid CIRCLEQ_INSERT_AFTER(CIRCLEQ_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIlistelm\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP .P \fBstruct TYPE *CIRCLEQ_FIRST(CIRCLEQ_HEAD *\fP\fIhead\fP\fB);\fP \fBstruct TYPE *CIRCLEQ_LAST(CIRCLEQ_HEAD *\fP\fIhead\fP\fB);\fP \fBstruct TYPE *CIRCLEQ_PREV(struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBstruct TYPE *CIRCLEQ_NEXT(struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBstruct TYPE *CIRCLEQ_LOOP_PREV(CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBstruct TYPE *CIRCLEQ_LOOP_NEXT(CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP .P \fBCIRCLEQ_FOREACH(struct TYPE *\fP\fIvar\fP\fB, CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP \fBCIRCLEQ_FOREACH_REVERSE(struct TYPE *\fP\fIvar\fP\fB, CIRCLEQ_HEAD *\fP\fIhead\fP\fB,\fP \fB CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP .P \fBvoid CIRCLEQ_REMOVE(CIRCLEQ_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIelm\fP\fB,\fP \fB CIRCLEQ_ENTRY \fP\fINAME\fP\fB);\fP .fi .SH الوصف تعرف هذه الكليّات وتُشغّل طوابير دائرية مزدوجة الوصل. .P في تعريفات الكليّات، \fITYPE\fP هو اسم بنية معرّفة من المستخدم، يجب أن تحتوي على حقل من نوع \fICIRCLEQ_ENTRY\fP، اسمه \fINAME\fP. الوسيط \fIHEADNAME\fP هو اسم بنية معرّفة من المستخدم يجب أن تُصرّح باستخدام الكلية \fBCIRCLEQ_HEAD\fP(). .SS الإنشاء يترأس الطابور الدائري بنية معرّفة بالكلية \fBCIRCLEQ_HEAD\fP(). تحتوي هذه البنية على زوج من المؤشرات، واحد إلى أول عنصر في الطابور والآخر إلى آخر عنصر في الطابور. العناصر موصولة مزدوجًا بحيث يمكن إزالة أي عنصر دون اجتياز الطابور. يمكن إضافة عناصر جديدة إلى الطابور بعد عنصر موجود، قبل عنصر موجود، في رأس الطابور، أو في نهاية الطابور. تُصرّح بنية \fICIRCLEQ_HEAD\fP كالتالي: .P .in +4 .EX CIRCLEQ_HEAD(HEADNAME, TYPE) head; .EE .in .P حيث \fIstruct HEADNAME\fP هي البنية المراد تعريفها، و \fIstruct TYPE\fP هو نوع العناصر المراد ربطها في الطابور. يمكن لاحقًا التصريح عن مؤشر لرأس الطابور كـ: .P .in +4 .EX struct HEADNAME *headp; .EE .in .P (الاسمان \fIhead\fP و \fIheadp\fP يمكن للمستخدم اختيارهما.) .P \fBCIRCLEQ_ENTRY\fP() تُصرّح ببنية تصل العناصر في الطابور. .P \fBCIRCLEQ_HEAD_INITIALIZER\fP() تُقيّم إلى مُهيئ للطابور \fIhead\fP. .P \fBCIRCLEQ_INIT\fP() تُهيئ الطابور المشار إليه بـ \fIhead\fP. .P \fBCIRCLEQ_EMPTY\fP() تُقيّم إلى صحيح إذا لم تكن هناك عناصر في الطابور. .SS إدراج \fBCIRCLEQ_INSERT_HEAD\fP() تُدرج العنصر الجديد \fIelm\fP في رأس الطابور. .P \fBCIRCLEQ_INSERT_TAIL\fP() تُدرج العنصر الجديد \fIelm\fP في نهاية الطابور. .P \fBCIRCLEQ_INSERT_BEFORE\fP() تُدرج العنصر الجديد \fIelm\fP قبل العنصر \fIlistelm\fP. .P \fBCIRCLEQ_INSERT_AFTER\fP() تُدرج العنصر الجديد \fIelm\fP بعد العنصر \fIlistelm\fP. .SS اجتياز \fBCIRCLEQ_FIRST\fP() تُرجع أول عنصر في الطابور. .P \fBCIRCLEQ_LAST\fP() تُرجع آخر عنصر في الطابور. .P \fBCIRCLEQ_PREV\fP() تُرجع العنصر السابق في الطابور، أو \fI&head\fP إذا كان هذا العنصر هو الأول. .P \fBCIRCLEQ_NEXT\fP() تُرجع العنصر التالي في الطابور، أو \fI&head\fP إذا كان هذا العنصر هو الأخير. .P \fBCIRCLEQ_LOOP_PREV\fP() تُرجع العنصر السابق في الطابور. إذا كان \fIelm\fP هو العنصر الأول في الطابور، يُرجع العنصر الأخير. .P \fBCIRCLEQ_LOOP_NEXT\fP() تُرجع العنصر التالي في الطابور. إذا كان \fIelm\fP هو العنصر الأخير في الطابور، يُرجع العنصر الأول. .P \fBCIRCLEQ_FOREACH\fP() تجتاز الطابور المُشار إليه بـ \fIhead\fP في الاتجاه الأمامي، مُسندةً كل عنصر بدوره إلى \fIvar\fP. يُضبط \fIvar\fP إلى \fI&head\fP إذا اكتملت الحلقة بشكل طبيعي، أو إذا لم تكن هناك عناصر. .P \fBCIRCLEQ_FOREACH_REVERSE\fP() تجتاز الطابور المُشار إليه بـ \fIhead\fP في الاتجاه العكسي، مُسندةً كل عنصر بدوره إلى \fIvar\fP. .SS إزالة \fBCIRCLEQ_REMOVE\fP() تُزيل العنصر \fIelm\fP من الطابور. .SH "قيمة الإرجاع" \fBCIRCLEQ_EMPTY\fP() تُرجع قيمة غير صفرية إذا كان الطابور فارغًا، وصفرًا إذا كان الطابور يحتوي على إدخال واحد على الأقل. .P \fBCIRCLEQ_FIRST\fP()، \fBCIRCLEQ_LAST\fP()، \fBCIRCLEQ_LOOP_PREV\fP()، و \fBCIRCLEQ_LOOP_NEXT\fP() تُرجع مؤشرًا إلى بنية \fITYPE\fP الأولى أو الأخيرة أو السابقة أو التالية، على التوالي. .P \fBCIRCLEQ_PREV\fP() و \fBCIRCLEQ_NEXT\fP() مماثلتان لنظيرتيهما \fBCIRCLEQ_LOOP_*\fP()، باستثناء أنه إذا كانت الوسيطة هي العنصر الأول أو الأخير، على التوالي، فإنهما تُرجعان \fI&head\fP. .P \fBCIRCLEQ_HEAD_INITIALIZER\fP() تُرجع مُهيئًا يمكن إسناده إلى رأس الطابور \fIhead\fP. .SH المعايير BSD. .SH العلل \fBCIRCLEQ_FOREACH\fP() و \fBCIRCLEQ_FOREACH_REVERSE\fP() لا تسمحان بإزالة \fIvar\fP أو تحريره داخل الحلقة، لأن ذلك سيتداخل مع الاجتياز. \fBCIRCLEQ_FOREACH_SAFE\fP() و \fBCIRCLEQ_FOREACH_REVERSE_SAFE\fP()، الموجودتان في أنظمة BSD ولكن غير موجودتين في glibc، تُصلحان هذا القيد بالسماح بإزالة \fIvar\fP بأمان من القائمة وتحريره من داخل الحلقة دون التداخل مع الاجتياز. .SH أمثلة .\" SRC BEGIN (circleq.c) .EX #include #include #include #include \& struct entry { int data; CIRCLEQ_ENTRY(entry) entries; /* Queue */ }; \& CIRCLEQ_HEAD(circlehead, entry); \& int main(void) { struct entry *n1, *n2, *n3, *np; struct circlehead head; /* Queue head */ int i; \& CIRCLEQ_INIT(&head); /* Initialize the queue */ \& n1 = malloc(sizeof(struct entry)); /* Insert at the head */ CIRCLEQ_INSERT_HEAD(&head, n1, entries); \& n1 = malloc(sizeof(struct entry)); /* Insert at the tail */ CIRCLEQ_INSERT_TAIL(&head, n1, entries); \& n2 = malloc(sizeof(struct entry)); /* Insert after */ CIRCLEQ_INSERT_AFTER(&head, n1, n2, entries); \& n3 = malloc(sizeof(struct entry)); /* Insert before */ CIRCLEQ_INSERT_BEFORE(&head, n2, n3, entries); \& CIRCLEQ_REMOVE(&head, n2, entries); /* Deletion */ free(n2); /* Forward traversal */ i = 0; CIRCLEQ_FOREACH(np, &head, entries) np\->data = i++; /* Reverse traversal */ CIRCLEQ_FOREACH_REVERSE(np, &head, entries) printf("%i\[rs]n", np\->data); /* Queue deletion */ n1 = CIRCLEQ_FIRST(&head); while (n1 != (void *)&head) { n2 = CIRCLEQ_NEXT(n1, entries); free(n1); n1 = n2; } CIRCLEQ_INIT(&head); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBinsque\fP(3)، \fBqueue\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .