قائمة مرتبطة>
— , , , , ( ) , , .
لا تحتوي كل اللغات الصناعية على دعم مدمج لقائمة مرتبطة كهياكل بيانات. ومع ذلك ، ليس من الصعب تنفيذها بنفسك كفئة أو بنية. للعمل المريح مع الخوارزميات ذات الصلة ، سنضيف قوائم مرتبطة ثنائية الاتجاه مضمنة بالفعل في التعريف الأساسي للغة Hi.
أولاً ، لنقم بإنشاء مثيل لقائمتنا التجريبية:
VAR list = <"I", "will", "be">
في المثال أعلاه ، يتم إنشاء روابط ثنائية الاتجاه تلقائيًا لثلاث عقد.
تحتوي القائمة المرتبطة غير الفارغة في Hi دائمًا على عقدة واحدة حالية أو "نشطة". بشكل افتراضي ، هذا هو آخر عنصر مضاف ، وهو الآن "يكون". دعنا نتحقق من هذا:
PRINT list.current # "be"
دعنا نضيف عنصرين آخرين إلى قائمتنا:
list.insert "back", "!" # list : "I", "will", "be", "back", "!"
تضيف طريقة الإدراج المضمنة عناصر جديدة مباشرة بعد العقدة النشطة ، وتقوم تلقائيًا ببناء روابط جديدة وتجعل آخر عنصر مضاف حاليًا (يمكنك إضافة أول عقدة قائمة جديدة وجعلها باستخدام طريقة insertFirst).
تتم الإزالة بطريقة مماثلة للعنصر الحالي :
list.remove 1 # list : "I", "will", "be", "back"
ومع ذلك ، يمكنك حذف عدة عناصر في وقت واحد ، لذلك يجب عليك أولاً ضبط المؤشر على العقدة الأولى المراد حذفها :
VAR secList = list
secList.prev 2
secList.remove 2 # secList : "I", "back"
في هذه الحالة ، تصبح العقدة السابقة قبل المحذوفة هي الحالية. إذا تم حذف العنصر الأول من القائمة ، يصبح العنصر الأول الجديد هو العنصر الحالي .
يمكنك استبدال العقدة الحالية بأخرى ببساطة عن طريق تعيين قيمة جديدة للعنصر:
secList.urrent = "smile" # secList : "smile ", "back"
يمكنك حذف جميع العقد ، أي يمكنك جعل القائمة فارغة كما يلي:
secList = <>
من الملائم الانتقال إلى العقد الأولى والأخيرة على النحو التالي:
list.first
LET last = list.last #
وبالتالي ، يمكنك بسهولة إجراء عمليات مختلفة باستخدام القائمة:
PRINT list # "I", "will", "be", "back"
list.first
list.next
list.insert "not"
LET be = list