440 likes | 887 Views
خوارزميات الاضافة في القوائم المتصلة. تركيب البيانات وتصميم الخوارزميات 1289. إعداد أ. سليم الجيوسي/سلفيت. تستخدم القوائم المتصلة في عملية تمثيل القوائم وتكون على هيئة سلسلة من العناصر مرتبطة مع بعضها البعض. اهم العناصر التي لا بد من معرفتها لأنها تشكل المكون الاساسي للقوائم المتصلة.
E N D
خوارزميات الاضافة في القوائم المتصلة تركيب البيانات وتصميم الخوارزميات 1289 إعداد أ. سليم الجيوسي/سلفيت
تستخدم القوائم المتصلة في عملية تمثيل القوائموتكون على هيئة سلسلة من العناصر مرتبطة مع بعضها البعض
اهم العناصر التي لا بد من معرفتها لأنها تشكل المكون الاساسي للقوائم المتصلة
5 . المعلومة بداخل عنصر القائمه ويشار اليها: info الرابطة التي تصل العناصر بعضها ببعض ويشار اليها باسم link والمثال التالي يوضح ذلك A
يتضح من الشكل السابق ان اسم العنصر هو A • وان المعلومة بداخله هي 5 ويتم الاشارة الى ذلك كما يلي: • A->info =5 • اما الرابط فيشار اليه: • A->link العنصر الذي يليه =
7. 11 7. • من خلال الشكل الثاني يمكن التعرف على عناصر القائمة المتصلة كما يلي: • XY Z NULL شكل(2)
X->info=7 X->link=y NULL اكمل ما يلي: Y->info=…….. Y->link=…….. Z->info=…….. Z->link=………
عملية زيادة المؤشر في القوائم المتصلة: • تستخدم عملية الزيادة في لغات البرمجة لعدة اهداف وابسط مثال على عمليات الزيادة • هي مثلا i++
اما في القوائم المتصلة فتهدف الزيادة الى تحريك المؤشر على احد العناصر ليشير الى العنصر الذي يليه ويتم ذلك باستخدام الصيغة التاليه إسم المؤشر=اسم المؤشر->link
مثال على عملية تحريك المؤشر في القوائم المتصلة: قم بتحريك المؤشر current الذي يشير الى العنصر الاول وارسم الشكل في كل مرة current 100 200 300 null
الحل: currentتشير في البداية للعنصر 100 ولذلك فان: Current->info=100 وعملية الزيادة الاولى Current=current->link ليشير current للمعلومة 200 بعد تنفيذ هذا الامر يتحرك مؤشر
current 100 200 300 null لذلك فانه Current->info=200 عملية الزيادة الثانيه Current=current->link
وبعد تنفيذ هذا الامر يتحرك المؤشر current ليشير للمعلومة 300 current 300 200 100 null لذلك فان: Current->info=300
كيف يمكن نقل المؤشر خطوتين للأمام مره واحده؟ لا بد من الاشارة هنا الى ان بداية القائمة المتصلة لها مؤشرها الدائم والخاص هو : list كما في الشكل التالي list 500 600
ومن هنا فإن: List تشير الى المعلومة 500 List->info=500 وبالرجوع الى الموضوع السابق فان عملية تقدم بداية القائمة تكون كما يلي: List=list->link لتشير لذلك الى العنصر التالي فيصبح هو عنصر بداية القائمة
أما نهاية القائمة: فمن الواجب أن يشير العنصر في النهاية الى null كما يلي: null
تدريب: ما رأيك في العبارة التالية هل هي صحيحة ام خطأ؟ بناءا على الشكل السابق: List->link->link->link=??NULL
اضافة العناصر الى القوائم المتصلة: • هنالك ثلاث حالات مختلفة لإضافة العناصر للقائمة المتصلة وهي: • اضافة عنصر بين عنصرين في القائمة • اضافة عنصر الى بداية القائمة • اضافة عنصر الى نهاية القائمة
اضافة عنصر الى بداية القائمة تتم عملية اضافة عنصر الى بداية القائمة في احدى الحالتين التاليتين وهما ان تكون القائمة فارغة اصلا وبالتالي فان list=null
ان يكون العنصر المضاف يحتوي على معلومة اقل (في الترتيب التصاعدي) من المعلومة الموجودة في العنصر الموجود اول القائمة وبالتالي Element<list->info
وبالتالي فان مما كان في العملية السابقة بحالتيها المختلفتين تكون كما يلي If(list==NULL||element<list->info)
في حال انطبق هذا الشرط فانه سيتم اضافة العنصر الى البداية وهذا يقتضي امرين هامين هما ان يشير العنصر الجديد الى عنصر البداية في القائمة ان يشير بداية القائمة الى العنصر المضاف الجديد
ملاحظة لا بد هنا من الاشارة الى ان هاتين العمليتين يجب ان تكونا بنفس الترتيب السابق
مثال: الشكل التالي يمثل قائمة متصلة مرتبة تصاعديا: list 0 null 0 200 100 90 A على فرض اننا نريد اضافة العنصر التالي للقائمة: . 80
في حال تنفيذ شرط الاضافة حسب ما يلي : If(list==NULL||A->info<list->info) ومن هنا ينطبق الشرط السابق ما يعني للدخول في عملية الاضافة لبداية القائمةحسب الخطوات السابقة
1) A->link=list list 90 100 200 null A 80
100 90 2) list=A list 200 null 80 القائمة بعد اضافة العنصر 80 الى البداية
إضافة عنصر بين عنصرين أو في نهاية القائمة ويتم في البداية التأكد من أن العنصر لا يستحق أن يكون في بداية القائمة وذلك من خلال الخوارزمية السابقة
وتبدأ عملية الإضافة بمعرفة المكان المناسب لإضافة العنصر وذلكبتعيين مؤشرين متحركين هما previous / next بحيث يبدآن بالحركة من بداية القائمة: Previous = list Next = list -> link
200 null 90 100 previous next
200 null 90 100 وتكون عملية تحريك المؤشرات بالخوارزمية التالية Previous = next Next = next -> link previous next
ويتوقف مؤشر البحث عن الحركة في إحدى الحالتين التاليتين : أن العنصر المراد إضافته ينحصر بين Previous / next element < next -> info
في حال وصول المؤشر nextإلى نهاية القائمة NEXT = NULL ويتم صياغة خوارزمية حالتي التوقف السابقتين كما يلي :
WHILE(NEXT = NULL && !FOUND) { IF (ELEMENT < LIST-> INFO) { LOC = PREVIOUS; FOUND = TRUE;} ELSE {PREVIOUS =NEXT; NEXT= NEXT->LINK; } }
وتكون خطوات عملية الإضافة كما يلي: ربط العنصر الجديد بالعنصر المشار إليه ب NEXT= PREVIOUS -> LINK newNode-> link = previous -> link
200 null 90 100 previous next 150 newNode
200 null 90 100 ربط العنصر السابق previous بالعنصر الجديد previous next 150 newNode
الإضافة الى نهاية القائمة المتصلة وتعتمد على نفس مبدأ الخوارزمية السابقة حيث يتوقف البحث عن مكان الإضافة عندما تكون previous -> link = null وتتم الإضافة بنفس الآلية السابقة