بناء الحلقات المتسلسلة أحادية الاتجاه

السلام عليكم
اليوم درسنا يحتاج إلى بعض التركيز
فعلى متابعي الأخبار التنحي جانباً
وقد أعذر من أنذر
تعالوا نركز قليلاً على العقد nodes
العقدة تحتوي على كائن من أي نوع
بالإضافة إلى مؤشر referance على العقدة التي تليها
هذا المؤشر يمثل الرابط link بين العقدتين
في مثال السيارات يمثل المسافة الفاصلة بين السيارة والتي تليها
جيد أصبح بإمكننا أن نبني الفئة class عقدة

ماذا يجب أن يتوفر في الفئة عقدة؟
1- الكائن الهدف في العقدة
2- رابط بين العقدة والعقدة التي تليها
3- صانع كائنات أو أكثر
3- أي إضافات أخرى مثل الدوال خذ وهات set & get methods

أنا قمت ببناء العقدة الخاصة بي على النحو التالي

package SinglyLinkedList;/** 

 * هذه الفئة تعمل كعقدة في سلسلة 

 * بالنسبة لحرف الـ 

 * SNode في S 

 * فهو يرمز إلى كونها أحادية الاتجاه 

 * @author Alaa AL-Salhi 

 * @version 1.0 

 */ 

public class SNode  { 

 private SNode next; 

 private Object element; 

public SNode(Object element, SNode next) { 

 	this.next=next; 

 	this.element=element; 

 } 

public void setNext(SNode next){ 

 	this.next=next; 

 } 

 public void setElement(Object o){ 

 	this.element=o; 

 } 

 public Object getElement(){ 

 	return element; 

 } 

 public SNode getNext(){ 

 	return next; 

 } 

}

بعد أن قمنا ببناء الفئة عقدة ننتقل إلى الفئة التي ستقوم بإدارة العمليات على السلسلة
هذه الفئة تحتاج إلى التالي
1- أول عنصر في السلسلة
2- صانع كائنات
3- دوال الإضافة والحذف
أنا قمت ببناء الفئة SinglyLinkedList الخاصة بي

package SinglyLinkedList; 

/** 

 * @author Alaa AL-Salhi 

 * @version 1.0 

 */public class SinglyLinkedList { 

 private SNode head; 

 public SinglyLinkedList(){ 

 	head=null; 

 } 

 public SinglyLinkedList(Object element){ 

 	head=new SNode(element,null); 

 } 

 public SNode getFirst(){ 

 	return head; 

 } 

 public void addFirst(Object element){ 

 	SNode newNode=new SNode(element,head); 

 	head=newNode; 

 } 

 public Object deleteFirst(){ 

 	Object temp=head.getElement(); 

 	head=head.getNext(); 

 	return temp; 

 } 

 public void addLast(Object element){ 

 	SNode newNode=new SNode(element,null); 

 	SNode temp=head; 

 	while(temp.getNext()!=null){ 

 		temp=temp.getNext(); 

 	} 

 	temp.setNext(newNode); 

 } 

 public static void main(String args[]){ 

 	SinglyLinkedList list=new SinglyLinkedList(); 

 	for(int i=0;i<10;i++) 

 		list.addFirst(new Integer(i)); 

 	for(int i=0;i<5;i++) 

 		list.deleteFirst(); 

 	SNode temp=list.getFirst(); 

 	for(int i=0;i<5;i++){ 

 		System.out.println((Integer)temp.getElement()); 

 		temp=temp.getNext(); 

 	} 

 } 

}

لاحظوا أن لكل تركيب من تراكيب البيانات مفتاح نستطيع من خلاله التعامل مع التركيب
في المصفوفة مثلاً المفتاح هو اسم المصفوفة مع ترتيب العنصر في المصفوفة
المفتاح في حالة الحلقات المتسلسلة أحادية الاتجاه هو أول عنصر في السلسلة
لهذا جميع الدول في الأغلب تبدأ منها
تعالوا نشرح ما قنا به للتو
نبدأ بالدالة أضف في بداية السلسلة (addFirst)
كل ما علينا فعله هو أن نستبدل أول عنصر في السلسلة بالعنصر الجديد
ونضع رابطة بين العنصرين
هذه الدالة تأخذ كائن
لماذا قلنا أنها تأخذ كائن لماذا لا تأخذ أي شيء آخر
لو خصصت أنا نوع الكائن مثلاُ لنقل عدد صحيح Integer لأصبح عندي سلسلة من الأعداد الصحيحة فقط
ماذا لو أردت أن أعمل سلسلة من الجمل String فإني سأضطر إلى بناء فئة جديدة
بصراحة نحن هنا نعتمد على تعدد الكائنات polymophisem لكي نعيد استخدام نفس الفئة عدة مرات

دالة أضف في النهاية (addLast)
نحن لا نملك إلا العنصر الأول
لهذا نبدأ منه
هنا نسأل أنفسنا
ما الميزة التي تميز العنصر الأخير في السلسلة؟
الجواب: أن العنصر الذي يليه يجب أن يكون null
لهذا سنبحث عنه باستخدام القفز Hoping بمعنى أني سأنتقل من عقدة إلى أخرى إلى أن أجد هذا العنصر
على العموم لدي مشكلة bug في هذه الدالة لن أقوم بتوضيحه هذه المرة
اعتبروه سؤال تفكير بسيط
لاتقلقوا سنقوم بتطوير هذه الفئة حتى نحصل على فئة شبه رائعة

أنا أنهيت درس هذا الأسبوع

تحياتي

