PDA

View Full Version : لیست پیوندی چیست؟



saeid99
شنبه 30 آذر 1387, 18:33 عصر
:لبخندساده:سلام دوستان امیدوارم حالتون خوب باشه..
سوال اینکه که لیست پیوندی چیه ؟ و به چه درد میخوره؟
و چطور میشه که آرایه ای از لیست های پیوندی رو تشکیل داد؟
+++++++++++++
و اینکه آیا میشه از لیست پیوندی به جای آرایه استفاده کرد؟:متفکر:

MIDOSE
شنبه 30 آذر 1387, 18:44 عصر
دوست گلم تو سایت از اینا پره (گوگل را بذار و برو)اما اگه واقعا نتونستی چیز قابل درکی پیدا کنی بگو تا وقتی که اومدم برات توضیح بدم باید ببخشی چون الان باید برم نمیتونم بشینم برات توضیح بدم.
البته اساتیدی هستند که خیلی بهتر از من می تونند راهنمایی کنند.
موفق باشی

sang9111
شنبه 30 آذر 1387, 20:47 عصر
دوست من خلاصه بهت بگم تا راحت درک کنی
مثلا من و شما می دونیم چند tap با مرورگر باز می کنیم نه نمی دونیم
پس اگر از آرایه استفاده کنیم باید تعداد مشخصی رو تعیین کنیم که به درد ما نمی خوره
پس می یام از لیست پیوندی استفاده می کنیم تا محدود نباشه
البته تا جایی که می تونیم باید از آرایه ها استفاده کنیم بهتر است از آرایه ها استفاده کنیم ولی اگه مجبور باشیم لیست پیوندی
نحوه پیاده سازی لیست پیوندی هم ما که از کتاب ها بهتر نمی تونیم توضیح بدیم منبع فراوان

MIDOSE
یک شنبه 01 دی 1387, 00:20 صبح
حالا اومدم
اول از همه همو نطور که دوست عزیزمون sang9111 گفتند ببینید شما تو ارایه مثلا ارایه ای با 12 حافظه ایجاد می کنید حالا خوب اگه شما مجبور باشید در طول برنام طول ارایه را زیاد کنید چه می کنید خوب معلوم شد که ما نیازمون طوری است که بتونیم در طول برنامه بسته به نیازمون حافظه بگیریم خوب لیست پیوندی میاد این کارو واسمون راحت می کنه که برای تعریف لیست پیوندی باید از struct استفاده کنی که تو این ساختار باید یک متغیر و یک اشاره گر تعریف کنی تو لیست پیوندی این طوری است که با متغیره حافظه
می گیری و با اشاره گر خونه ی حافظه ی بعدی رو مشخص می کنی . اگه بخوام بازم توضیح بدم بحث سنگین می شه بهت توصیه می کنم اول شما از منابع موجود یه بهره ای ببری چون اگه بخوام بگم از الانت هم گیج تر می شی.راستی منبع هم دنبال ساختمان داده در C از قمی نژاد باش(بدی نیست).

اگه سوالی بود در خدمتم
موفق باشی

...StacK...
یک شنبه 01 دی 1387, 23:01 عصر
ارایه ای با 12 حافظه

این نحو درسته برای استفاده ؟؟؟

saeid99
دوشنبه 02 دی 1387, 14:11 عصر
ممنونم..توضیحاتتون مختصر و مفید بود با این تفاسیر آیا میشه که لیست ها رو اندیس گزاری کرد؟
و آیا هر جای که میخواهیم از آرایه استفاده کنیم می تونیم از لیست پیوندی هم استفاده کنیم البته سختی این کار مد نظرم نیست فقط میخوام بدونم میشه یا نه؟

sang9111
دوشنبه 02 دی 1387, 21:01 عصر
ممنونم..توضیحاتتون مختصر و مفید بود با این تفاسیر آیا میشه که لیست ها رو اندیس گزاری کرد؟
و آیا هر جای که میخواهیم از آرایه استفاده کنیم می تونیم از لیست پیوندی هم استفاده کنیم البته سختی این کار مد نظرم نیست فقط میخوام بدونم میشه یا نه؟

