View Full Version : حرفه ای: جواب این دوتا سوال چی میشه ؟؟
achil1
پنج شنبه 07 دی 1391, 23:20 عصر
1-تکه برنامه زیر بر روی لیست پیوندی یک طرفه با نام head چه عملی را انجام میدهد
P:= Head;
q:= Link(P);
while ( q <> nil ) do begin
temp:= Link(q); Link(q):=P;
P:=q; q:=temp;
end;
Link(Head):=nil; Head:=P
;
2- اگر x و y اشاره گرهایی به 2 لیست مجزای دو طرفه (غیر تهی) باشند تکه برنامه زیر چه عملی انجام میدهد
t:=x;
while(t^.next <> nil)
t:= t^.next;
t^.next:= y^.next;
if (y^.next <> nil)
y^.next^.prev:=t;
x:=prev:=y;
y^.next:=x;
ببخشید که این موضوع رو در اینجا ارسال کردم
از مدیران خواهش میکنم تا 24 ساعت انتقال ندن
ممنون
mahak006
جمعه 08 دی 1391, 04:41 صبح
P:= Head;
q:= Link(P);
while ( q <> null ) do
begin
temp:= Link(q); Link(q):=P;
P:=q; q:=temp;
end;
Link(Head):=null; Head:=P
;
t:=x;
while(t^.next <> null)
t:= t^.next;
t^.next:= y^.next;
if (y^.next <> null)
y^.next^.prev:=t;
x:=prev:=y;
y^.next:=x;
کد ها رو داخل تگ بذارید که راحت بشه خوند .
mahak006
جمعه 08 دی 1391, 05:03 صبح
P:= Head;
q:= Link(P);
while ( q <> null ) do
begin
temp:= Link(q); Link(q):=P;
P:=q; q:=temp;
end;
Link(Head):=null; Head:=P
;
t:=x;
while(t^.next <> null)
t:= t^.next;
t^.next:= y^.next;
if (y^.next <> null)
y^.next^.prev:=t;
x:=prev:=y;
y^.next:=x;
کد ها بره لیست های پیوندی معمولی نیست . اول یه لیست پیوندی استاندارد ( یک طرفه بدون هدر و غیر حلقوی ) رو تبدیل می کنه به یه لیست ستاره ای ( مرکز همون p و بقیه نود ها تک تک به p اشاره می کنن . p هم به null اشاره می کنه .
کد دوم بره دو لیست پیوندیه که اون ها هم غیر حلقوی بدون عنصر هدر و دو طرفه هستن .
اول لیست x قرار می گیره و در ادامه از نود دوم لیست y به بعد قرار می گیره و دو لیست اینجوری به هم وصل می شن . آخر سر هم نود اول لیست y میاد ابتدای لیست پیوندی جدید ( که متصل شده ی دو لیست قدیمی هست ) قرار می گیره . ( البته این آخرش تو کد یه مقدار مشکل داره . احتمال داره اشتباه نوشته باشید یا اشتباه گفته باشم . منظوذم دو خط آخره ) .
achil1
جمعه 08 دی 1391, 12:10 عصر
ببخشید میشه یه کم بیشتر توضیح بدید
ممنون
mahak006
جمعه 08 دی 1391, 12:51 عصر
ببخشید میشه یه کم بیشتر توضیح بدید
ممنون
چون این ها سودوکد هستن ( شبه کد ) یه مقداری نسبت به علایم برنامه نویسی فرق می کنه . به خاطر همین شاید به چشمتون زیاد آشنا نمیاد :
P:= Head;
q:= Link(P);
while ( q <> null ) do
begin
temp:= Link(q); Link(q):=P;
P:=q; q:=temp;
end;
Link(Head):=null; Head:=P
;
خط اول p ( که اشاره گری به نود هست ) رو برابر با آدرس نود اول لیست می کنه . ( یعنی الآن p داره به اول لیست پیوندی اشاره می کنه )
خط دوم q ( اشاره گر به نود ) رو برابر با آدرس موجود در p->link می کنه . یعنی q داره به نود دوم از لیست اساره می کنه و اگه نود دومی نباشه به null اشاره می کنه ( بسته به آدرسی که تو p->link هست )
خط سوم یه حلقه تعریف کرده که تا وقتی که q!=null هست ادامه پیدا می کنه .
خط ۵ یه اشاره گر به نود به نام temp تعریف کرده که مقدار q->link رو بهش می ده . ( یعنی نود بعد از q ) در ادامه تو همین خط q->link رو برابر با p می کنه ( یعنی از الآن به بعد لینک مربوط به نود q به p اشاره می کنه نه به نود بعدیش )
خط ۶ اشاره گر p رو برابر q می کنه .( من دیشب اینو ندیدم . با این اوصاف این لیست پیوندی دیگه ستاره ای نمی شه . ) بعد از اون هم q برابر temp می شه ( یعنی q به q->link قدیمی که همون نود بعدیش بود اشاره می کنه .) تو دور بعدی حلقه هم به همین ترتیب ادامه می ده تا وقتی که به آخر لیست برسه ( یعنی q==null )
خارج حلقه هم رو head ( که اشاره گر به اول لیست قدیمی بود ) تغییراتی ایجاد می کنه : head->link رو برابر null می کنه و بعدش head رو برابر p می کنه ( head به ابتدای لیست جدید که قبلا انتهای لیست قدیمی بوده می آد . )
اگه مراحل رو روی کاغذ بره یه لیست پیوندی چند عضوی انجام بدی می بینی که در اصل داره لیست سر و ته می شه .
t:=x;
while(t^.next <> null)
t:= t^.next;
t^.next:= y^.next;
if (y^.next <> null)
y^.next^.prev:=t;
x:=prev:=y;
y^.next:=x;
خط اول اشاره گر t رو برابر x ( ابتدای لیست اول ) قرار میده .
تو خط دوم یه حلقه شروع می کنه به پیمایش لیست تا وقتی که برسه به نود آخر از لیست اول .
خط چهارم ( که خارج حلقه هست ) t->next ( الآن برابر null هست ) رو برابر y->next میکنه ( y ابتدای لیست دومه . پس y->next می شه دومین عنصر از لیست دوم . یعنی t->next به دومین عنصر لیست دوم اشاره می کنه و از این عنصر به بعد به صورت سلسله ای تا آخر لیست دوم به لیست اولی متصل می شه . )
خط ۵ یه شرط رو چک می کنه که اگه لیست پیوندی دوم بیش از ۱ نود داشته باشه جواب این شرط true می شه و خط ۶ اجرا می شه .
خط ۶ y->next->prev رو برابر با t می کنه ( یعنی اشاره گر به نود قبلی از عنصر دوم لیست دوم رو برابر با t می کنه حالا دو لیست هم اشاره گر ها به نود بعدی و هم اشاره گر ها به نود قبلیشون کامل به هم وصل شده و به طور کامل به صورت رفت و برگشت به کل عناصر دو لیست به جز عنصر ابتدایی لیست دوم که y بهش اشاره می کنه دسترسی سلسله ای داریم . )
خط ۷ رو احتمالا اشتباه نوشتی باید اینطور باشه
x^.prev:=y;
تو این خط x->prev رو برابر با y می کنه ( اشاره گر به نود قبلی x برابر y می شه . پس y یه نود قبل x می شه .)
خط آخر هم y->next رو برابر x قرار می ده . یعنی اشاره گر به نود بعدی y برابر x می شه . با این کار نود y به اول لیست پیوندی جدید ( متصل شده ی دو لیست قبلی ) می آد .
مراحل رو بره دو لیست پیوندی چند عنصری روی کاغذ انجام بده . x به ابتدای لیست پیوندی اول و y به ابتدای لیست پیوندی دوم اشاره می کنه .
achil1
جمعه 08 دی 1391, 13:01 عصر
اقا دستتون درد نکنه واقعا زحمت کشیدید
ممنون که وقتتون رو گذاشتید
موفق باشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.