الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

linked list عقده حياتي.. + مرفقات العمليات الاربع

مغلق
بدأه سعودي عسل في 8 مايو 2007 · 14 رد · 3,660 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تحياتي لجميع رواد منتدى فريق البرمجة العربي

اولا آسف لاني طالب علوم حاسب الي ولا اعرف كيفيه التعامل مع linked list او ماهيتها اصلا .. وذلك يعود لسوء التدريس الله المستعان

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

فمن منكم يزكي علمه .. وادعوا له بالخير دوما

وهذه اربع برامج في المرفقات تبين استخدامات الانواع الاربع لـ اللينكد لست وهي

SNGLNK

Circular Link List

create and display

واخيرا اصعبها DBLYLNK

فمن يتكفل بشرحها لي على الماسنجر او حتى في المنتدى وله دعواتي الخالصه بكل صلاه وفي الحرم المكي ؟

علما بانني محتاج افهمها عاجلا ..

وكان بودي ان اضع محاولاتي .. ولكن لتخلفنا في التدريس فلست افقه شيئا فيها ولانه موضوع كبير .. لا يمكن المحاوله فيه بدون فهم ماهيته

مع كل الشكر والتقدير

linked_list.zip

#2

اين المبدعين ؟

لم اعهد فريق البرمجة العربي هكذا ؟

#3

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

أخي أنا عندي استعداد اشرحلك الوائح المترابطة لكن مو كلها لأنو أنا ما أخدت غير نوع واحد منها وعلى كل حال هاد الإيميل تبع الماسنجر تبعي

samer226044@hotmail.com وأنا جاهز لأي خدمة إن شاء الله :)

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

الليل ولى وجاء دورك يا صباح سفينة الإيمان سارت لا تبالي بالرياح

ولا تنسوني من دعائكم

#4

شكرا يالغالي واضفتك عندي وكثر الله من امثالك وزادك علما وانتفاعا ونصرك وثبتك في كل امورك

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

تحياتي

#5

هل تريد ان تتعلمها ؟ ولا تريد حلها ؟

اذا كنت تبي تتعلمها ، إليك الطريقه :

ورقه بيضا ، قلم رصاص ، مساحه ،

www.google.com أو أي كتاب DataStructure for cpp

اقرأ ماهو وارسمه بعد ماتفهمها زين ، اعمل implement للرسمه ، هكذا فهمت جميع الانواع ( حتى خارج الدراسه الجامعيه )

بالمناسبه إسمك جميل :)

#6

أخي الكريم

شكرا على الاطراء أولا ..

ثانيا .. انا فهمت الكثير منهـا لكن ينقصني ان افهمها فهمهـا واضحـا

يعني اريد ان ابرمجها باي اسلوب اريد

لاني شفت كذا اسلوب وكل اسلوب يختلف عن الثاني

اللى يعرف نود واحد داخل الفانكشن

واللى اشوفه يعرف ثلاث نودات داخل الفانكشن ..

ولا اعرف ماهو سبب ؟

لذلك انا احتاج لان اتقنهـا .. وايضا هي اثارت فضولي

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

تجد كلاما كثيرا .. وراح تقولي وانا متاكد انها فعلا تدوخ ويبغالها شوي بالنسبه لي

اما بالنسبه انت خبير جافا ما شاء الله عليك عاد ما يحتاج ..

تحياتي لك والله يعطيك العافيه على المداخله

تم تعديل هذه المشاركة بواسطة سعودي عسل في 10 مايو 2007 في 22:55

#7

لاتاخذ مقلب فيني ، انا لست خبير سوى (بالتدخين )

انا معك بان الامور تلخبط ، وانك تحس انك تايه ومانت فاهم شي ،

انا كنت نفسك بل انني كنت اقول مستحيل افهمها ، إلا ان ربط الله على قلبي وحاولت ، وقتها فهمت single Linked List

تمرنت عليها كثير ( مثل عمل فنكشن تحسب كم عدد النود ، عمل فنكشن للبحث ، عمل فنكشن لعكس اللينكد لست )

بعدها ذهبت للدبل ورأيت ماهو الاختلاف ،

عدم الفهم الصحيح هو اللي يجعل الاجوبه تختلف ،فهناك من لايعرف متى ينتهي هذا النود ، فلذلك كل ماحتاج نود ، عرف نود جديده ،

وفي بعض الاحيان تضطر لتعريف متغير جديد لعملprevious node مثلاً .

أنا لاأقول هذا الكلام سوى لتتأكد بانك ان حاولت ستجني الثمره ، وش انت خسران ؟ قلم رصاص وورقه ومساحه ، وارسم !

الله يوفقك

#8

ممكن برنامج مفتوح المصدر ل Linked list باستخدام مكتبة ال MFC ؟

#9

أخي الكريم والله لو تشوف الاوراق عندي بالغرفه وش كثرها .. وموزعها بكل مكان في الغرفه على حده ومرة اروح للزاويه اللى انا حاط فيها الاوراق التي تخص السنقال ليست ومرة اروح هناك

