تالار گفتمان مانشت
برنامه معکوس کردن لیست پیوندی یک طرفه - نسخه‌ی قابل چاپ

برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 17 مرداد ۱۳۹۲ ۱۲:۳۸ ب.ظ

سلام
برنامه معکوس کردن لیست پیوندی یک طرفه در کتاب مقسمی به شرح زیر است:


;p= first
;q=nil
while p<>nil Do
begin
;r=q
;q=p
;p=p^.link
;q^.link=r
;end
;first=q

در صورتی که به نظرم این غلطه چون آخرین نود هم اشاره خواهد کرد به اولی
و این درست است:
;p=r= first
;p=p^.link
while p<>nil Do
begin
;q=p
;p=p^.link
;q^.link=r
;end
;first=q

نظر شما چیه؟
من اشتباه میکنم؟
چرا؟


RE: برنامه معکوس کردن لیست پیوندی یک طرفه - svk7 - 17 مرداد ۱۳۹۲ ۰۳:۳۲ ب.ظ

با الگوریتم اولی یه مثال حل کردمو در پایان معکوس شدو مشکلی نداشت(پیوست)

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 17 مرداد ۱۳۹۲ ۱۱:۲۰ ب.ظ

اما
این r مرحله اول که برابر q شده چرا خانه قبل از q قرار گرفته؟
من اینطوری در نظر گرفتم که دقیقا rهم اشاره میکنه به جایی که qاشاره میکنه و به همین دلیل اشتباه در میاد
و اینکه چرا اینطوری در نظرش نگیریم؟

مگه R دقیقا برابر q نیست؟ خب باید آن هم در خانه آخر قرار گیرد

در واقع من اینطوری در نظر گرفتم

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - Masoud05 - 18 مرداد ۱۳۹۲ ۱۲:۰۹ ق.ظ

اشتباه ت اینه که داری لیست رو بصورت دوار (چرخشی ) در نظر میگیری، در لیست اولیه گره آخر به جایی اشاره نمی کنه پس بعد از معکوس کردن هم گره اول به جایی اشاره نباید بکنه .

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 18 مرداد ۱۳۹۲ ۰۸:۱۵ ق.ظ

(۱۸ مرداد ۱۳۹۲ ۱۲:۰۹ ق.ظ)Masoud05 نوشته شده توسط:  اشتباه ت اینه که داری لیست رو بصورت دوار (چرخشی ) در نظر میگیری، در لیست اولیه گره آخر به جایی اشاره نمی کنه پس بعد از معکوس کردن هم گره اول به جایی اشاره نباید بکنه .

نه اصلا ربطی به دوار در نظر گرفتن یا نگرفتن نداره
بعدم من دوار در نظر نگرفتم لیست اولیه رو


مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.

برنامه میکنه لیست رو دوار به همین علتم میگم اشتباست و برنامه خودم درسته

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - svk7 - 18 مرداد ۱۳۹۲ ۰۴:۵۶ ب.ظ

p= first
;q=nil
while p<>nil Do
begin
;r=q
مهم نیس r به کجا اشاره میکنه چون همون مرحله ی اول r=qمیشه یعنی r به جایی اشاره میکنه که qاشاره میکنه

من برا این rرو به نود وسطی اشاره دادم تا در نتیجه پایانی مکان نود وسط مشخص بشه

برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 19 مرداد ۱۳۹۲ ۱۲:۵۰ ق.ظ

(۱۸ مرداد ۱۳۹۲ ۰۴:۵۶ ب.ظ)svk7 نوشته شده توسط:  p= first
;q=nil
while p<>nil Do
begin
;r=q
مهم نیس r به کجا اشاره میکنه چون همون مرحله ی اول r=qمیشه یعنی r به جایی اشاره میکنه که qاشاره میکنه

من برا این rرو به نود وسطی اشاره دادم تا در نتیجه پایانی مکان نود وسط مشخص بشه

چرا مهم نیست؟
مهمه
چون بعد میخوایم بگیم qای که اشاره کرده به pحالا اشاره کنه به r

برنامه معکوس کردن لیست پیوندی یک طرفه - Nima Masghadi - 19 مرداد ۱۳۹۲ ۱۰:۰۸ ق.ظ

این سه تا اشاره گر p و q و r رو مثل تام و جری و اون سگه در نظر بگیر که همش دنبال همدیگه بودن!
ما برای معکوس کردن هر گره باید آدرس گره قبلش رو داشته باشیم و همچنین چون بعد از معکوس کردن هر گره آدرس گره بعدش رو هم نیاز داریم تا بتونیم اون رو هم معکوس کنیم (اگر آدرسش رو ذخیره نکنیم بعد از معکوس کردن گره فعلی آدرس گره بعدی رو نداریم و بقیه لیست از دست میره) باید همیشه آدرس یک گره جلوتر و یک گره عقب تر رو داشته باشیم!
حالا r همیشه آدرس گره قبل و p همیشه آدرس گره بعد رو نگه می داره و q هم ادرس گره ای که میخوایم معکوسش کنیم. واسه همینه که میگیم :
q->link=r ( اشاره کردن گره فعلی به گره قبلیش)
r=q
q=p
p=p->link
ببین این سه خط اخر اشاره گرها دارن دنبال همدیگه میزارن!(همون تام و جری و سگه!) و با هم جلو میرن.
در مرحله آخر هم p به null اشاره می کنه و q به گره آخر و r به گره ما قبل آخر و وقتی ما گره آخر رو به گره ماقبل آخر اشاره می دیم باید ابتدای لیست بشه q
به این ترتیب لیست معکوس میشه و مشکلی هم پیش نمیاد

برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 19 مرداد ۱۳۹۲ ۱۰:۵۹ ب.ظ

من که متاسفانه قانع نشدم باز
توضیحاتتون خوب بود وباعث میشه تو ذهنم بیشتر بمونه امامشکل منو حل نمیکنه
من نمیدونم مشکل از کجاست اگه اشتباه میکنم اگه هم نه بگید که اشتباه نمیکنم

توضیحاتتون جالب بود
دقیقا من هم همین مطلب رو میخوام بگم توی کتاب از اول لیست شروع کرده و چون لیست یک طرفه هست باعث ایجاد دور میشه چون به خانه قبل خودش میخواد اشاره کنه و خراب کاری میشه

من اومدم از دومین عنصر لیست شروع کردم و گفتم به قبلیش که عنصر اولی هست اشاره کنه و همین طور با تفسیر شما به سمت جلو حرکت کنند

چه اشتباهی میکنم؟
چرا؟

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - equilibrium - 20 مرداد ۱۳۹۲ ۰۲:۲۳ ق.ظ

(۱۸ مرداد ۱۳۹۲ ۰۸:۱۵ ق.ظ)learned نوشته شده توسط:  من دوار در نظر نگرفتم لیست اولیه رو

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.

برنامه میکنه لیست رو دوار به همین علتم میگم اشتباست و برنامه خودم درسته

فکر میکنم ذهنیت شما از اشاره گرها و مقدار دادن به اونها یه مقدار ایراد داشته باشه؛ دستوری مثل r=null معنیش اینه که r به جایی اشاره نمیکنه، در حالیکه شما در گام اول (در تصویری که ضمیمه کردید) به ازای دستور q=null، اشاره گر q رو به مقدار null ای که در گره آخر لیست هست اشاره دادید!
این اشتباه باعث شده که دو خط جلوتر به ازای r=q، اشاره گره r هم در ابتدا به گره آخر اشاره کنه؛ در تکرار اول حلقه، با دستور q=p اشاره گر q همونطور که نشون دادید به گره اول اشاره میکنه اما دستور q->next=r به جای اینکه اشاره گر اولین گره رو null و ارتباطش با بقیه لیست رو قطع کنه، به خاطر اون اشتباه، اشاره گر اولین گره رو برابر گره آخر میکنه و لیست دوار میشه؛ با توجه به توضیحاتی که دوستان دادن، یه بار دیگه تریس کنید منتها در ابتدا به جای اینکه r و q رو به مقدار null اشاره بدید، دقیقا بهشون مقدار null بدید؛

برنامه معکوس کردن لیست پیوندی یک طرفه - aamitis - 20 مرداد ۱۳۹۲ ۰۶:۵۶ ق.ظ

آهان این شد یه دلیل منطقی و خوب

آخه بقیه خیلی متفاوت جواب دادن
و منو متوجه اشتباهم نمیکردن
و راه حل خودشونو ارائه دادن
البته بحث کردن خیلی عالیه دیگه تا عمر دارم این مسئله رو فراموش نمیکنم
واقعا عالی بود
لذتی بردم
چه سایت ماهیه و چه کاربرایی
داشتم نا امید میشدم کم کم

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - zahraaahmadi29 - 06 دى ۱۳۹۳ ۱۱:۱۵ ب.ظ

دوستان سلام ، در مورد این الگوریتم میشه منطق p:=p^link رو بیشتر توضیح بدین ، من دلیلشو نمیفهمم

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - targol - 07 دى ۱۳۹۳ ۱۱:۴۲ ق.ظ

(۰۶ دى ۱۳۹۳ ۱۱:۱۵ ب.ظ)zahraaahmadi29 نوشته شده توسط:  دوستان سلام ، در مورد این الگوریتم میشه منطق p:=p^link رو بیشتر توضیح بدین ، من دلیلشو نمیفهمم
یعنی الان p به همون جایی اشاره کنه که لینک p اشاره میکنه. یعنی p حرکت کنه به سمت جلو و به گره بعدی اشاره کنه.

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - zahraaahmadi29 - 07 دى ۱۳۹۳ ۰۴:۵۹ ب.ظ

ممنون دوست عزیز، لطف کردی ، در واقع اشاره گر ها یکی یکی میان جلو

RE: برنامه معکوس کردن لیست پیوندی یک طرفه - kamran_hyper@yahoo.com - 12 خرداد ۱۳۹۴ ۰۹:۴۸ ق.ظ

Node *new,*p;

new->Add=Null;
p=head;
while(p->Add != Null)
{
p=Head->Add;
Node *temp;
temp->Add=new;
temp->Data=p->Data;
new=temp;
}
Head=new;[/align]