المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره ی تابستان:دوره ی ۱۷:برنامه نویسی:سوال ۹

سوال ۹

فرض کنید که داده‌ساختار لینک لیست ‎‎ دوطرفه از عناصری با ‎type‎ زیر ساخته شده است:

struct Node{‎
    ‎Node *next‎,*prev;‎
    ‎int key;‎
‎};

‎ فرض کنید که ‎next‎ آخرین عنصر لینک لیست و ‎prev‎ اولین عنصر لینک لیست ‎NULL‎ است. شما بایستی تابع ‎Node * insertLinkedList(Node *start1‎, ‎Node *start2‎, ‎Node *p‎, ‎int where)‎ را پیاده سازی کنید. start1‎ و ‎start2‎ به ابتدای دو لینک لیست مختلف اشاره می‌کنند. این تابع باید لینک لیستی که ‎start2‎ به آن اشاره می‌کند را در لینک لیستی که ‎start1‎ به ابتدای آن اشاره می‌کند وارد کند و اشاره‌گر به ابتدای لینک لیست حاصل را بعنوان خروجی برگرداند. p‎ یکی از عناصر لینک لیستی است که ‎start1‎ به آن اشاره می‌کند. در صورتی که ‎where=0‎ باشد، لینک لیست دوم بایستی قبل از عنصر ‎p‎ وارد شود و اگر ‎where=1‎ باشد، لینک لیست دوم باید بعد از عنصر ‎p‎ وارد شود. ‎ دقت کنید شما باید این تابع را در ‎${\cal O}(1)$‎ پیاده سازی کنید.

بعنوان مثال اگر لینک لیست اوّل (از راست به چپ) شامل عناصر ‎۱‎ و ‎۲‎ و ‎۳‎ و ‎۴‎ باشد و ‎p‎ به عنصر اوّل (یعنی ‎۱) اشاره کند و لینک لیست دوم شامل عناصر ۵‎ و ‎۶‎ و ‎۷‎ و ‎۸‎ باشد، اگر ‎insertLinkedList(start1‎, ‎start2‎, ‎p‎, ‎0)‎ را اجرا کنیم لینک لیست اول به صورت ‎۵‎ و ‎۶‎ و ‎۷‎ و ‎۸‎ و ‎۱‎ و ‎۲‎ و ‎۳‎ و ‎۴‎ در می‌آید ولی اگر ‎insertLinkedList(start1‎, ‎start2‎, ‎p‎, ‎1)‎ را اجرا کنیم لینک لیست اول به صورت ‎۱‎ و ‎۵‎ و ‎۶‎ و ‎۷‎ و ‎۸‎ و ‎۲‎ و ۳‎ و ‎۴‎ در می‌آید.‎


ابزار صفحه