25
هان داده ساختماfaradars.org/fvds9402 مدرس: فرشید شیرافکن دانشجوی دکتری تهران نشگاه دا( سی ارشد کارشنا کارشناسی و: م افزار کامپیوتر نر( ) دکتری: نفورماتیک بیو ا) فصل پنجم: وندی لیست پی1 ﻓﺮادرسFaraDars.org

آموزش ساختمان داده ها - بخش پنجم

Embed Size (px)

Citation preview

Page 1: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

:مدرسفرشید شیرافکن

دانشگاه تهران دانشجوی دکتری (بیو انفورماتیک: دکتری( )کامپیوتر نرم افزار: کارشناسی و کارشناسی ارشد )

:فصل پنجم

لیست پیوندی

1

فرادرس

FaraDars.org

Page 2: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

لیست پیوندی

2

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

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

فرادرس.باشدمیطرفهدووطرفهیکنوعدوبرپیوندیلیست

FaraDars.org

Page 3: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

مقایسه آرایه با لیست پیوندی

3

.استمشخصآرایهدرعنصرهراندیسچوناست،ترسریعپیوندیلیستبهنسبتآرایهعناصربهدسترسی-1

.اشدبنمیحافظهدرعناصرفیزیكیجابجاییبهنیازچون.استترسادهآرایهبهنسبتپیوندیلیستدرحذفودرج-2

فرادرس.نداردوجودپیوندیلیستدردودوییجستجویامكان-3

FaraDars.org

Page 4: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

لیست پیوندی یک طرفه

4

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

.استشدهتشكیلآدرسودادهقسمتدوازپیوندیلیستاینهایگرهازیکهر

فرادرس

FaraDars.org

Page 5: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

چاپ محتویات لیست

5

.کندمیچاپراheadلیستهایدادهزیرتابع

print-list (head)

{

p=head;

for ( ; p != NULL ; p = p -> next )

cout << p -> data;

}

:کدشبهدومیوcزبانبهاولی.هستندمعادلزیردستوردو:تذکر

p = p -> next ;

p = next[p] ;

فرادرس

FaraDars.org

Page 6: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

چاپ محتویات لیست به صورت معکوس

6

.کندمیچاپمعكوسصورتبهراpشروعآدرسبالیستیکهایدادهزیرتابع

f (p)

{

if(!p) return;

f(p ->next);

cout << p -> data;

}

Complexity: O(n)

فرادرس

FaraDars.org

Page 7: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

در لیست پیوندی یک طرفهدرج یک گره

7

:کندمیدرجpمشخصآدرسباگرهیکازبعدراitemدادهباگرهیکزیرتابع

insert (head, p, item)

{

n= malloc (sizeof(node) ) ;

n -> data = item ;

n -> next = p -> next; (1)

p -> next = n; (2)

}

فرادرس

FaraDars.org

Page 8: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

در لیست پیوندی یک طرفهگره یک حذف

8

(داردقرارpمشخصآدرسباگرهازبعدdگره).کندمیحذفراdآدرسباگرهزیرتابع

delete( first , p , d)

{

if (p)

p-> next = d -> next;

else

*first = (*first) -> next;

free(d);

}

فرادرس

FaraDars.org

Page 9: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

اتصال دو لیست پیوندی

9

:کندمیمتصلhead1لیستانتهایبهراhead2لیستزیرتابع

concate ( head1, head2) {

if (head1==NULL)

return head2;

else {

if (head2!= NULL)

{

for (p = head1; p -> next != NULL ; p = p -> next ) ;

p -> next = head2;

}

return head1;

}}

فرادرس

FaraDars.org

Page 10: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

وارون کردن لیست پیوندی

10

.کردوارونآنگرهایاشارهتغییرباتنهاراعضویnلیستیکتوانمی

بهrواولعنصربهqواستتهیpابتدا.کنندمیاشارهمتوالیعنصرسهبهکنیم،‌کهمیاستفادهrوp،qگراشارهسهاز.بریممیجلوبهراگراشارهسههرودادهتغییرqعنصربهراrعنصرnextمولفهمرحله،‌هردر.کنندمیاشارهلیستدومعنصر

.استشدهمعكوسلیست،‌rشدنتهیبا

فرادرس

FaraDars.org

Page 11: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

تابع وارون

