.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 1995, James R. Van Zandt .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH tsearch 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم tsearch, tfind, tdelete, twalk, twalk_r, tdestroy \- إدارة شجرة بحث ثنائية .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBtypedef enum { preorder, postorder, endorder, leaf } VISIT;\fP .P \fBvoid *tfind(const void *\fP\fIkey\fP\fB, void *const *\fP\fIrootp\fP\fB,\fP \fB typeof(int (const void *, const void *)) *\fP\fIcompar\fP\fB);\fP \fBvoid *tsearch(const void *\fP\fIkey\fP\fB, void **\fP\fIrootp\fP\fB,\fP \fB typeof(int (const void *, const void *)) *\fP\fIcompar\fP\fB);\fP \fBvoid *tdelete(const void *restrict \fP\fIkey\fP\fB, void **restrict \fP\fIrootp\fP\fB,\fP \fB typeof(int (const void *, const void *)) *\fP\fIcompar\fP\fB);\fP \fBvoid twalk(const void *\fP\fIroot\fP\fB,\fP \fB typeof(void (const void *\fP\fInodep\fP\fB, VISIT \fP\fIwhich\fP\fB, int \fP\fIdepth\fP\fB))\fP \fB *\fP\fIaction\fP\fB);\fP .P \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#include \fP .P \fBvoid twalk_r(const void *\fP\fIroot\fP\fB,\fP \fB typeof(void (const void *\fP\fInodep\fP\fB, VISIT \fP\fIwhich\fP\fB, void *\fP\fIclosure\fP\fB))\fP \fB *\fP\fIaction\fP\fB,\fP \fB void *\fP\fIclosure\fP\fB);\fP \fBvoid tdestroy(void *\fP\fIroot\fP\fB,\fP \fB typeof(void (void *\fP\fInodep\fP\fB)) *\fP\fIfree_node\fP\fB);\fP .fi .SH الوصف تدير الدوال \fBtsearch\fP() و \fBtfind\fP() و \fBtwalk\fP() و \fBtdelete\fP() شجرة بحث ثنائية. عُمِّمت هذه الدوال من خوارزمية T لـ Knuth (6.2.2). الحقل الأول في كل عقدة من الشجرة هو مؤشر لعنصر البيانات المقابل. (يجب على البرنامج المستدعي تخزين البيانات الفعلية.) يشير \fIcompar\fP إلى روتين مقارنة، يأخذ مؤشرين لعنصرين. يجب أن يُرجع عددًا صحيحًا سالبًا أو صفرًا أو موجبًا، اعتمادًا على ما إذا كان العنصر الأول أقل من الثاني أو مساويًا له أو أكبر منه. .P تبحث \fBtsearch\fP() في الشجرة عن عنصر. يشير \fIkey\fP إلى العنصر المطلوب البحث عنه. يشير \fIrootp\fP إلى متغير يشير إلى جذر الشجرة. إذا كانت الشجرة فارغة، فيجب ضبط المتغير الذي يشير إليه \fIrootp\fP على NULL. إذا وُجد العنصر في الشجرة، فتُرجع \fBtsearch\fP() مؤشرًا إلى عقدة الشجرة المقابلة. (بمعنى آخر، تُرجع \fBtsearch\fP() مؤشرًا إلى مؤشر لعنصر البيانات.) إذا لم يُعثر على العنصر، فتضيفه \fBtsearch\fP() وتُعيد مؤشرًا إلى عقدة الشجرة المقابلة. .P \fBtfind\fP() تشبه \fBtsearch\fP()، باستثناء أنه إذا لم يُعثر على العنصر، فتُرجع \fBtfind\fP() NULL. .P تحذف \fBtdelete\fP() عنصرًا من الشجرة. وسيطاتها هي نفس وسيطات \fBtsearch\fP(). .P تنفذ \fBtwalk\fP() اجتيازًا أوليًا بالعمق من اليسار إلى اليمين لشجرة ثنائية. يشير \fIroot\fP إلى عقدة البداية للاجتياز. إذا لم تكن تلك العقدة هي الجذر، فستتم زيارة جزء فقط من الشجرة. تستدعي \fBtwalk\fP() دالة المستخدم \fIaction\fP في كل مرة تُزار فيها عقدة (أي ثلاث مرات للعقدة الداخلية، ومرة واحدة للورقة). تأخذ \fIaction\fP بدورها ثلاث وسيطات. الوسيطة الأولى هي مؤشر للعقدة التي تُزار. بنية العقدة غير محددة، لكن من الممكن تحويل المؤشر إلى مؤشر لمؤشر للعنصر للوصول إلى العنصر المخزن داخل العقدة. يجب ألا يُعدِّل التطبيق البنية المشار إليها بهذه الوسيطة. الوسيطة الثانية هي عدد صحيح يأخذ إحدى القيم \fBpreorder\fP أو \fBpostorder\fP أو \fBendorder\fP اعتمادًا على ما إذا كانت هذه هي الزيارة الأولى أو الثانية أو الثالثة للعقدة الداخلية، أو القيمة \fBleaf\fP إذا كانت هذه هي الزيارة الوحيدة لعقدة ورقية. (هذه الرموز مُعرَّفة في \fI\fP.) الوسيطة الثالثة هي عمق العقدة؛ عمق عقدة الجذر هو صفر. .P (بشكل أكثر شيوعًا، تُعرف \fBpreorder\fP و \fBpostorder\fP و \fBendorder\fP باسم \fBpreorder\fP و \fBinorder\fP و \fBpostorder\fP: قبل زيارة الأطفال، بعد الأول وقبل الثاني، وبعد زيارة الأطفال. وبالتالي، فإن اختيار الاسم \fBpost\%order\fP مربك إلى حد ما.) .P \fBtwalk_r\fP() مشابهة لـ \fBtwalk\fP()، ولكن بدلاً من وسيطة \fIdepth\fP، يُمرَّر مؤشر وسيطة \fIclosure\fP إلى كل استدعاء لاستدعاء الإجراء، دون تغيير. يمكن استخدام هذا المؤشر لتمرير المعلومات من وإلى دالة الاستدعاء بطريقة آمنة للخيوط، دون اللجوء إلى متغيرات عامة. .P تزيل \fBtdestroy\fP() الشجرة بأكملها المشار إليها بواسطة \fIroot\fP، وتحرر جميع الموارد المخصصة بواسطة دالة \fBtsearch\fP(). بالنسبة للبيانات في كل عقدة شجرة، تُستدعى الدالة \fIfree_node\fP. يُمرَّر مؤشر البيانات كوسيطة للدالة. إذا لم تكن هناك حاجة لمثل هذا العمل، فيجب أن يشير \fIfree_node\fP إلى دالة لا تفعل شيئًا. .SH "قيمة الإرجاع" تُرجع \fBtsearch\fP() مؤشرًا إلى عقدة مطابقة في الشجرة، أو إلى العقدة المضافة حديثًا، أو NULL إذا لم تكن هناك ذاكرة كافية لإضافة العنصر. تُرجع \fBtfind\fP() مؤشرًا إلى العقدة، أو NULL إذا لم يُعثر على تطابق. إذا كانت هناك عناصر متعددة تطابق المفتاح، فإن العنصر الذي تُعاد عقدته غير محدد. .P تُرجع \fBtdelete\fP() مؤشرًا إلى أصل العقدة المحذوفة، أو NULL إذا لم يُعثر على العنصر. إذا كانت العقدة المحذوفة هي عقدة الجذر، فتُرجع \fBtdelete\fP() مؤشرًا معلقًا يجب عدم الوصول إليه. .P تُرجع \fBtsearch\fP() و \fBtfind\fP() و \fBtdelete\fP() أيضًا NULL إذا كان \fIrootp\fP هو NULL عند الدخول. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBtsearch\fP(), \fBtfind\fP(), \fBtdelete\fP() T} سلامة الخيوط MT\-Safe race:rootp T{ .na .nh \fBtwalk\fP() T} سلامة الخيوط MT\-Safe race:root T{ .na .nh \fBtwalk_r\fP() T} سلامة الخيوط MT\-Safe race:root T{ .na .nh \fBtdestroy\fP() T} سلامة الخيوط MT\-Safe .TE .SH المعايير .TP \fBtsearch\fP() .TQ \fBtfind\fP() .TQ \fBtdelete\fP() .TQ \fBtwalk\fP() POSIX.1\-2008. .TP \fBtdestroy\fP() .TQ \fBtwalk_r\fP() GNU. .SH التاريخ .TP \fBtsearch\fP() .TQ \fBtfind\fP() .TQ \fBtdelete\fP() .TQ \fBtwalk\fP() POSIX.1\-2001, POSIX.1\-2008, SVr4. .TP \fBtwalk_r\fP() glibc 2.30. .SH ملاحظات تأخذ \fBtwalk\fP() مؤشرًا إلى الجذر، بينما تأخذ الدوال الأخرى مؤشرًا إلى متغير يشير إلى الجذر. .P تحرر \fBtdelete\fP() الذاكرة المطلوبة للعقدة في الشجرة. المستخدم مسؤول عن تحرير الذاكرة للبيانات المقابلة. .P يعتمد البرنامج المثال على حقيقة أن \fBtwalk\fP() لا تشير إلى عقدة بعد استدعاء دالة المستخدم بالوسيطة "endorder" أو "leaf". يعمل هذا مع تنفيذ مكتبة GNU، لكنه ليس في توثيق System V. .SH أمثلة يدرج البرنامج التالي اثني عشر رقمًا عشوائيًا في شجرة ثنائية، حيث تُدمج الأرقام المكررة، ثم يطبع الأرقام بالترتيب. .P .\" SRC BEGIN (tsearch.c) .EX #define _GNU_SOURCE /* Expose declaration of tdestroy() */ #include #include #include #include #include \& static void *root = NULL; \& static void * xmalloc(size_t n) { void *p; \& p = malloc(n); if (p) return p; fprintf(stderr, "insufficient memory\[rs]n"); exit(EXIT_FAILURE); } \& static int compare(const void *pa, const void *pb) { if (*(int *) pa < *(int *) pb) return \-1; if (*(int *) pa > *(int *) pb) return 1; return 0; } \& static void action(const void *nodep, VISIT which, int depth) { int *datap; \& switch (which) { case preorder: break; case postorder: datap = *(int **) nodep; printf("%6d\[rs]n", *datap); break; case endorder: break; case leaf: datap = *(int **) nodep; printf("%6d\[rs]n", *datap); break; } } \& int main(void) { int *ptr; int **val; \& srand(time(NULL)); for (unsigned int i = 0; i < 12; i++) { ptr = xmalloc(sizeof(*ptr)); *ptr = rand() & 0xff; val = tsearch(ptr, &root, compare); if (val == NULL) exit(EXIT_FAILURE); if (*val != ptr) free(ptr); } twalk(root, action); tdestroy(root, free); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBbsearch\fP(3), \fBhsearch\fP(3), \fBlsearch\fP(3), \fBqsort\fP(3) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .