مسیرها
/
C++
C++
/
تمرین‌ها
/
لیست پیوندی
لیست پیوندی

لیست پیوندی

متوسط

مقدمه

شما روی پروژه‌ای کار می‌کنید که هدفش توسعه‌ی یک سامانه‌ی زمان‌بندی قطار برای شبکه‌ی راه‌آهنی پرتردد است.

از شما خواسته شده است که یک نمونه‌ی اولیه برای مسیرهای قطار در سامانه‌ی زمان‌بندی توسعه دهید. هر مسیر از دنباله‌ای از ایستگاه‌های قطار تشکیل می‌شود که قطار موردنظر در آن‌ها توقف می‌کند.

دستورالعمل‌ها

تیم شما تصمیم گرفته است برای نمایش هر مسیر قطار در برنامه‌ی زمانی، از یک «لیست پیوندی دوطرفه» استفاده کند. هر ایستگاه در مسیر قطار با یک گره در لیست پیوندی نمایش داده می‌شود.

لازم نیست نگران زمان رسیدن و حرکت در ایستگاه‌ها باشید. هر ایستگاه به‌سادگی با یک عدد نمایش داده می‌شود.

می‌توان مسیرها را گسترش داد و به ابتدا یا انتهای یک مسیر ایستگاه افزود. همچنین می‌توان با حذف ایستگاه‌ها از ابتدا یا انتهای یک مسیر، آن را کوتاه کرد.

گاهی یک ایستگاه تعطیل می‌شود و در آن صورت باید آن ایستگاه از مسیر حذف شود، حتی اگر در ابتدا یا انتهای مسیر نباشد.

اندازه‌ی یک مسیر نه با مسافتی که قطار می‌پیماید اندازه‌گیری می‌شود، بلکه با تعداد ایستگاه‌هایی که در آن‌ها توقف می‌کند.

Note

لیست پیوندی یک ساختار داده‌ی بنیادی در علوم کامپیوتر است که اغلب در پیاده‌سازی ساختارهای داده‌ی دیگر به کار می‌رود. همان‌طور که از اسمش پیداست، لیستی از گره‌هاست که به هم پیوند خورده‌اند. لیستی از «گره‌ها» است که هر گره به همسایه یا همسایه‌هایش پیوند می‌خورد. در یک لیست پیوندی یک‌طرفه هر گره فقط به گره بعدی خود پیوند می‌خورد. در یک لیست پیوندی دوطرفه هر گره هم به گره قبلی و هم به گره بعدی خود پیوند می‌خورد.

اگر می‌خواهید درباره‌ی لیست‌های پیوندی بیشتر بدانید، نگاهی به این مقاله بیندازید که آن را با تصویرهای زیبا توضیح می‌دهد.

ساختار این تمرین در مسیر C++

هرچند لیست‌های پیوندی را می‌توان به روش‌های گوناگونی و با ساختارهای داده‌ی زیرین مختلف پیاده‌سازی کرد، اینجا از شما می‌خواهیم لیست پیوندی خود را به شیوه‌ی شیءگرا پیاده‌سازی کنید.

در فایل linked_list_test.cpp خواهید دید که یک کلاس List قالبی فراخوانی می‌شود. از شما انتظار می‌رود این کلاس را با توابع عضو زیر بنویسید:

  • push یک عنصر را به انتهای لیست اضافه می‌کند،
  • pop آخرین عنصر لیست را حذف می‌کند و برمی‌گرداند،
  • shift اولین عنصر لیست را حذف می‌کند و برمی‌گرداند،
  • unshift یک عنصر را به ابتدای لیست اضافه می‌کند،
  • count تعداد کل عناصر لیست جاری را برمی‌گرداند.

در پایان، می‌خواهیم علاوه بر متدهای گفته‌شده در بالا، erase را هم پیاده‌سازی کنید. erase یک آرگومان می‌گیرد که همان مقدار موردنظر برای حذف از لیست پیوندی است. اگر این مقدار بیش از یک بار ظاهر شود، فقط اولین رخداد باید حذف شود. باید برگرداند که آیا عنصری حذف شده است یا نه.

هرچند Test نمی‌شود، ممکن است بخواهید اگر pop و shift روی یک List خالی فراخوانی شوند، یک استثنا پرتاب کنید.


منبع

موضوعی کلاسیک در علوم کامپیوتر
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
C++ Exercism

آماده‌اید لیست پیوندی را شروع کنید؟

در Exercism ثبت‌نام کنید تا C++ را همراه با 19 مفهوم100 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.