هياكل البيانات : القوائم أحادية الرابط الجزء الأول

Abatherمنذ 8 سنوات

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

 

إن شاء الله في هذه السلسلة من المواضيع سنتطرق لهيكلة البيانات بأنواعها المختلفة 

مع أن هذه الدروس لا ترتبط بأي لغة إلا أن اللغة المستخدمة للتطبيق العملي هي Java، يجب أن يكون القارئ ملم بأساسيات اللغة، كذلك سأستخدم في أغلب الأحيان المصطلحات الإنجليزية لصعوبة ترجمتها في بعض الحالات.

 

قبل الشروع في الموضوع ماذا نقصد بهيكلة البيانات؟

المعنى هنا كبير جداً فقصودنا يحتوي على تشريح كامل لكل خصائص أي نوع من أنواع حفظ البيانات 

فعلى سبيل المثال عندما نتحدث عن المصفوفات واللتي تعتبر من أبسط أنواع حفظ  البيانات فعندها سنتطرق

لطريقة إنشاء المصفوفة طريقة حفظ أو حذف عنصر من المصفوفة وكذلك كيف لنا أن نبحث عن عنصر في المصفوفة وهكذا.

من البديهي أن هناك أنواع مختلفة لحفظ البيانات ولكل منها خائصها وعيبوبها، في موضوعنا هذا سوف نتخطى المصفوفات والتي

كما أشرت مسبقاً بأنها تعتبر من أبسط أنواع حفظ البيانات، وسنشرع مباشرة إلى القوائم أحادية الرابط.

 

القوائم أحادية الرابط

 

لماذا نحن بحاجة إلى القوائم بما أنه لدينا المصوفوفات؟

للمصفوفات عيبين رئسيين فعندما نريد تغيير حجم المصفوفة فإننا بحاجة إلى إنشاء مصفوفة جديدة 

ومن ثم نقوم بنسخ جميع عناصر المصفوفة القديمة إلى المصفوفة الجديدة ذات الحجم الجديد، كذلك 

عناصر المصفوفات مخزنة في الذاكرة في مواقع متتالية لذلك عندما نريد إضافة عنصر جديد أو حذف عنصر ما

فهذا يضطرنا إلى تحريك بقية العناصر في حال كانت عناصر المصفوفة مرتبة بشكل ما.

آفضل حل لهاتين المشكلتين هي القوائم وأبسط شكل من أشكال القوائم هي "القوائم أحادية الرابط".

 

ماذا نعني بالقوائم أحادية الرابط؟!

لنفرض بأن لدينا صندوق هذا يحتوي على قسمين القسم الأول نخزن فيه ما نريد أما القسم الثاني فيحتوي على

فتحة لكي نستطيع أن نربط هذا الصندوق بالصندوق  الذي بعده، في القوائم نطلق على هذا الصندوق أسم "العقدة" 

كل عقدة تحتوي على مكان لحفظ البيانات ورابط يربطها بما بعدها من العقد.

1.png

 

عند تجميع عدد من العقد مع بعضها نطلق على هذا التجمع بإسم قائمة وبما أن كل عقدة ترتبط فقط بالعقدة اللتي تليها فنطلق عليها أحادية الرابط.

 

2.png

بعد ان انتهينا من التعريفات وفهم معنى، لنترك النظري قليلاً ونتجه إلى العملي كما نعلم فإن القائمة أحادية الرابط تتكون من عدد من العقد، والعقدة الواحدة تحتوي على مكونين رئيسين (البيانات المخزنة و الرابط الذي يربط العقدة بما بعدها).

إذاً علينا أولاً ان نقوم بإنشاء  Class للعقدة الواحد ونوضح داخله مواصفات هذه العقدة واللتي هي مكان لحفظ البيانات (للتسهيل ستكون البيانات من نوع int) ومكان لربط هذه العقدة بالعقدة اللتي تليها (يجب أن يكون نوع هذا الرابط عقدة)

 

لماذا يجب أن يكن الرابط من نفس نوع العقدة؟

بكل بساطة الرابط ما هو إلا سهم يشير إلى شيء ما لذلك يجب أن يعرف إلى ماذا يشير.

هذا هو الكود اللذي سننتهي به:



public class SLLNode {
	public int info;
	public SLLNode next;
	
	public SLLNode(int i){
		this(i, null);
	}
	
	public SLLNode(int i, SLLNode n){
		this.info = i;
		this.next = n;
	}
}

 

اسم الـ Class : SLLNode

وهو اختصار لـ Single Linked Lists Node

    == عقدة لقائمة أحادية الرابط

ويحتوي على متغيرين:

info:

وهو من نوع int ،  وهو المكان اللذي سنقوم بحفظ البيانات داخله.

 

next:

وهو من نوع SLLNode وهو الجزء اللذي سيربط هذه العقدة بالعقدة اللتي تليها

 

هذا الـ Class يحتوي على اثنتين من الـ Constructors :

الأولى:


	public SLLNode(int i){
		this(i, null);
	}

وهذه تمكننا من إنشاء عقدة بتخزين المعلومات فقط بدون الحاجة لربطها بالعقدة اللتي تليها، وداخلها كما نرى نداء للـ Constructor الأخرى بإعطائها البيانات المدخلة + Null لخانة الرابط اللذي يربط العقدة للعقدة اللتي تليها.

لماذا لا نقوم بإعطاء العقدة رابط للعقدة اللتي تليها؟!

هذا مهم ففي حالة آخر عقدة لن يكون هناك عقدة بعدها فلا يوجد ما ترتبط به لذلك نضع علامة بأنه لا يوجد شيء بعد هذه العقدة وهذه العلامة هي null .

 

الثانية:


	public SLLNode(int i, SLLNode n){
		this.info = i;
		this.next = n;
	}

وهذه تمكننا من إنشاء عقدة بإعطائها البيانات التي ستحفظها ورابط للعقدة اللتي تليها.

 

هذه هي نهاية الجزء الأول من درسنا إن شاء الله سأكمل موضوع القوائم أحادية الرابط في الموضوع التالي

مع العلم بأن باب النقاش مفتوح لأي نقطة لتوظيحها أكثر ولإزالة أي لبس حولها.

كلمات دليلية:
3
إعجاب
6196
مشاهدات
0
مشاركة
4
متابع
متميز
محتوى رهيب

التعليقات (4)

wejdan:

ياليت تكمل لنا الشرح

يعطيك العافيه ?

عدي بن حاتم:

ممكن تسوي لها implement بلغة الـ java 

ويعطيك العافية على الشرح الواضح

محسن:

 

داله نقوم بإسقبال متغير من النوع linkedlist تقوم الداله بإرجاع اسم الموظف  الذي يتقاضي اعلي مرتب

و إرجاع متوسط المرتبات من نفس الموع

Hoson:

شرح رائع ومميز ... انة واضح جد في فهمة بسهولة  شكرا لك 

 

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !