PDA

View Full Version : کپی کردن لیست به صورت بازگشتی



sneaker
دوشنبه 02 آذر 1388, 23:02 عصر
یه مرد خدا پیدا میشه کپی کردن لیست به صورت بازگشتی تریس کنه؟
اگرم وقتشو نداری ولی قصد کمک به منو داری فقط لطف کن یه توضیح مختصر بده که چطوری باید تریسش کنم؟ یعنی اصلا این الگوریتم چطوری کار میکنه، چی به عنوان ورودی میاد، لیست کجا کپی میشیو خلاصه هر چی که فک میکنی لازمه توضیح بده! یه دنیا ممنونم





function copy (L: LIST): LIST;
var
LC: LIST;
begin
if ( L = nil) then return (nil);
new (LC);
LC^.element :=L^.element;
LC^.next := copy (L^.next);
return (LC)
end;

shask00l
دوشنبه 02 آذر 1388, 23:55 عصر
توی این کدی که نوشتی کاری که انجام میشه واضحه .
تابع copy یه ورودی از نوع لیست میگیره که احتمالا اشاره گر به سر لیست یا همون start خودمونه.
بعد چک میکنه که nil نباشه .(این کار برای تشخیص انتهای لیست انجام میشه) اگر nil بود تابع هم nil بر میگردونه .
در غیر این صورت یه مقدار توی حافظه برای نود lc ایجاد میکنه . و بعد مقدار ورودی l رو توی lc قرار میده (بخش داده ای) .
مقدار next مربوط به lc رو مساوی با مقدار برگشتی تابع copy میکنه که برای گره ی بعدی l اجرا شده . دقت کنید که خط زیر این دستور یعنی return (LC) میره توی استک و بعد از پایان کار copy اجرا میشه و با اجرا شدنش آدرس lc برمیگرده به تابع قبلی و قرار میگیره توی lc.next تابع قبلی به همین صورت از آخر به اول .

mortezamsp
سه شنبه 03 آذر 1388, 10:01 صبح
فكركنم بجاي LIST بايد مينوشت NODE دراينصورت اين كد يه ليست جديد ميسازه و از گره آخر ليست قبلي شروع ميكنه و گره ها رو به ليست جديد كپي ميكنه.

0 : يك گره دريافت كن
1 : اگر گره دريافتي انتهاي ليست بود، مقدار انتهاي ليست را برگردان.
2 : در غيراينصورت، يك گره جديد بساز و
3 : مقدار element گره دريافتي را در آن كپي كن
4 : به خط 0 برگرد و گره next گره دريافتي را بدست بياور، و آن را به اشاره گر next گره جديد پيوند بزن
5 : گره جديد را برگردان ( در اولين فراخواني،مقدار بازگشتي معادل اولين گره در ليست جديد است)

sneaker
چهارشنبه 04 آذر 1388, 21:58 عصر
لطف کردین ممنونم