بله میشه لیست پیوندی رو هم اندیس گزاری کرد وبه وسیله یه تابع به تک تک عناصر دسترسی داشت ولی نه به معنای واقعی مثل آرایه ولی این کار یه خورده هزینه بر است برای همین کلا بهتر است از آرایه استفاده کرد
در کتابخانه QT شی لیست پیوندی همه این امکانات رو فراهم می کنه چیز جالبی است

MIDOSE
سه شنبه 03 دی 1387, 06:27 صبح
این نحو درسته برای استفاده ؟؟؟
دوست عزیز منظورتون رو متوجه نمی شم.

saeid99
سه شنبه 03 دی 1387, 18:25 عصر
بله میشه لیست پیوندی رو هم اندیس گزاری کرد وبه وسیله یه تابع به تک تک عناصر دسترسی داشت ولی نه به معنای واقعی مثل آرایه ولی این کار یه خورده هزینه بر است برای همین کلا بهتر است از آرایه استفاده کرد
در کتابخانه QT شی لیست پیوندی همه این امکانات رو فراهم می کنه چیز جالبی است
پس اینطور که من متوجه شدم استفاده از آرایه بهتر از لیست پیوندی هست درسته یا نه؟
...............................................
و آیا میشه که به جای آرایه از لیست پیوندی استفاده کرد؟
................................................
و اینکه در لیست پیوندی که هر عضئ آن فقط عامل جلویی خودشو میشناسه چطور میشه از اندیس استفاده کرد؟؟
/*ممنون میشم حدالامکان با مثال توضیح بدید سوال آخری رو*/:خجالت:

Saeed_m_Farid
چهارشنبه 04 دی 1387, 13:58 عصر
پس اینطور که من متوجه شدم استفاده از آرایه بهتر از لیست پیوندی هست درسته یا نه؟
دوست عزیز موارد کاربرد این دو تا با هم متفاوته و نمیشه مقایسشون کرد اگه پیاده سازی لیست پیوندی درست باشه کارایی زیادتری نسبت به آرایه ها میتونه داشته باشه، شما میتونین توابع و حتی عملگرهای overload شده روی لیستتون پیاده کنید یعنی همون کاری که پلتفرمهای جدید مثل C# , Java انجام دادن و مثلا ++، --، -= و ... رو روی این نوع متغیرها پیاده سازی کردن.
در مورد سوال دومتون هم لیست دو پیوندی آدرس هر دو همسایش هم داره اینم یه مثال که در مورد اعداد بزرگ پیاده سازی شده :

class CBigInt
{
private:
uShort _base;
char _sign;
uShort _size;
CDigit *_head;
CDigit *_tail;
public:
CBigInt(uShort base = BASE);
CBigInt(char ch, uShort base = BASE);
CBigInt(const CBigInt &bi2);
CBigInt(const char *decStr, uShort base = BASE);
~CBigInt(void);
char *toStr(uShort base=BASE) const;
CBigInt & operator = (const CBigInt &bi2);
bool operator == (const CBigInt &bi2) const;
bool operator != (const CBigInt &bi2) const;
bool operator < (const CBigInt &bi2) const;
bool operator <= (const CBigInt &bi2) const;
bool operator > (const CBigInt &bi2) const;
bool operator >= (const CBigInt &bi2) const;
CBigInt & operator + (const CBigInt &bi2) const;
CBigInt & operator - (const CBigInt &bi2) const;
CBigInt & operator * (const CBigInt &bi2) const;
CBigInt & operator / (const CBigInt &bi2) const;
CBigInt & operator % (const CBigInt &bi2) const;
CBigInt & operator * (const CDigit &d2) const;
CBigInt & operator + (const CDigit &d2) const;
CBigInt & operator++();
CBigInt & operator--();
CBigInt & operator++(int dummy);
CBigInt & operator--(int dummy);
friend ostream & operator << (ostream &bob, const CBigInt &bi);
};

