.\" -*- 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 SLIST 3 "17 مايو 2025" "صفحات دليل لينكس 6.18" .SH الاسم .\"SLIST_FOREACH_FROM, .\"SLIST_FOREACH_FROM_SAFE, .\"SLIST_FOREACH_SAFE, .\"SLIST_REMOVE_AFTER, .\"SLIST_SWAP 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 \- تنفيذ قائمة مرتبطة منفردة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBSLIST_ENTRY(TYPE);\fP .P \fBSLIST_HEAD(HEADNAME, TYPE);\fP \fBSLIST_HEAD SLIST_HEAD_INITIALIZER(SLIST_HEAD \fP\fIhead\fP\fB);\fP \fBvoid SLIST_INIT(SLIST_HEAD *\fP\fIhead\fP\fB);\fP .P \fBint SLIST_EMPTY(SLIST_HEAD *\fP\fIhead\fP\fB);\fP .P \fBvoid SLIST_INSERT_HEAD(SLIST_HEAD *\fP\fIhead\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, SLIST_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid SLIST_INSERT_AFTER(struct TYPE *\fP\fIlistelm\fP\fB,\fP \fB struct TYPE *\fP\fIelm\fP\fB, SLIST_ENTRY \fP\fINAME\fP\fB);\fP .P \fBstruct TYPE *SLIST_FIRST(SLIST_HEAD *\fP\fIhead\fP\fB);\fP \fBstruct TYPE *SLIST_NEXT(struct TYPE *\fP\fIelm\fP\fB, SLIST_ENTRY \fP\fINAME\fP\fB);\fP .P .\" .BI "SLIST_FOREACH_FROM(struct TYPE *" var ", SLIST_HEAD *" head , .\" .BI " SLIST_ENTRY " NAME ); .\" .P .\" .BI "SLIST_FOREACH_SAFE(struct TYPE *" var ", SLIST_HEAD *" head , .\" .BI " SLIST_ENTRY " NAME ", struct TYPE *" temp_var ); .\" .BI "SLIST_FOREACH_FROM_SAFE(struct TYPE *" var ", SLIST_HEAD *" head , .\" .BI " SLIST_ENTRY " NAME ", struct TYPE *" temp_var ); \fBSLIST_FOREACH(struct TYPE *\fP\fIvar\fP\fB, SLIST_HEAD *\fP\fIhead\fP\fB, SLIST_ENTRY \fP\fINAME\fP\fB);\fP .P .\" .BI "void SLIST_REMOVE_AFTER(struct TYPE *" elm , .\" .BI " SLIST_ENTRY " NAME ); .\" .P .\" .BI "void SLIST_SWAP(SLIST_HEAD *" head1 ", SLIST_HEAD *" head2 , .\" .BI " SLIST_ENTRY " NAME ); \fBvoid SLIST_REMOVE(SLIST_HEAD *\fP\fIhead\fP\fB, struct TYPE *\fP\fIelm\fP\fB, TYPE,\fP \fB SLIST_ENTRY \fP\fINAME\fP\fB);\fP \fBvoid SLIST_REMOVE_HEAD(SLIST_HEAD *\fP\fIhead\fP\fB,\fP \fB SLIST_ENTRY \fP\fINAME\fP\fB);\fP .fi .SH الوصف تُعرِّف هذه الكليّات وتُشغِّل القوائم المرتبطة منفردة. .P في تعريفات الكليّات، \fITYPE\fP هو اسم بنية مُعرَّفة من قبل المستخدم، يجب أن تحتوي على حقل من النوع \fISLIST_ENTRY\fP، مُسمّى \fINAME\fP. المُعامل \fIHEADNAME\fP هو اسم بنية مُعرَّفة من قبل المستخدم يجب أن تُصرَّح باستخدام الكليّة \fBSLIST_HEAD\fP(). .SS الإنشاء القائمة المرتبطة منفردة يرأسها بنية مُعرَّفة بواسطة الكليّة \fBSLIST_HEAD\fP(). تحتوي هذه البنية على مؤشر وحيد إلى أول عنصر في القائمة. العناصر مرتبطة منفردة لتقليل المساحة وكلفة معالجة المؤشرات على حساب إزالة O(n) للعناصر العشوائية. يمكن إضافة عناصر جديدة إلى القائمة بعد عنصر موجود أو في رأس القائمة. تُصرَّح بنية \fISLIST_HEAD\fP كالتالي: .P .in +4 .EX SLIST_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 \fBSLIST_ENTRY\fP() تُصرِّح ببنية تربط العناصر في القائمة. .P \fBSLIST_HEAD_INITIALIZER\fP() تُقيَّم إلى مُهيِّئ للقائمة \fIhead\fP. .P \fBSLIST_INIT\fP() تُهيِّئ القائمة المُشار إليها بواسطة \fIhead\fP. .P \fBSLIST_EMPTY\fP() تُقيَّم إلى صحيح إذا لم تكن هناك عناصر في القائمة. .SS إدراج \fBSLIST_INSERT_HEAD\fP() تُدرج العنصر الجديد \fIelm\fP في رأس القائمة. .P \fBSLIST_INSERT_AFTER\fP() تُدرج العنصر الجديد \fIelm\fP بعد العنصر \fIlistelm\fP. .SS اجتياز \fBSLIST_FIRST\fP() تُعيد أول عنصر في القائمة، أو NULL إذا كانت القائمة فارغة. .P \fBSLIST_NEXT\fP() تُعيد العنصر التالي في القائمة. .P .\" .P .\" .BR SLIST_FOREACH_FROM () .\" behaves identically to .\" .BR SLIST_FOREACH () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found SLIST element and begins the loop at .\" .I var .\" instead of the first element in the SLIST referenced by .\" .IR head . .\" .Pp .\" .BR SLIST_FOREACH_SAFE () .\" traverses the list referenced by .\" .I head .\" in the forward direction, assigning each element in .\" turn to .\" .IR var . .\" However, unlike .\" .BR SLIST_FOREACH () .\" here it is permitted to both remove .\" .I var .\" as well as free it from within the loop safely without interfering with the .\" traversal. .\" .P .\" .BR SLIST_FOREACH_FROM_SAFE () .\" behaves identically to .\" .BR SLIST_FOREACH_SAFE () .\" when .\" .I var .\" is NULL, else it treats .\" .I var .\" as a previously found SLIST element and begins the loop at .\" .I var .\" instead of the first element in the SLIST referenced by .\" .IR head . \fBSLIST_FOREACH\fP() تجتاز القائمة المشار إليها بواسطة \fIhead\fP في الاتجاه الأمامي، مع تعيين كل عنصر بدوره إلى \fIvar\fP. .SS إزالة \fBSLIST_REMOVE\fP() يزيل العنصر \fIelm\fP من القائمة. .P .\" .P .\" .BR SLIST_REMOVE_AFTER () .\" removes the element after .\" .I elm .\" from the list. .\" Unlike .\" .IR SLIST_REMOVE , .\" this macro does not traverse the entire list. .\" .SS Other features .\" .BR SLIST_SWAP () .\" swaps the contents of .\" .I head1 .\" and .\" .IR head2 . \fBSLIST_REMOVE_HEAD\fP() يزيل العنصر \fIelm\fP من رأس القائمة. لتحقيق الكفاءة المثلى، يجب على العناصر التي تُزال من رأس القائمة استخدام هذا الماكرو صراحةً بدلاً من \fBSLIST_REMOVE\fP() العام. .SH "قيمة الإرجاع" \fBSLIST_EMPTY\fP() تُرجع قيمة غير صفرية إذا كانت القائمة فارغة، وصفرًا إذا كانت القائمة تحتوي على إدخال واحد على الأقل. .P \fBSLIST_FIRST\fP()، و \fBSLIST_NEXT\fP() تُرجعان مؤشرًا إلى أول أو تالي بنية \fITYPE\fP، على التوالي. .P \fBSLIST_HEAD_INITIALIZER\fP() تُرجع مُهيئًا يمكن تعيينه للقائمة \fIhead\fP. .SH المعايير BSD. .SH التاريخ 4.4BSD. .SH العلل \fBSLIST_FOREACH\fP() لا يسمح بإزالة أو تحرير \fIvar\fP داخل الحلقة، لأن ذلك سيتعارض مع الاجتياز. \fBSLIST_FOREACH_SAFE\fP()، الموجود في أنظمة BSD ولكنه غير موجود في glibc، يُصلح هذا القيد بالسماح بإزالة \fIvar\fP بأمان من القائمة وتحريره من داخل الحلقة دون التدخل في الاجتياز. .SH أمثلة .\" SRC BEGIN (slist.c) .EX #include #include #include #include \& 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\[rs]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); } .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 .