فليست مشكله عندي محاوله التعلم

لكن المشكله هناك بعض الاشياء التي عجزت عن فهمها .. فقط لا اكثر

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

تحياتي لك وشكرا على اهتمامك

#10

اخوي وش الي معصلق لك اللحين وش الي ناشب لك فيها تراها بسيطة شي تافه !

لا تقول عقدة حياتك ولا شي ! كل ميثود اكتبها لك بعدد اسطر ما يتجاوز العشر اسطر يعني ما فيها زود اللهم انها فكره انك تجمع معلومات كل نود بستركتشر وتربطهن ببعض ببوينترات والسلام

عطني فنكشن معقدتك وانا اقولك وش قصتها ووشلون تسوي لها امبلمنت وكلش ولا تشيل هم :huh:

#11

تحياتي اخوي الكريم

الىل معصلق معاي تحصله في المرفقات اللى انا حاطها فوق

تحصل واحد باسم SNGLNK

والثاني باسم DBLYLNK

هذول هم اللى يهموني

قولي كيف فكرتها

ليش سوى ثلاث مؤشرات من نوع نود في كل فانكشن

تحياتي لك وشاكر لك اهتمامك

#12

بالمرفقات مقالتين عن Linked List باللغة الانجليزية أعتقد راح تكون مفيد إذا قرأتها جيداً

LinkedList.rar

#13

الفريق بين SNGLNK و DBLYLNK هو تعريف مؤشر جديد عند استخدام DBLYLNK باسم Back يحمل اسم الـ struct

الغرض من المؤشر Next هو ربط القوائم مع بعضها البعض بالإضافة إلا أنه يمكنك استخدام الأمر Next لطباعة محتويات القائمة من البداية وحتى النهاية وهذه تسمى SNGLNK أما إذا تم تعريف مؤشر آخر باسم Back فإنها بذلك تصيح DBLULNK وتتيح لك إمكانيه طباعة محتويات القائمة بشكل بالعكس من النهاية حتى البداية

والسبب يجب أن تحمل هذه المؤشرات Back & Next نوع البيانات نفسه وهو اسم الـ struct اللي نشئته لأنها سوف تشير إلى قائمة آخرى تحمل نفس نوع البيانات التي يشير لها المؤشر

هذا كلام على السريع ولو شفت الملفات في مشاركتي السابقة راح تفهم أكثر وأكثر :)

#14

الله يعطيك العافيه جدا رائع اخي الكريم ..

ولو ان لغتي الانجليزيه ضعيفه لكن سأحاول

وانا فاهم كيفيه ربطها وهكذا

لكن اريد ان اتخيل شكلها في الذاكره وتحركاتها اريد ان اتخيل كل عمليه عليها كيف تتم

يعني نظري ... حتى استطيع فهمها بشكل كامل

ولقد لاحظت ايضا

 node  *search(node *mynode)  {
.
.
.
}

لماذا عرفنا داله سيرش على اساس انها مؤشر كيف ذلك .. ؟ ماذا سوف تعمل الداله اذا كانت مؤشره ؟؟ غريب علي هذا الاسلوب

ادري ازعجتكم .. لكن تحملوني فماذا وضع هذا المنتدى الا لتبادل العلم والمعرفه

تم تعديل هذه المشاركة بواسطة سعودي عسل في 12 مايو 2007 في 12:32

#15

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

كيف الحال اخوي سعودي عسل

ابشر وانا اخوك يا سعودي انا اشرحلك كيف الـ Linked List

بس خليني اقلك حاجه

في الـ Linked List فيه نوعين FIFO و LIFO

أو ممكن تقول Stack و Queue

خليني اوضح اكثر

الـ FIFO هي اختصار لكلمة First In First Out يعني القيمه الي تدخل اول شيء هي الي تتعالج اول شيء سواء في عملية المسح او التعديل او اي شيء ثاني

اما الـ LIFO هي اختصار لي Last In First Out يعني اخر قيمة تدخل هي اول شيء يتعالج

لين هنا اوكي ؟

يالله خلينا نكمل

ثانيا يا اخي العزيز المثال الي انا راح اعطيك اياه راح استخدم فيه الـ pointers وراح امشي على مبداء الـ LIFO

يالله خلينا نكمل

الـ Single Linked List

هي عباره عن بيانات ترتبط ببعض عن طريق مؤشرات بحيث انه راح يكون عندنا 2 class

واحد راح نسميه الـ Node اي العقده الي راح تمثل القيمه ومؤشر على الـ Node الي راح تجي بعدها

والـ class لثاني راح نسميه SLList والي راح يقوم بالعمليات الي عادة تجرى على الـ Linked List وهي

الإضافه push والمسح pop والطباعه printData

فراح يكون عندنا الكلاس كالآتي:

