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

سؤال في Single & Circle Linked List

بدأه sar0o0na في 31 يوليو 2009 · 7 رد · 529 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

عندي سؤالين في هياكل البيانات (Data structure)

single linked list :

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

ولكن يكون هناك مشكلة بحيث إن بعد الحذف يجب إسناد قيمة نل للنود الذي يسبق النود المحذوف ولكن في هذه الحالة

لا يمكن الرجوع للخلف ومعرفة عنوان الخانة السابقة

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

انا فاهمة الفكرة لكن لا أعرف كيف أطبقها

--------------------------------------------------------------------------

circle linked list :

عند تطبيق نفس العملية السابقة ( حذف اخر نود موجود في الليست ) نعرف مؤشر يبدا من الهيد إلى أن يصل إلى اخر نود (هل سأحتاج إلى مؤشر اخر يتوقف

عندما يصل إلى النود قبل الأخير؟؟؟)

المشكلة هنا هي انني احتاج الى شرط يوقف اللوب عندما يصل الى نهاية الليست ولكن عندما نصل الى نهاية الليست فإن قيمة النيكست لآخر نود لا تساوي نل

الفكرة هي انني أضع شرط بحيث عندما يصل المؤشر إلى أول نود (يعني ياخذ دورة كاملة ويعود مرة أخرى إلى أول نود ) فإنه يتوقف

أريد كتابة هذا الكلام بشكل كود بالسي بلس بلس

أرجو المساعدة في هذا السؤال لأنه يكاد يصيبني بالجنون

حاولت لكني لم أستطع إيجاد حل مقنع

وشكرا مقدما...

programmerssu3.gif
#2

السلام عليكم

بالنسبه لسؤالك الأول

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

فإن شرط التوقف عن العقده قبل الأخيره يكون

 while(head->next->next !=NULL)
{
head=head->next;
}

لاحظى استخدام next مرتين

-----------------------------------------------------------------

بالنسبه للسؤال الثانى

هنا سنحتاج الى مؤشرين فى البدايه يشيران الى أول عقده مثلا head1,head2

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

while(head1->next->next!=head2)
{
head1=head1->next;
}

هنا ايضا وصلنا للعقده قبل الأخيره

طبعا لأن النكست للعقده الأخيره يشير الى العقده الأولى التى يشير اليها البوينتر head2 الذى جعلناه ثابتا

هل وصلت الفكره

تحياتى

تم تعديل هذه المشاركة بواسطة amin_mu123 في 31 يوليو 2009 في 21:03

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#3

شكرا أتوقع بأن الفكرة قد وصلت

إذا حصل هناك إشكال فسوف أعاود السؤال مرة أخرى

شكرا مرة أخرى...

programmerssu3.gif
#4

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

حاولت كتابة الكود لكني لا أعرف إن كانت كتابتي له بالشكل الصحيح أو لا

أتمنى رؤية الكود وإبداء الملاحظات عليه

الكود الأول كتبته قبل السؤال يعني محاولاتي الخاصة


{
Node *p, *q;
q=head;
while(q ->getNext() != NULL)
{
q=q ->getNext();
}

p=RetriveNode(q ->getData() );
delete q;
p ->setNext(NULL);
count--;
}
 void DeleteLastNode_Single()

----------------------------------------

وهذا بعد السؤال مع استخدام الطريقة الموضحة أعلاه


{
Node *p, *q;
q=head;
while(q ->getNext()->getNext() != NULL)
{
q=q ->getNext();
}

p=q->getNext();
delete p;
q ->setNext(NULL);
count--;
}
 void DeleteLastNode_Single()

-------------------------

وهذا بالنسبة للسؤال الثاني كتبت جزء من الكود لكن لم أعرف كيف أكمله

المشكلة هي انني عندما أصل للنود الأخير وأحذفه كيف أستطيع تحريك مؤشر النود اللي قبله عشان يؤشر على أول نود؟؟؟؟؟


{
Node *p, *q;
p=head;
q=head;
while(p ->getNext()->getNext() != q)
{
p=p ->getNext();
}

delete p;
.
.
.
.
}
void DeleteLastNode_Circle()

وشكرا مقدما....

programmerssu3.gif
#5

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

تطبيق السؤال الأول تمام

ولكن لا يمكننى أحكم عليه نهائيا بدون ما ارى الكلاس كاملا

حتى ارى الداله getNext

بالنسبه للسؤال الثانى

يمكن التعديل كالتالى

void DeleteLastNode_Circle()
{
	 Node *p, *q;
	 p=head;
	 q=head;
	 while(p ->getNext()->getNext() != head)
	 { 
		  p=p ->getNext();
	 }

	 q=p->getNext();
	p->setNext(head);
	 delete p;
}

الفكره أن اللوب يجعل البوينتر p يشير الى العقده قبل الأخيره

فقمنا بجعل المؤشر q يشير الى العقده الأخير التى نريد حذفها

ثم جعلنا النكست للعقده قبل الأخيره تشير الى أول عقده التى اساسا يشير اليها المؤشر head

ثم حذفنا العقده الأخيره بإستخدام المعامل delete

تحياتى

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#6

شكرا لك على المساعدة

لكن قولك بـ ( تطبيق السؤال الأول تمام )

عن أي كود تتحدث الأول أم الثاني ؟؟؟؟

programmerssu3.gif
#7

العفو أختى

كنت اقصد الكود الثانى

اى بعد التعديل

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#8

شكرا جزاك الله خيرا

programmerssu3.gif

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