Saeed_m_Farid
چهارشنبه 04 دی 1387, 14:13 عصر
البته لازم نیست زیاد خودتون رو درگیر سازنده، تخریب گر و یا عملگرهای کلاس کنید منظورم از این کد نحوه پیاده سازی صحیح و اشاره گرهای دوطرفه هستند که تو قسمت private پیاده سازی شدن، تو فایل ضمیمه نحوه کار این کلاس رو میتونین ببینین.

saeid99
چهارشنبه 04 دی 1387, 20:52 عصر
متشکرم دوست خوبم

saeid99
شنبه 07 دی 1387, 10:42 صبح
حال من میام یک لیست پیوندی میسازم که دارای 8 عنصر هست و پیوند ها رو هم به صورت یک طرفه برقرار میکنم اگه بخوام آرایه ای 8 تایی از همین لیست هشت عنصری ایجاد کنم چیکار باید کنم البته نمیخوام که دوباره پیوند ها رو برقرار کنم منظورم اینکه همون اول که پیوند ها رو ایجاد کردم در تعریف آرایه خودش پیوند ها رو ایجاد کنه... آیا همچین چیزی امکان داره..ممنون میشم بهم کمک کنید این بحث برام خیلی مهمه:لبخندساده:

Saber_Fatholahi
شنبه 07 دی 1387, 13:02 عصر
دوست من اگه میخوای همون لیست تغییر بدی خوب میتونی لیست پیمایش کنی و مقادیر توی گره های جدید بریزی اگه میخوای لیست توی آرایه بریزی خوب اول پیمایش کن توی یه حلقه بعدم گره هاتو توی آرایت بریز
امیدوارم منظور شمارو گرفته باشم
موفق باشید

Saeed_m_Farid
یک شنبه 08 دی 1387, 00:13 صبح
سلام دوستان عزيز:


حال من میام یک لیست پیوندی میسازم که دارای 8 عنصر هست و پیوند ها رو هم به صورت یک طرفه برقرار میکنم اگه بخوام آرایه ای 8 تایی از همین لیست هشت عنصری ایجاد کنم چیکار باید کنم البته نمیخوام که دوباره پیوند ها رو برقرار کنم منظورم اینکه همون اول که پیوند ها رو ایجاد کردم در تعریف آرایه خودش پیوند ها رو ایجاد کنه... آیا همچین چیزی امکان داره..ممنون میشم بهم کمک کنید این بحث برام خیلی مهمه:لبخندساده:


دوست من اگه میخوای همون لیست تغییر بدی خوب میتونی لیست پیمایش کنی و مقادیر توی گره های جدید بریزی اگه میخوای لیست توی آرایه بریزی خوب اول پیمایش کن توی یه حلقه بعدم گره هاتو توی آرایت بریز
امیدوارم منظور شمارو گرفته باشم
موفق باشید

واقعيتش من نه سوال رو فهميدم و نه جوابي كه بهش داده شده؟! يعني چي پيوندها رو بصورت يك طرفه برقرار ميكنم كه بخواي دوباره همونها رو برقرار كني؟ ضمنا اگه قرار بود آرايه تعريف كنيد پس ديگه واسه چي رفتيم سراغ ليست پيوندي؟ من احساس ميكنم رو اصل ليست پيوندي بايد بيشتر تمركز كنيد!
جواب Saber_Fatholahi هم كه اصلا قابل درك نيست (حداقل واسه من!) ؛

من واسه شما يه كد از ليست تك پيوندي واسه تست ميذارم كه 3 تا عنصر داره (چون 8 تا زياده) از هر نوع يكي تا نحوه استفاده مثلا واسه جستجو رو هم ببينيد...
اولش هدر واسه ساختار و كلاس اضافه و كم كردن به ليست و جستجو ...