reverse(head) {if (size(head)<=1) return head;p = null;

q = head;t = q -> next ;while ( t != null)

{q -> next = p;p = q;q = t;t = t -> next;

}q ->next = p;return q;

}.این‌کار‌در‌زمان‌خطی‌انجام‌می‌شود

11

فرادرس

FaraDars.org

Page 12: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402لیست پیوندی دوطرفه

بهکهداردهم‌prevمولفه،طرفهیکلیستهایمولفهبرعالوهعنصرهر،(سویهدو)طرفهدوپیوندیلیستهایدر.کندمیاشارهلیستدراشقبلیعنصر.شودمیاستفادهنیزRlinkازnextجایبهوLlinkازPrevجای‌به:تذکر

.داردوجودطرفدوهربهحرکتامكاناشاره‌گر‌هااینازاستفادهبا

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

:نودتعریف

struct node{

int data;

struct node *next;

struct node *prev;

};

12

فرادرس

FaraDars.org

Page 13: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

در لیست پیوندی دو طرفه اضافه کردن گره

pبه‌سمت‌راست‌گره‌با‌آدرس‌مشخص‌xاضافه‌کردن‌گره‌

insert ( p , x) {

x -> prev = p; (1)

x -> next = p -> next; (2)

p -> next -> prev = x; (3)

p -> next = x; (4)

}‌برای‌اضافه‌کردن‌یک‌گره‌به‌یک‌لیست‌پیوندی‌دو‌ ‌اشاره‌گر‌نیاز‌است4به‌طرفه، .تغییر

13

فرادرس

FaraDars.org

Page 14: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

حذف گره از لیست پیوندی دو طرفه

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

delete(p)

{

p -> prev -> next = p -> next;

p -> next -> prev = p -> prev;

free(p);

}

.تغییر‌اشاره‌گر‌نیاز‌است2به‌طرفه،‌برای‌حذف‌یک‌گره‌از‌یک‌لیست‌پیوندی‌دو‌

14

فرادرس

FaraDars.org

Page 15: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

لیست پیوندی حلقوی

لیستابتدایبهNULLبادهیمقدارجایبهگره،آخریناشاره‌گرآندرکهاستطرفهیکلیستنوعی،(چرخشی)حلقویلیست.می‌کنداشاره

.داشتدسترسیگره‌هاکلیهبهمی‌توانگرههرآدرسداشتنباچرخشیلیستدر

.داریمدسترسیقبلیگرهبهکهاستایندرغیرچرخشییكطرفهلیستبهنسبتچرخشییكطرفهلیستمزیت

حلقویطرفهدوپیوندیلیست

15

فرادرس

FaraDars.org

Page 16: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

طول یک لیست حلقویمحاسبه

length (p){

c=0;

if (p) {

t = p;

do{

c++;

t = t -> next;

} while(t != p);

}

return c;

}16

فرادرس

FaraDars.org

Page 17: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

مسئله ژوزفوس

رفتندگتصمیمگروهاینتسلیم،جایبه.بودندشدهمحاصرهغاریکدررومیانیوسیلهبهکهبوداییهودی41ازیكیژوزفوسنوبتودبكشراخودهازندهدومنفربارهرحلقوی،صورتبهواولنفرازشروعباتاگذاشتندقرارآنها.کنندخودکشیهمگیکهبایدکهرادیفرآخریننشستنمكانوبودآنهااززرنگ‌ترژوزفوسولی.نماندباقیهیچكسکهاینتابرسد،بعدییزندهنفربه

.برددرسالمجانونشستمكانآندرابتداازوکردمحاسبهراکردمیخودکشی

گرد،ساعتجهتدرو1یشمارهازشروعباوبگیرندقرارایدایرهدورnتا1هایشمارهبانفرnاگر:کلیحالتدرمسئله؟داردایشمارهچهنفرآخرینبكشد،راخودشزندهنفردومینبارهر

:n=5برایخودکشیترتیب

1 , 2 , 3 , 4 , 5 1 , 3 , 4 , 5 1 , 3 , 5 3 , 5 3

:n=6برایخودکشیترتیب

1 , 2 , 3 , 4 , 5 , 6 1 , 3 , 4 , 5 , 6 1 , 3 , 5 , 6 1 , 3 , 5 1 , 5 5

17

فرادرس

FaraDars.org

Page 18: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

رابطه بازگشتی مسئله ژوزفوس

:استزیرصورتبهژوزفوسمسئلهبازگشتیرابطه

.که:رابطهاینجواب