class Node {
public:
	int val;
	Node *next;

	Node() {
		next = NULL;
	}

	Node(int v) {
		val = v;
		next = NULL;
	}
};

الحين راح نشوف كيف راح يكون الكود تبع كلاس SLList

وراح يكون فيه pointer خاص من نوع Node راح نسميه head وهو راح يكون بداية الـ Linked List تبعنا

خلينا نشوف الكود

class SLList {
	Node *head;
public:

	SLList() {
		head = new Node();
	}

	void push(int v) {
		if (head->next == NULL) {
			Node *temp = new Node(v);
			head->next = temp;
			temp = NULL;
			cout << "New node has been pushed.\n";
			return;
		}

		Node *temp = new Node(v);
		temp->next = head->next;
		head->next = temp;
		temp = NULL;
		cout << "New node has been pushed.\n";
	}

	void pop () {
		if (head->next == NULL) {
			cout << "Stack is empty.\n";
			return;
		}

		head->next = head->next->next;
		cout << "One node has been poped.\n";
	}

	void printData() {
		if (head->next == NULL) {
			cout << "Stack is empty.\n";
			return;
		}

		Node *temp = head->next;
		while(temp != NULL) {
			cout << temp->val << endl;
			temp = temp->next;
		}

		cout << "End of stack.\n";
	}
};

شرح الدالة push:

الداله بسيطه جدا وما فيها اي تعقيد عملها راح يقوم اول شيء بالتشييك على المؤشر الخاص head عشان نعرف هل الـ stack فاضي ولا لا عشان لو كان فاضي راح نضيف الـ Node الجديده في راس الـ stack اما لو كان في Node موجوده من قبل لازم نقوم ببعض التعديلات عشان نحافظ على مبداء الـ LIFO عشان كذا قمنا بعملية التبديل ما بين الـ Node الجديده الي اسمها temp والمؤشر الخاص الي اسمه head زي ما هو موضح في الكود الي تحت

Node *temp = new Node(v);
temp->next = head->next;
head->next = temp;

شرح الداله pop:

هذه الداله تقريبا هي الأصعب بين اخواتها بس والله مبدئها سهل جدا عباره عن تشييك اذا كان الـ stack فاضي ولا لا

اذا ما كان فاضي على طول راح نخلي الـ head يأشر على الي بعده زي ماهو موضح في الكود التالي

head->next = head->next->next;

شرح دالة printData:

بالعقل اول شيء راح نشوف هل الـ stack فاضي ولا لا

اذا ما كان فاضي راح نعرف مؤشر مؤقت اسمه temp ونخليه يأشر على أول Node يعني الـ Node لي يأشر عليها الـ head )

وبعدا كذا راح نستخدم دوارة while لي راح تشيك على المؤشر الحالي ( temp ) اذا كانت قيمته NULL يعني ولا حاجه

اذا ما كان Null راح نطبع القيمه val تبعه ونخليه يأشر على الي بعدها

وهلم جرا

الحين يا اخي العزيز باقي عليك انت بنفسك تتوصل الي حل الـ Circular Linked List الي راح تكون نفس مبداء الـ Single Linked List

بس في اختلاف بسيط خليني اعطيك تلميحة عنه وهو

بدل ما يكون مؤشر آخر Node في الـ Stack الي هو next يأشر على NULL ، خليه يأشر على المؤشر الخاص الي اسمه head

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

ولو في سؤال او استفسار إن شاء الله اكون لك عون بعد الله سبحانه وتعالى

اخوك في الله Robatic

وهذا هو الكود بالكامل:

#include <iostream.h>
#include <conio.h>

class Node {
public:
	int val;
	Node *next;

	Node() {
		next = NULL;
	}

	Node(int v) {
		val = v;
		next = NULL;
	}
};

class SLList {
	Node *head;
public:

	SLList() {
		head = new Node();
	}

	void push(int v) {
		if (head->next == NULL) {
			Node *temp = new Node(v);
			head->next = temp;
			temp = NULL;
			cout << "New node has been pushed.\n";
			return;
		}

		Node *temp = new Node(v);
		temp->next = head->next;
		head->next = temp;
		temp = NULL;
		cout << "New node has been pushed.\n";
	}

	void pop () {
		if (head->next == NULL) {
			cout << "Stack is empty.\n";
			return;
		}

		head->next = head->next->next;
		cout << "One node has been poped.\n";
	}

	void printData() {
		if (head->next == NULL) {
			cout << "Stack is empty.\n";
			return;
		}

		Node *temp = head->next;
		while(temp != NULL) {
			cout << temp->val << endl;
			temp = temp->next;
		}

		cout << "End of stack.\n";
	}
};

void main () {
	SLList list;


	list.push(1);
	list.push(2);
	list.push(3);
	list.push(4);
	list.printData();
	list.pop();
	list.pop();
	list.printData();
}

هذا الموضوع مغلق.

مواضيع مشابهة