PDA

View Full Version : سوال: عمل push به پشته در لیست پیوندی



hercool
پنج شنبه 02 دی 1389, 18:34 عصر
با سلام خدمت دوستان سایت سرمایه
سوالی دارم در رابطه با عمل push کردن در پشته ای که به واسطه لیست پیوندی پیاده سازی شده
اول دستور را قرار میدم

void push (node *top , elementtype item)
{
ptr=getnode();
if(is_full(ptr)){
cout<<"the memory is full";
exit(1);
}
ptr->info=item;
ptr->next=top;
top=ptr;
}


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

طبق قوانین سوالات دیگرم را در تاپیک های جداگانه میزنم تا نقض قوانین نشود

سعیدسعید
پنج شنبه 02 دی 1389, 20:29 عصر
باز هم یک سلام گرم دیگه
من در اینجا یک شکل از پشته پیوندی برات میکشم و موقعیت top رو برات نشون می دهم. احتمالا سوالت حل بشه.

TOP==> Item1 -> Item2 -> Item3
لیست فوق دارای سه تا عنصر هست و Top هم داره به ابتدای لیست طبق تعریف پشته اشاره می کند. حالا اگر بخواهیم یک عنصر جدید به این پشته اضافه کنیم باید به کجا اضافه کنیم؟ با توجه به تعریف پشته باید به بالای پشته اضافه شود پس باید قبل از Item1 قرار بگیرد. خطوط زیر از کد شما باعث می شود که اشاره گر عنصر جدید به جایی اشاره کند که در حال حاضر top به انجا اشاره میکند:
ptr->info=item;
ptr->next=top;
بنابر این بعد از اجرای دستورات فوق شکل لیست فرضی ما به این صورت خواهد شد:
Ptr -> Item1 -> Item2 -> Item3
اما در شکل فوق Top مشخص نیست که به کجا اشاره میکند ولی با توجه به کد شما چون هنوز Top عوض نشده است آن هم به Item1 اشاره میکند. بنابراین در این لحظه هم Top و هم Ptr به Item1 اشاره میکنند. با توجه به اینکه پس از درج عنصر جدید در پشته پیوندی، Top باید به عنصر جدید اشاره کند، خط قرمز رنگ در کد شما عمل مورد نظر را انجام میدهد و باعث می شود که top به عنصر جدیدی که اضافه شده یعنی ptr اشاره کند و همچنان مقدار بالای گشته را نشان دهد. شکل نهایی به صورت زیر می شود:
Top==> Ptr -> Item1 -> Item2 -> Item3

امیدوارم که کمکی به شما کرده باشم:لبخندساده:

hercool
پنج شنبه 09 دی 1389, 14:53 عصر
ببینید
من اول شکل پشته در حالت معمولی رو وارد می کنم اخرین عنصر اولین عنصری است که خارج میشه بنابراین زمانی که یک عنصر را می خواهیمم وارد کنیم باید به بالای پشته ببریم
64313

حالا زمانی که ما می خواهیم در لیست پیوندی پشته پیاده سازی کنیم باید زمانی که می خواهیم عنصری را وارد کنیم به بالای لیست وارد کنیم یعنی
64315
بنابرین در این کد باید این شکلی بشود که مقدار top باید جابجا شود و به اخرین عنصر اشاره کند بنابراین اگر top را جابجا کنیم اول لیست را از دست می دهیم بنابراین باید یا یک عنصر دیگر در اول لیست بزاریم که عنصری از بین نرود یا طریقه وارد کردن داده را برعکس کنیم یعنی به این شکل که
64316

حالا اینجا کد را فکر کنم بتونیم بهتر تشریح کنیم یعنی

ptr=getnode(); در اینجا ما یک گره ایجاد می کنیم و ان را داخل متغییر ptr وارد می کنیم
ptr->info=item; مقداری را که با نام ایتم میشناسیم را در بخش اطلاعات متغییر ptr قرار میدهیم
ptr->next=top; سپس داخل اشاره گر متغییر ptr ادرس top را قرار می دهیم
top=ptr; سپس ptr را داخل متغییر top می کنیم یعنی در اینجا ما گره بدست امده را با عنوان top می شناسیم(یعنی top به گره ptr اشاره می کند)

اگر ایرادی در برداشت من هست راهنمایی بفرمایید