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