Transcript Linked List

‫مهدی ایل بیگی‬
‫دانشگاه آزاد اسالمی دماوند‬
‫‪ -1‬حذف و درج عناصر در آرايه ها مرتب بسيار زمانبر است‪.‬‬
‫‪ -2‬وقتي داراي چندين ليست مرتب شده با طول‌هاي متفاوت هستيي‪ ،‬بتا يرهتره تردن هتر‬
‫ليست در آرايه‌اي با حدا ثر اندازه حافظه هدر مي‌رود‪.‬‬
‫‪ -3‬طول آرايه بعد از تعريف ثابت مي‌ماند‪.‬‬
‫راه حل‪ :‬به هر عضو آرايه اشاره‌گري اضتافه شتود ته نگتانضر عضتو بعتدي باشتد‪ .‬آ ‌رايته‌اي‬
‫ه به اين شکل سارته شود يک ليست پيوندي (‪ )Linked List‬ناميده مي‌شود‪.‬‬
‫يک الس ‪ +‬يک اشاره‌گر به الس ه‪ ،‬نوع ديضر = ‪Node‬‬
‫‪Node = Data + pointer‬‬
‫‪2‬‬
‫• ليست تت‌هاي پيون تتدي معل تتوه ب تته وس تتياه گره‌ه تتا ي مت تتوا ب تتا ات تتاهتي تته ب تته صت تورت‬
‫فاش‌ها ي نگان داده شده‌اند ارائه مي‌گردند‪.‬‬
‫• از ن تتاا اش تتاره‌گر ب تته اول تتهن عن تتر ليس تتت ب تته عن تتوان ن تتاا تتل ليس تتت اس تتتفاده مي‌ش تود‪.‬‬
‫بنابراين ليست شکل زير ‪ List‬ناميده مي‌شود‪.‬‬
‫]‪[0] [1] [2‬‬
‫‪C‬‬
‫‪B‬‬
‫‪array‬‬
‫‪Array:‬‬
‫‪A‬‬
‫‪List‬‬
‫‪C‬‬
‫‪3‬‬
‫‪B‬‬
‫‪A‬‬
‫‪Linked list:‬‬
‫• برای ایجاد یک لیست تک پیوندی باید‪:‬‬
‫‪ .1‬ابتتدا یتک ستارتار یتا تالس بتا نتاا گتره )‪ (Node‬ایجتاد م‌‌نلتایی‪ .،‬در واقت بایتد نتوع‬
‫داده‌ای جدیت تتد بت تته نت تتاا گت تتره ایجت تتاد نلت تتایی‪ ،‬تت تتا س ت ت بتت تتوانی‪ ،‬لیست تتت پیونت تتدی را ب ت تا‬
‫استفاده از این گره‌ها ایجاد نی‪.،‬‬
‫‪ .2‬یتتک نتتوع داده مجتترد بتته نتتاا لیستتت پیونتتدی (‪ )Linked List‬ایجتتاد م‌‌نلتتایی‪ ،‬بتته‬
‫ط تتوری تته ی تتک اش تتاره‌گر ب تته ن تتوع داده گ تتره )‪ (Node‬بعن تتوان بد تتش داده در ای تتن‬
‫‪ ADT‬در نظتتر گرفتتته رواهتتد شتتد‪ .‬ایتتن اشتتاره‌گر در واق ت بتته ابتتتدای لیستتت پیون تدی‬
‫اشتتاره م‌‌نلایتتد‪ .‬در قستتلت تواب ت تتتوابدر ماننتتد درج عن تتر جدیتتد بتته لیستتت ح تذف‬
‫یک عن ر از لیست و‪ ...‬را باید پیاده‌سازی نلایی‪.،‬‬
‫‪4‬‬
‫• در زبان ‪ C‬ابتدا باید یک سارتار به ناا گره )‪ (Node‬ایجاد نلتایی‪ ،‬و ست‬
‫برای ار با این گره تعریف نلایی‪.،‬‬
‫‪Node‬‬
‫تتوابدر‬
‫‪Struct‬‬
‫{‬
‫;‪int data‬‬
‫;‪Node *next‬‬
‫;}‬
‫• توابدر مانند‪ :‬رواندن و نوشتن داده در یک گره و رواندن و تعیهن مقدار اشتاره‌گر بته‬
‫عن ر بعدی باید پیاده سازی گردد‪.‬‬
‫‪5‬‬
‫‪6‬‬
‫{ ‪class Node‬‬
‫‪private:‬‬
‫;‪int data‬‬
‫متغهر يرهره ننده داده ‪//‬‬
‫;‪Node *link‬‬
‫اشاره گر به گره بعدی ‪//‬‬
‫‪//Methods‬‬
‫‪public:‬‬
‫} ;‪Node() { data = 0; link = NULL‬‬
‫;)(‪int getData‬‬
‫رواندن مقدار فیاد داده ‪//‬‬
‫;)‪void setData(int d‬‬
‫نوشتن مقدار فیاد داده ‪//‬‬
‫نوشتن مقدار فیاد اشاره گر ‪void setNext(Node n); //‬‬
‫;)(‪Node* getNext‬‬
‫رواندن مقدار فیاد اشاره گر ‪//‬‬
‫;}‬
‫تاب‬
‫{ ‪class Linked_List‬‬
‫‪private:‬‬
‫;‪int count‬‬
‫متغهر نضه دارنده تعداد اعضای لیست ‪//‬‬
‫اشاره گر به ابتدای لیست پیوندی ‪Node *head; //‬‬
‫‪public:‬‬
‫سازنده ه تابدر است ه‪ ،‬ناا الس و در زمان ایجاد متغهری از‬
‫نوع الس فراروان‌ م‌ شود‪.‬‬
‫‪Linked_List(); //‬‬
‫تاب اضافه ردن یک گره جدید به لیست‬
‫‪7‬‬
‫‪void addNode(Node n); //‬‬
‫تاب اضافه حذف یک گره از لیست‬
‫‪void removeNode(Node n); //‬‬
‫تاب جستجوی یک عن ر در لیست‬
‫‪//‬‬
‫;)‪int search(Node n‬‬
‫تاب محاسبه طول لیست‬
‫‪//‬‬
‫} ;‪int length() { return count‬‬
‫;}‬
‫• دستور زیر یک لیست پیوندی را با استفاده از الس تعریف شده تعریف م‌‌نلاید‪.‬‬
‫;‪Linked_List List‬‬
‫• بتتا اجترای دستتتور فتتوا تتتاب ستتازنده فرارتتوان‌ متت‌ شتتود‪ .‬در ایتتن تتتاب متغهتتر اشتتا ‌ره‌گر بتته‬
‫ابتدای لیست و تعداد عناصر لیست مقدار دهر اولیه م‌‌شود‪.‬‬
‫)(‪Linked_List‬‬
‫{‬
‫;‪this -> count = 0‬‬
‫;‪this -> head = NULL‬‬
‫}‬
‫‪8‬‬
‫• بت ترای جس تتتجوی ی تتک عن تتر در لیس تتت بای تتد از ابت تتدای لیس تتت ت تتا ان تتای آن را برر ت ت ی‬
‫نلایی‪ .،‬قطعه د زیر این علایات را نگان م‌ دهد‪.‬‬
‫)‪int search (int n‬‬
‫{‬
‫;‪node *p = head‬‬
‫)‪while(p‬‬
‫{‬
‫)‪if (p -> data == input‬‬
‫;‪return 1‬‬
‫;‪p = p -> next‬‬
‫پیلایش لیست با جاو بردن اشاره گر ‪// P‬‬
‫}‬
‫;‪return 0‬‬
‫‪9‬‬
‫}‬
‫• ب ترای اضتتافه نلتتودن یتتک مقتتدار بتته لیستتت نامرتتتب ایتتن مقتتدار بتته آرتتر لیستتت اضتتافه‬
‫م‌‌گردد‪.‬‬
‫– پ ابتدا باید لیست را تا ان ا پیلایش نلایی‪ ،‬و س عن ر مذ ور را به ان ای لیست اضتافه‬
‫نلایی‪ .،‬یعنی اشاره‌گر آررین عن ر لیست را به این عن ر اشاره دهی‪ ،‬و اشتاره‌گر ایتن عن تر را‬
‫برابر با ‪ NULL‬نلایی‪.،‬‬
‫• ب ترای اضتتافه نلتتودن یتتک مقتتدار بتته لیستتت مرتتتب ابتتتدا بایتتد جتتای عن تتر جدیتتد را در‬
‫لیست پیدا نی‪ ،‬و س عن ر را در جای مناسب درج نی‪.،‬‬
‫– برای درج عن ر در میانه لیست باید اشاره‌گر گره‌ها را تغیهر دهی‪.،‬‬
‫‪10‬‬
‫• برای درج یک عن ر به میانه لیست باید‪:‬‬
‫‪ .1‬جای عن ر را برای درج شناسای‌ نلایی‪.،‬‬
‫‪ .2‬اشاره‌گر عن ر درج شده را به عن ر بعد از رتود انيستام مت‌‌دهی‪( .،‬آدرس عن تر‬
‫بعدی در اشاره‌گر عن ر ماقبل از عن ر درج شده م‌‌باشد)‬
‫‪ .3‬اشتاره‌گر عن تتری ماقبتتل از عن تتری تته م‌‌رتواهی‪ ،‬درج شتتود را بتته عن تتر درج شتده‬
‫اشاره م‌‌دهی‪.،‬‬
‫‪head‬‬
‫‪NULL‬‬
‫‪7‬‬
‫‪2‬‬
‫‪4‬‬
‫‪3‬‬
‫‪11‬‬
‫‪1‬‬
‫• قطع تته تتد مراح تتل ي تتر ش تتده ب ترای اض تتافه تتردن ی تتک عن تتر ب تته میان تته لیس تتت در زی ت ‌تر‬
‫آورده شده است‪:‬‬
‫;‪temp -> link = next‬‬
‫)‪if(next == this->head‬‬
‫;‪this -> head = temp‬‬
‫‪else‬‬
‫;‪prev -> link = temp‬‬
‫• در تتد فتتوا ‪ temp‬اشتتاره‌گر بتته عن تتری استتت تته م‌‌رتتواهی‪ ،‬درج شتتود و ‪ next‬و‬
‫‪ prev‬بترتیتتب اشتتاره‌گر بتته عن تتر بعتتد و قبتتل از عن تتری تته م‌‌رتتواهی‪ ،‬درج نل تایی‪،‬‬
‫هسيند‪.‬‬
‫‪12‬‬
:‫• تاب درج عن ر در ابتدای لیست‬
Void AddNode1 (Node n)
{
n.link = head;
head = &n;
count++;
}
:‫• تاب درج عن ر در ان ای لیست‬
Void AddNode2 (Node n)
{
node *p = head;
if (p == null) { head = &n; count++; return; }
while (p -> link != null)
p = p -> link;
p -> link = &n;
count++;
}
13
Void AddNode3 (Node n)
{
Node *q = head, *p = head;
while (p != null && p -> data <= n.data)
{
q = p;
p = p -> link;
}
n.link = p;
if (p == head) head = &n;
else q -> link = &n;
count++;
}
14
‫• برای حذف یک عن ر از لیست مراحل زیر را باید ط‌ نی‪:،‬‬
‫‪ .1‬ابتدا عن ر ماقبل از عن ر مورد نظر را م‌ یابی‪.،‬‬
‫‪ .2‬اشتتاره‌گر ایتتن عن تتر را بتته عن تتر بعتتد از عن تتری تته م‌‌رتتواهی‪ ،‬حتتذف نتتی‪ ،‬اشتاره‬
‫م‌‌دهی‪.،‬‬
‫‪ .3‬عن ری را ه باید حذف شود را از حافظه پاک م‌‌نلایی‪.،‬‬
‫‪head‬‬
‫‪NULL‬‬
‫‪15‬‬
‫‪7‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫• قطعتته تتد مراحتتل ي تتر شتتده بترای حتتذف تتردن یتتک عن تتر از لیستتت در زیتتر آورده شتتده‬
‫است‪.‬‬
‫پیلایش لیست تا رسیدن به گره ای‬
‫م‌ باشد‪.‬‬
‫;‪prev = head‬‬
‫)‪while (prev -> link -> data != input‬‬
‫;‪prev = prev -> link‬‬
‫ه ماقبل عن ر م ‌ورد نظر‪//‬‬
‫يرهره سازی عن ری ه باید حذف شود‬
‫;‪temp = prev -> link‬‬
‫انيسام اشاره گر عن ر ماقبل عن ری ه باید حذف ش ‌ود به‪prev -> link = temp -> link; //‬‬
‫عن ر مابعد آن‬
‫ر‬
‫حافظه‬
‫از‬
‫نظر‬
‫د‬
‫مو‬
‫ر‬
‫عن‬
‫حذف‬
‫‪delete temp; //‬‬
‫• نکتتته‪ :‬قبتتل از تتد فتتوا بایتتد مقتتدار عن تتری تته متت‌ رتتواهی‪ ،‬حتتذف نتتی‪ ،‬را بتتا عن تتر ابتتتدای لیستتت‬
‫مقایسه نلتایی‪ ،‬اگتر عن تر ابتتدای لیستت بایتد حتذف شتود بایتد مقتدار اشتاره‌گر آن بته عنتوان آدرس‬
‫ابتدای لیست در نظر گرفته شود‪.‬‬
‫‪16‬‬
.‫• تاب زیر یک نود از ابتدای لیست حذف م‌ ند‬
Void RemoveNode1 ( )
{
if (head == null)
{
cout << “List Is Empty”;
return;
}
node *temp = head;
head = head -> link;
delete (temp);
cout << “First Node Was Deleted”;
}
17
.‫• تاب زیر یک نود از ان ای لیست حذف م‌‌ ند‬
Void RemoveNode2 ( )
{
Node *q = head, *p = head;
if (head == null) { cout << “List Is Empty”; return; }
while (p -> link != null)
{
q = p;
p = p -> link;
}
if (p == head) head = null;
else q -> link = null;
delete (p);
cout << “Last Node Was Deleted”;
}
18
.‫) از لیست را حذف م‌‌ ند‬n( ‫• تاب زیر یک نود دلخواه‬
Void RemoveNode3 (Node n)
{
Node *q = head, *p = head;
if (head == null) { cout << “List Is Empty”; return; }
while (p != null && p -> data != n.data)
{
q = p;
p = p -> link;
}
if (p == null) { cout << “Item Was Not Found”; return; }
if (p == head) head = p -> link;
else q -> link = p ->link;
delete (p);
cout << “Last Node Was Deleted”;
19
}
‫• در لیس تت‌های یکطرفتته معلتتو ر اگتتر بدتتواهی‪ ،‬عناصتتر بتته ان تتای لیستتت اضتتافه نلتتایی‪،‬‬
‫(مانند صف) باید هر بار ل لیست را پیلایش نلایی‪.،‬‬
‫• برای حل این مگکل م‌‌توانی‪ ،‬بجای نضهتداری اشتاره‌گر بته ابتتدای لیستت اشتاره‌گر بته‬
‫ان ای لیست را نضهداری نلایی‪.،‬‬
‫• برای دستر ت ی بته ابتتدای لیستت و عناصتر دیضتر آن هزا استت ته لینتک آرترین گتره را‬
‫به گره ابتدای لیست اشاره بدهی‪.،‬‬
‫• آدرس گره ابتدای لیست = ‪Last -> Link‬‬
‫‪last‬‬
‫‪C‬‬
‫‪20‬‬
‫‪B‬‬
‫‪A‬‬
‫• ليستت‌هاي تتتک پيونتتدي تض تتا بعشت ي از مگتتکالت را حتتل مي‌ نتتد چترا تته فقت بتته راحتتتي‬
‫مي‌تواني‪ ،‬در جهت پيوندها حر ت ني‪.،‬‬
‫• مثتتال‪ :‬فتترک نيتتد تته بتته يتتک گتتره م تتخ ماننتتد ‪ ptr‬اشتتاره نتتي‪ ،‬و بدتتواهي‪ ،‬گتتره‬
‫قب تتل از ‪ ptr‬را پي تتدا ن تتي‪ ،‬تض تتا راه ي تتافتن گ تتره ماقب تتل ‪ ptr‬پيل تتازش از ابت تتداي ليس تتت‬
‫مي‌باشد‪.‬‬
‫• يک گره در يک ليست پيوندي دوگانه حداقل داراي سه فياد مي باشد‪:‬‬
‫– فياد ‪data‬‬
‫– فياد ‪( l_link‬اشاره گر به چپ)‬
‫– فياد ‪( r_link‬اشاره گر به راست)‬
‫‪21‬‬
‫• يک ليست پيوندي دوگانه به دو صورت است‪:‬‬
‫– حاقوی‌‬
‫– غهرحاقوی‌‬
‫• مثال‪ :‬ليست پيوندي دوگانه حاقوي با گره ‪:head‬‬
‫‪r link‬‬
‫‪item‬‬
‫‪l link‬‬
‫‪Head Node‬‬
‫‪22‬‬
Void insert (node* node, node* newnode)
{
/* insert newnode to the right of node */
newnode -> l_link = node;
newnode -> r_link = node -> r_link;
node -> r_ink -> l_link = newnode;
node -> r_link = newnode;
}
23
Void delete (node* deleted)
{
/* delete from the doubly linked list */
if (head == deleted)
cout << "Deletion of head node not permitted. \ n";
else {
deleted -> l_link -> r_link = deleted -> r_link;
deleted -> r_link -> l_link = deleted -> l_link;
free (deleted);
}
}
24
‫• در اينجا مي توان هر جلاه را به صورت يک گره نلازش داد‪.‬‬
‫• براي نلازش ضريب توان و اشاره‌گري به گره بعدي هر گره نیاز بته سته فياتد رواهتد‬
‫داشت‪.‬‬
‫• مثال‪:‬‬
‫‪8‬‬
‫‪ 2x 1‬‬
‫‪14‬‬
‫‪a  3x‬‬
‫‪a‬‬
‫‪NULL‬‬
‫‪25‬‬
‫‪0‬‬
‫‪1‬‬
‫‪8‬‬
‫‪2‬‬
‫‪14‬‬
‫‪3‬‬
‫• ب تراي جل ت دو چندجلاتته اي ابتتتدا فتترک متتي نتتي‪ ،‬تته ‪ a‬و ‪ b‬اشتتاره گتتري بتته ابتتتداي‬
‫چند جلاه اي ها مي باشند‪.‬‬
‫• اگتتر تتتوان دو چنتتد جلاتته اي بتتا هتت‪ ،‬برابتتر باشتتد ض ترايب بتتا هتت‪ ،‬جل ت متتي شتتوند و گتتره‬
‫جديدي تگکيل مي شود هلچنهن اشاره گرها را به گره هتاي بعتدي در ‪ a‬و ‪ b‬حر تت‬
‫مي دهي‪.،‬‬
‫• اگر توان چند جلاه اي ‪ a‬لتر از توان متناظر در چند جلاه اي ‪ b‬باشد آنگتاه يتک‬
‫جلاه شبيه به اين جلاه ‪ b‬ايجاد و آنرا به نييجه زعنتي ‪ d‬اضتافه متي نتي‪ ،‬و اشتاره‬
‫گتر را بته جلاته بعتدي در ‪ b‬منتقتل متي نتي‪ .،‬هلتهن علتل را اگتر > ‪a -> expon‬‬
‫‪ b -> expon‬باشد بر روي ‪ a‬انجاا مي دهي‪. ،‬‬
‫• اگتر چندجلاته ای ‪ a, b‬بترتیتب ‪ m, n‬جلاته داشتته باشتند مرتبته زمتان‌ الگتوریت‪،‬‬
‫جل دو چندجلاه ای برابر با )‪ O(n+m‬رواهد شد‪.‬‬
‫‪26‬‬
0 0 11
12 0 0
0 -4 0
0 0 0
0 0 0
0 -9 0
0
0
0
0
0
0
0
0
0
0
0
0
13 0
0 14
-8 0
0 0
0 0
0 0
27
‫• در نلازش داده ها هر سطر و ستون ماتر‬
‫یک گره ‪ head‬ارائه مي شود‪.‬‬
‫اسپارس با يک ليستت پيونتدي حاقتوي و‬
‫• هر گره داراي پنج فياد مي باشد‪:‬‬
‫‪row col down right value‬‬
‫• از فياد ‪ down‬بتراي اشتاره بته عن تر مدتالف صتفر بعتدي در هلتان ستتون استتفاده‬
‫مي شود‪ .‬این فیاد در آررین عن ر هر ستون به گره ابتدای ستون اشاره م‌ ند‪.‬‬
‫• از فياد ‪ right‬براي اشاره به عن ر مدالف صفر بعدي در هلتان ستطر استتفاده متي‬
‫شود‪ .‬این فیاد در آررین عن ر هر سطر به گره ابتدای سطر اشاره م‌ ند‪.‬‬
‫‪28‬‬
‫• ازآنجائیکتته اشتتاره گتتر ‪ right‬در گتتره هتتای ‪ head‬در لیستتت ستتتون هتتا رالیستتت و از‬
‫طرفر در گره های ‪ head‬در لیست سطرها فقت از فیاتد ‪ right‬استتفاده مت‌ شتود‬
‫پ ت م تت‌ ت تتوان از هرگ تتره ‪ head‬در لیس تتت س تتتون ه تتا ب تته عن تتوان گ تتره ‪ head‬لیس تتت‬
‫سطر ها ه‪ ،‬استفاده نلود‪.‬‬
‫• پت اگتتر در یتتک متتاتری ‪ m*n‬تعتتداد عناصتتر غهتتر صتتفر را ‪ r‬در نظتتر بضهتتری‪ ،‬چتتون یتتک‬
‫گ تتره ب تته عن تتوان گ تتره ‪ head‬اص تتمر ه تت‪ ،‬داری تت‪ ،‬تع تتداد تتل گ تتره ه تتا بت ترای نل تتایش ای تتن‬
‫ماتری برابر رواهد بود با‪:‬‬
‫‪r + max {n,m} + 1‬‬
‫• مرتبه زمان‌ برای رواندن تلام‌ عناصر برابر است با‪:‬‬
‫)‪O(max {n,m} + r) = O(n + m + r‬‬
‫‪29‬‬
‫• با استفاده از لیست پیوندی یکطرفه حاقوی یک دفترچه تافن پیاده سازی نلایید‪.‬‬
‫• هر ر ورد باید ناا ناا رانوادگ‌ و تعدادی شلاره تافن را برای هر فرد يرهره نلاید‪.‬‬
‫• برای اینکه بترای یتک فترد هتر تعتداد ته هزا باشتد شتلاره تافتن يرهتره نلتایی‪ ،‬فیاتد شتلا ‌ره تافتن یتک‬
‫اشاره گر به ابتدای لیست پیوندی دیضری است ه شلاره تافن ها در آن ها يرهره شده اند‪.‬‬
‫• جستجو در لیست باید براساس ناا ناا رانوادگ‌ و شلاره تافن انجاا پذیر باشد‪.‬‬
‫• فیاد ناا و ناا رانوادگ‌ با طول ثابت تعریف م‌ شوند‪.‬‬
‫• امکان حذف و درج افراد و تغیهر حذف و درج شلاره تافن ها باید وجود داشته باشد‪.‬‬
‫• امکان چاپ تلام‌ شلاره تافن های یک فرد نهز باید فراه‪ ،‬باشد‪.‬‬
‫‪30‬‬