//---------------------------------------------------------------------------
struct TTestLinkedList
{
long lParam4Test;
char sParam4Test[40];
double fParam4Test;

TTestLinkedList* Next;
};
//---------------------------------------------------------------------------
class TListOfTest
{
private:
int size;

// List Builder
public:
TListOfTest();
int Count();
TTestLinkedList* Head;

// List Operations
public:
int Add(TTestLinkedList* Item);
TTestLinkedList *Retrieve(int pos);
bool Delete();
bool Delete(int pos);
bool Find(TTestLinkedList* Item);
};
//---------------------------------------------------------------------------
حالا ميتوني اينو تو يه فايل ذخيره كني (TListOfTest.h) و به فايل اصلي ات ضميمه كني :


#include <iostream>
#include "TListOfTest.h"

//---------------------------------------------------------------------------
TListOfTest::TListOfTest()
: size(0), Head(NULL)
{
}
//---------------------------------------------------------------------------
int TListOfTest::Count()
{
return size;
}
//---------------------------------------------------------------------------
int TListOfTest::Add(TTestLinkedList *NewItem)
{
TTestLinkedList *Sample = new TTestLinkedList;

Sample = NewItem;
Sample->Next = Head;
Head = Sample;
return size++;
}
//---------------------------------------------------------------------------
TTestLinkedList *TListOfTest::Retrieve(int Position)
{
TTestLinkedList *Current = Head;

for(int i = 0; i < Position && Current != NULL; i++)
{
Current = Current->Next;
}

return Current;
}
//---------------------------------------------------------------------------
bool TListOfTest::Delete()
{
if( Head == NULL )
{
std::cout << "The list is empty\n";
return false;
}
else
{
TTestLinkedList *Current;

Current = Head->Next;
Head->Next = Current->Next;
size--;
return true;
}
}
//---------------------------------------------------------------------------
bool TListOfTest::Delete(int Position)
{
if( Retrieve(Position) == NULL )
return false;
else
{
Retrieve(Position - 1)->Next = Retrieve(Position+1);
size--;
return true;
}
}
//---------------------------------------------------------------------------
bool TListOfTest::Find(TTestLinkedList* ItemToFind)
{
TTestLinkedList *Current;

if( ItemToFind == NULL )
return false;
for(Current = Head; Current != NULL; Current = Current->Next)
{
if( (Current->lParam4Test == ItemToFind->lParam4Test) &&
(strcmp(Current->sParam4Test, ItemToFind->sParam4Test) == 0) &&
(Current->fParam4Test == ItemToFind->fParam4Test) )
return true;
else
Current->Next;
}

return false;
}
//---------------------------------------------------------------------------

ديگه زحمت استفاده اش به عهده خودتون؛ فقط چندتا نكته :

1- واسه ايجاد instance از كلاس ليستتون اينطوري عمل مي كنيد

TListOfTest *myList = new TListOfTest();و واسه ايجاد يه تك عنصر از ساختارتون اينطوري :

TTestLinkedList *mySingleTest = new TTestLinkedList;2- يادتون نره كه اون چيزايي كه new ميكنيد رو Delete كنيد.

3- براي دستيابي به اعضا همونطوري كه ميدونيد از <- استفاده كنيد.

4- براي اطلاعات بيشتر ميتونيد مثلا به اين لينك مراجعه كنيد: Creating Linked Lists in Cpp (http://richardbowles.tripod.com/cpp/linklist/linklist.htm)

با تشكر
موفق باشيد.

saeid99
یک شنبه 08 دی 1387, 10:25 صبح
ممنون از راهنمایی تون این طور که متوجه شدم بهتره که یا فقط از آرایه استفاده کنیم یا فقط از لیست پیوندی...
راستی ببخشید اینقدر سوال میکنم ..
چطور میشه به ابتدای لیست پیوندی پیمایش کرد؟؟

---------------------------

saeid99
یک شنبه 08 دی 1387, 11:34 صبح
میخوام که هشت تا لیست رو که ایجاد کردم رو به هم پیوند بدم چیکار باید کنم یه کد نوشتم که میزارم اما خطا میده .. ممنون میشم اشتباهاتش رو بگید
...................