.کنیدمحاسبهباالبازگشتیرابطهکمکبهراf(10)مقدار:مثال

:دومروش

.شدخواهد5جوابدهیم،قراررا(10ازکوچكتردوتوانعددبزرگترین)8مقدارkازایبهو10مقدارnازایبهرابطهجوابدراگر

18

11121)1(2)2( ff

31121)2(2)5( ff

51321)5(2)10( ff

1)1(

11)(2)12(

11)(2)2(

f

nnfnf

nnfnf

1)kn(2 nk

log2فرادرس

FaraDars.org

Page 19: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

مثال

روی‌لیست‌پیوندی‌حلقوی‌شكل‌زیر،‌مقدار‌خروجی‌چقدر‌است؟‌بر‌fبا‌فرض‌اجرای‌تابع‌

int f (L) {

if (L -> next == L)

return L -> data;

L -> next = L -> next -> next;

return f (L -> next);

}

:حل

مقدار‌،‌در‌رابطه‌kبه‌جای‌(‌1000بزرگترین‌عدد‌توان‌دو‌کوچكتر‌از‌)512و‌nبه‌جای‌1000قرار‌دادن‌با‌.حاصل‌می‌شود977

19

1)kn(2

فرادرس

FaraDars.org

Page 20: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

پیاده سازی پشته به کمک لیست پیوندی

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

20

delete(top ) {

d = top ;if (d ==NULL) exit ( ) ;

else {

item = d -> data ;top = d -> next ;

free(d) ;return item ;

} }

add(top , item)

{n = malloc(sizeof (stack)) ;

n -> data= item ;

n -> next = top ;top = n ;

}

فرادرس

FaraDars.org

Page 21: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402پیاده سازی صف به کمک لیست پیوندی

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

21

deleteq(front){

if ( front == NULL)exit( );

d = front ;item = d -> data ;front = d -> next ; free(d);return item;

}

addq(front , rear, item) {n = malloc(sizeof(queue));n -> data= item; n ->next = NULL;if (front)

rear -> next = n ;else

front = n ;rear = n ;

}

فرادرس

FaraDars.org

Page 22: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

لیست عمومی

.استلیستیکیااتمیکعنصر،هرکهنحویبه،استعنصرnازمحدودیرشتهعمومی،لیست.می‌شونددادهنمایشبزرگحروفباهالیستوکوچکحروفباهااتم:تاسشدهتشكیلقسمتسهازعمومیلیستنودهر

یکبهره‌گراشادوم،قسمتباشد،یکفلگاگر.بودخواهداتمیک،دومقسمتباشد،صفرفلگایناگر.استفلگیکاولقسمت.می‌شوداستفادهبعدینودبهاشارهبرایسومقسمت.استلیست:مثال

L=(a , A , (b,c) , d)

head:اولعنصرtail:اولعنصرازغیربهعناصرهمه

22

فرادرس

FaraDars.org

Page 23: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

تمرین

.بنویسیدبازگشتیصورتبهراطرفهیکپیوندیلیستکردنوارونهالگوریتم-1

.کندحذفراطرفهیکپیوندیلیستدرتکراریعناصرکهبنویسیدالگوریتمی-2

.شدخواهدچگونهبازگشتیرابطهکند،خودکشیزندهنفرامینkبارهراگرژوزفوسمسئلهدر-3

k=2فرضبانمونهطوربه.کندمعکوساییتkصورتبهراطرفهیکپیوندیلیستکهبنویسیدالگوریتمی-4

.کندتبدیل2,1,4,3,6,5شکلبهرا1,2,3,4,5,6لیست

23

فرادرس

FaraDars.org

Page 24: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

تمرین

تابع زیر چیست؟عملکرد -5what(head) {

prev = NULL;

last =head ;

while ( last ->next != NULL) {

prev = ptr ;

last = last ->next ;

}

prev ->next = NULL ;

last -> next = head ;

head = last ;

}

24

فرادرس

FaraDars.org

Page 25: آموزش ساختمان داده ها - بخش پنجم

ساختمان داده ها

faradars.org/fvds9402

25

این اسالید ها بر مبنای نکات مطرح شده در فرادرس« مجموعه فرادرس های ساختمان داده ها»

.تهیه شده است

.نماییدلینک زیر مراجعه برای کسب اطالعات بیشتر در مورد این آموزش به

faradars.org/fvds9402

فرادرس

FaraDars.org