22 Responses to “بناء الحلقات المتسلسلة أحادية الاتجاه”

  1. LuLu قال:

    السلام عليكم
    يعطيك العافية أخي علاء :)

    بصراحة مالقيت مكان تاني
    حابين نتابع معك في هالمدونة وبالأحرى في قسم التراكيب
    ونتمنى انو تكون زيارتنا خفيفة عليكم :)

    بارك الله فيك
    صلو على النبي

  2. admin قال:

    وعليكم السلام

    على الرحب والسعة بكم دائماً
    لي مدة أحاول أن أكتب لكم
    لكني أعاني من شح في الوقت
    هل هناك موضوع معين تقترحيه علي؟؟؟
    بالطبع خفيفة ماذا كنتي تظنين
    وإن لم تكن خفيفة فهي مرغوبة :)

    تحياتي

  3. LuLu قال:

    بارك الله فيك
    الكل مضغوط هالايام والحمد لله على كل حال…
    وان شا الله مش حنتقل عليك

    بصراحة حاليا في عنا اسايمنت
    بدنا نعمل كود باستخدام الstack نحول فيه ال infix expr. إلى postfix
    بصراحة مافكرنا فيه لسا لانو عنا كويزين يوم الاحد

    بس ان شا الله بنتمنى انك يعني تعطينا كفكرة كيف ممكن نبدا فيه

    صحيح…شو تعريب كلمة stack ؟ :)
    وبارك الله فيك
    اللهم صل على سيدنا محمد …

  4. funny lady قال:

    السلام عليكم
    ماشاء الله اخ علاء المدونه اكتر من رائعه انا كنت افوت عليها واقرأ دايماً
    المدونه اكتر من رائعه
    حبيت بس نكمل معك في شرح التراكيب وان شاء الله يارب نكون مطيعين وما بدنا فلكه هههه
    ربنا معك

  5. admin قال:

    مرحبا فيكي LuLu
    بحاول أكتبلكم شرح بسيط عن stack
    طيب أقولك حاجة فكري وقولي لوين وصلتي
    وبساعدك بإذن الله

    بالنسبة لتعريب stack
    ممكن تحزري :)

  6. admin قال:

    كيف حالك funny lady
    نورت المدونة لما قرتيها يا ختي
    ما تخافيش بضربيش البنات الشاطرة
    بس بخوفهم :P

  7. LuLu قال:

    السلام عليكم
    بالنسبة لل stack شفت معناها في القاموس لقيت مكتوب يكدّس وكمان شوية معاني
    بس سألت اختي اللي بتاني ثانوي علمي طلعو بياخدوهم
    ومعناها مكدسة او مرصوصة :l
    شو هادا لسا استاك ارحم :S

    يلا ان شا الله يوم الاحد بنفضى للتراكيب
    موفقين
    صلو على خير الأنام :)

  8. admin قال:

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

    ربنا يعينكم
    أنا كتبت مقالة عن المكدس
    لكن بدها مراجعة
    إن شاء الله بكرة بنشرها

    تحياتي

  9. Noor قال:

    مرحبا علاء
    شكرا على شرحك وانا فهمت عليك بس الي مافهمته هو “3- صانع كائنات أو أكثر””
    شنو كائنات تقصد بيها؟؟؟
    وعندي طلب ثاني واسفة على التعب هو ممكن ان تنزل امثلة لتراكيب بيانات اكثر
    اذا بالوقت الحالي ما تقدر خليها وقت ثاني لان انا مامستعجلة عليها

  10. admin قال:

    الكائنات هي المرادف للكلمة الإنجليزية object
    صانع الكائنات المرادف للكلمة الإنجليزية constructor

    بالنسبة للأمثلة
    هل لديك نقطة معينة؟
    تريدين فهمها
    أو الحصول على معلومات إضافية فيها؟

    تحياتي

  11. Noor قال:

    شكرا علا
    بالنسبة للامثلة اي امثلة تخص التراكيب

  12. admin قال:

    أتمنى أن تمهيليني بعض الوقت أخت نور
    وسأحاول أن أتناول مواضيع أخرى
    غير التي طرحتها هنا في المدونة

    تحياتي

  13. RaWaN قال:

    السلام عليكم …
    لو سمحت سؤال …
    على اي لغة تكتب الكود ….
    بصراحة انا آخذ حالياً المادة و نتعامل مع لغة ++C لا اعلم لكني شعرت باختلاف في بعض الاشياء …

    اضافة الى انني اتمنى منك في الدروس اللاحقة استخدام الكلمات الانجليزية اضافة الى التعريب …
    يعني مثلاً صانع الكائنات … طولت كتير حتى فهمت انه هي نفسها constuctor !!! مجرد ملاحظة ….

    الله يعطيك العافية ….

    شكراً لك

  14. admin قال:

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

    تحياتي

  15. شكرا قال:

    جزاك الله خير الجزاء ..

  16. admin قال:

    العفو

    تحياتي

  17. الشيفرة قال:

    بارك الله فيك مهندس علاء
    دخلت مدونتك بسبب مشاكل عندي في مادة الديتا استركشر خصوصًا اللينكد لست
    بس خسارة أحتاجها مشروحة باستخدام الـ c++
    عمومًا شكرًا كثير , راح أضيف مدونتك للمفضلة لأنو الحين بندرس لغة جافا كمان :)

  18. admin قال:

    ربما لن تفهم الشيفرة جيداً لكنك ستجد المحتوى مفيداً
    أتمنى لك التوفيق

  19. دلع العموش قال:

    مرحبا علاء انا بدرس هندسة برمجيات وطلب من الدكتور اسايمنت عن الRadix sort
    ولو تساعدني شوي في وعندب كم من الاسئلة

  20. admin قال:

    تفضلي اسألي

  21. دلع العموش قال:

    السؤال سألني بهاد السطر من الكود
    ;int rshift = 0
    } for (int mask = ~(-1 << bits); mask != 0; mask <<= bits, rshift += bits)
    شكرا

Leave a Reply