97
دي ون ي پ هاي ت س لي

ليست هاي پيوندي

  • Upload
    bryony

  • View
    40

  • Download
    5

Embed Size (px)

DESCRIPTION

ليست هاي پيوندي. تعريف ليست پيوندي Link List. تعريف : مجموعه ای از گره ها که هرگره حداقل شامل يک فيلد داده ويک فيلد اشاره گر است. اشاره گر هر گره از نوع خود گره است. هر گره به وسيله ی اشاره گر خود به گره بعدی اشاره می کند. B. Z. A. 0. نقا يص کار با آرا يه ها به صورت ترت يب ی. - PowerPoint PPT Presentation

Citation preview

Page 1: ليست هاي پيوندي

پيوندي هاي ليست

Page 2: ليست هاي پيوندي

پيوندي ليست Link Listتعريف

AA . . .. . . 0ZZBB

: حداقل هرگره که ها گره از ای مجموعه تعريف. است گر اشاره فيلد ويک داده فيلد يک شامل

. است گره خود نوع از گره هر گر اشاره بعدی گره به خود گر اشاره ی وسيله به گره هر

. کند می اشاره

Page 3: ليست هاي پيوندي

ها به صورت يهکار با آرا يصنقایيبترت

آن گرفتن از بعد حافظه بودن ناپذير بازگشت نياز مورد حافظه بيشترين بينی پيش بودن الزم عنصر کردن اضافه بودن هزينه پر عنصر کردن حذف بودن هزينه پر

Page 4: ليست هاي پيوندي

عنصر کردن اضافه بودن هزينه پر

خواهيم الفبايی Cمی آن ترتيب که طوری به کنيم اضافه آن به رابماند.

A B D E F

0 1 2 3 4 5

Shift

Page 5: ليست هاي پيوندي

- عنصر کردن اضافه بودن هزينه پرادامه

A B C D E F

0 1 2 3 4 5

:چيست؟ باال الگوريتم مرتبه سوالO(n)

Page 6: ليست هاي پيوندي

عنصر کردن حذف بودن هزينه پر

بخواهيم بايد Bاگر کنيم حذف قبلی ی آرايه از رابياوريم عقب به يکی را آن از بعد عناصر تمام

A B C D E F

0 1 2 3 4 5

) نيز الگوریتم اين نيز (مرتبه الگوریتم اين .nn((OOمرتبه .است است

shift

Page 7: ليست هاي پيوندي

صورت به آرايه با کار از ناشی مشکالت حل راهترتيبی

پيوندی ازليست استفاده

مزايا:ازهم – مشخصی فواصل در را ها داده نيستيم مجبور

. دهيم قراربه – را استفاده بدون ی حافظه توان می

کامپيوتربرگرداند.

Page 8: ليست هاي پيوندي

پيوندي- ليست عمليات

ليست- ايجادليست- در گره درج

ليست- از گره حذفليست- در جستجو

ليست- سازي مرتبليست- كردن معكوس

و- ...

Page 9: ليست هاي پيوندي

نياز مورد داده ساختمان

: ليست لينك سازي پياده جهت

آرايه – از استفادهگر – اشاره از Pointerاستفاده

Page 10: ليست هاي پيوندي

وسيله به پيوندی ليست سازي پيادهآرايه ی

دو از بايد ليست اين ايجاد برای. کرد استفاده آرايه

آرايه : – اين ها داده برای اول ی آرايهمی انتخاب نظر مورد ی داده نوع از

يک ( مثال )structureشوداين : – ها اتصال برای دوم ی آرايه

نوع از که . intآرايه با متناظر است . آدرس ی دهنده نشان که هاست داده

. است بعدی داده

Page 11: ليست هاي پيوندي

AA BB CC II HH KK 0

- آرايه ی وسيله به پيوندی ليست سازي پيادهادامه

-1 8 0 1 5 3LinkLink

First = 4First = 4

DataData K H A C I B

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

Page 12: ليست هاي پيوندي

AA BB CC II HH KK 0

DataData

LinkLink -1 8 0 1 5 3

K H A C I B

First = 4First = 4

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

پيوندی ليست در درج

Page 13: ليست هاي پيوندي

AA BB CC II HH KK

DD

0

First = 4First = 4

-1 8 0 1 5 3

K H A C D I B DataData

LinLinkk

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

- ادامه پيوندی ليست در درج

Page 14: ليست هاي پيوندي

-1 8 0 1 1 5 3

K H A C D I B DataData

LinkLink

First = 4First = 4

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

AA BB CC II HH KK 0

DD

- ادامه پيوندی ليست در درج

Page 15: ليست هاي پيوندي

-1 8 0 2 1 5 3

K H A C D I B DataData

LinkLink

First = 4First = 4

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

AA BB CC II HH KK 0

DD

- ادامه پيوندی ليست در درج

Page 16: ليست هاي پيوندي

AA BB CC II HH KK 0DD

-1 8 0 2 1 5 3

K H A C D I B DataData

LinkLink

First = 4First = 4

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]

- ادامه پيوندی ليست در درج

Page 17: ليست هاي پيوندي

پيوندی ليست در درج مراحل

1 (ها داده ی آرايه در لينک ی داده دادن قرار2 (خودش از بعد عضو به جديد عضو دادن اشاره3 (عضو به جديد عضو از قبل عضو دادن اشاره

جديد

می : – قرار ليست در را عضوجديد ابتدا هميشه نکتهاشاره جديد عضو به بايد که را عضوهايی سپس دهيم

. دهيم می اشاره آن به کنند

Page 18: ليست هاي پيوندي

گر اشاره با سازي پياده

نود يك تعريفمشخص – مسئله اين است الزم

داده نوع چه ما فيلدهای که شود ). می مثال عنوان به هستند ای

( کاراکتر يک توان

classclass CharNode CharNode

{{

privateprivate ::

charchar data data;;

CharNode CharNode **linklink;;

};};

Page 19: ليست هاي پيوندي

ليست طراحی روشهای

: اول طرحنظر firstمتغير – در سراسری متغير عنوان به نوع از را

. گيريم میNode *first;

گر – کاراکتر linkاشاره .privateاعضای dataو هستند

اجرا – زمان خطاي

Page 20: ليست هاي پيوندي

: دوم طرح– data , link صورت به . ( publicرا اصل نقض بياوریم در

( سازي محصورتوابع – .( get و setاز نقض نماييم استفاده کدام هر برای

( سازي مخفي اصل

ليست طراحی روشهای

Page 21: ليست هاي پيوندي

ها داده سازی مخفی اصل اطالعات به تر ساده دسترسي

ليست کل حاوی که شود می تعريف دیگر کالس يک.)first(باشد

کالس ی وسيله به ليست طراحیمدير

Page 22: ليست هاي پيوندي

class List{

public ://list manipulation operations

private:Node * first;

};class Node{

friend class List;private :

char data;Node * link;

};

کالس ی وسيله به ليست طراحیادامه- مدير

Page 23: ليست هاي پيوندي

ListList

firstfirst AA BB NN. . .. . . 00

NodeNode

نود کالس و ليست کالس بين مفهومی ی نود رابطه کالس و ليست کالس بين مفهومی ی رابطه

ListList

firstfirst ......AA BB NN 00

NodeNode

نود کالس و ليست کالس بين واقعی ی نود رابطه کالس و ليست کالس بين واقعی ی رابطه

کالسمدير بين ی کالسگره (List)رابطه و(Node)

Page 24: ليست هاي پيوندي

در گرها اشاره ++Cدستکاری

: گر اشاره يک تعريفNode * pointer;

: گر اشاره برای حافظه گرفتنpointer = new Node;

: حافظه کردن آزادdelete pointer;

Page 25: ليست هاي پيوندي

گره – دو با ليست ايجاد مثال

void List::Create2()

{ first = new Node (‘B’);

first link = new Node (‘C’);

}

Node :: Node (char element =0)

{ data = element;

link = 0 ; //null pointer

}

BB CCfirst

Page 26: ليست هاي پيوندي

ليست – ابتداي در گره درج مثال

void List :: InsertFirst ()

{ Node *t = new Node(‘A’);

t link = first;

first = t;

}

AA

BB CCfirst

AA

BB CCfirst AA

Page 27: ليست هاي پيوندي

قابليت با پيوندی کالسليست يکمجدد استفاده

کنيم طراحی را ليست يک بار يک که نيست بهترکنيم؟ استفاده آن از بار چندين و

برای پيوندی ليست يک از بتوانيم که اين برایهای کالس از بايد کنيم استفاده بار چند

.templateالگو( کنيم) استفاده

Page 28: ليست هاي پيوندي

template <class Type> class List; //forward declarationtemplate <class Type>class ListNode{

friend class List<Type>;private :

Type date;ListNode *link;

};template <class Type>class List{

public :List(){first = 0;}

private:ListNode <Type> *first;

};

ی استفاده قابليت با های ليست تعريفمجدد

Page 29: ليست هاي پيوندي

پيوندی ليست روی عملکردها

1 (پيوندی ليست نمايش2 (ليست در عنصری کردن اضافه3 (عنصر کردن حذف... و

Page 30: ليست هاي پيوندي

first

temp

�A �B C �D

Output : A

نمایشليست ) پيمايش) پيوندی

Page 31: ليست هاي پيوندي

first

temp

�A �B C �D

first

temp

�A �B C �D

Output : A B

نمايشليست -) ادامه) پيمايش پيوندی

Page 32: ليست هاي پيوندي

first

temp

�A �B C �D

first

temp

�A �B C �D

first

temp

�A �B C �D

Output : A B C

نمايشليست -) ادامه) پيمايش پيوندی

Page 33: ليست هاي پيوندي

first

temp

�A �B C �D

first

temp

�A �B C �D

first

temp

�A �B C �D

first

temp

�A �B C �D

Output : A B C D

نمايشليست -) ادامه) پيمايش پيوندی

Page 34: ليست هاي پيوندي

-)پيمايش(پيوندی نمايشليست ادامه

void ListNode :: Print(){

if( !first ) return; //no node

Node *temp = first;

while(temp) //traverse list{

cout << temp data;temp = temp link; //next node

}}

Page 35: ليست هاي پيوندي

جديد عنصر کردن اضافه

فرق کردن اضافه مختلف کاربردهای برای البته. کند می

يک از بعد جديد عنصر کردن اضافه اينجا در ما. دهيم می نشان را مشخص عنصر

: کار مراحلجديد) 1 عنصر نصبجديد) 2 عنصر به مربوط گرهای اشاره تنظيم

Page 36: ليست هاي پيوندي

first

curNode

0

0newNode

جديد عنصر کردن اضافه

Page 37: ليست هاي پيوندي

first

curNode

0

newNode

- جديد عنصر کردن اضافهادامه

C

BA D E

newNode newNode link = curNode link = curNode link ; link ;

Page 38: ليست هاي پيوندي

first

curNode

0

newNode

- ادامه جديد عنصر کردن اضافه

A B D E

C

curNode curNode link = newNode ; link = newNode ;

Page 39: ليست هاي پيوندي

first

curNode

0

newNode

- ادامه جديد عنصر کردن اضافه

A B C D E

Page 40: ليست هاي پيوندي

- ادامه جديد عنصر کردن اضافه

template <class Type>void ListNode<Type> :: Insert (Node*curNode ,Node *newNode){

newNode --> link = curNode --> link ; //assign newNodecurNode --> link = newNode ; //assign curNode

}

Page 41: ليست هاي پيوندي

ليست ابتدای به کردن اضافه

که کنیم می بررسی را خاص حالت اين دليل بدينگر اشاره بايد عنصر کردن اضافه از به firstبعد

. کند اشاره ليست ابتدای کار مراحل

جديد) 1 عنصر نصبگر) 2 اشاره دادن جديد firstاشاره عنصر به

Page 42: ليست هاي پيوندي

ليست ابتدای به کردن اضافه

first 0

0

newNode

A

B C D E

Page 43: ليست هاي پيوندي

first 0

newNode

- ادامه ليست ابتدای به کردن اضافه

A

B C D E

newNode newNode link = first; link = first;

Page 44: ليست هاي پيوندي

- ادامه ليست ابتدای به کردن اضافه

first 0

newNode

EDCB

A

first = newNode;first = newNode;

Page 45: ليست هاي پيوندي

- ادامه ليست ابتدای به کردن اضافه

first

newNode

0A B C D E

Page 46: ليست هاي پيوندي

- ادامه ليست ابتدای به کردن اضافه

template <class Type>void ListNode<Type> :: InsertFirst(Node *newNode){

if( !first ) //no node{

first = newNode;newNode --> link = NULL;return;

}

newNode --> link = first; //assign newNodefirst = newNode;

}

Page 47: ليست هاي پيوندي

پيوندی ليست از عنصر حذف

: کار مراحلگرها) 1 اشاره تنظيم2( حافظه) ( کردن آزاد گره کردن حذف

Page 48: ليست هاي پيوندي

first

curNode

0�A �B C �D �E

پيوندی ليست ابتدای از عنصر حذف

Page 49: ليست هاي پيوندي

first

curNode

0�A �B C �D �E

- ادامه پيوندی ليست از عنصر حذف

first = first first = first link;link;

Page 50: ليست هاي پيوندي

first 0�B C �D �E

- پيوندی ليست ابتدای از عنصر حذفادامه

deletedelete cur; cur;

Page 51: ليست هاي پيوندي

first

curNode

0�A �B C �D �E

- ادامه پيوندی ليست از عنصر حذف

temp

Node *temp = first;Node *temp = first;

Page 52: ليست هاي پيوندي

first

curNode

0�A �B C �D �E

- ادامه پيوندی ليست از عنصر حذف

temp

whilewhile( temp ( temp link != cur) link != cur) temp = temp temp = temp link; link;

Page 53: ليست هاي پيوندي

first

curNode

0�A �B C �D �E

- ادامه پيوندی ليست از عنصر حذف

temp

whilewhile( temp ( temp link != cur) link != cur) temp = temp temp = temp link; link;

Page 54: ليست هاي پيوندي

- ادامه پيوندی ليست از عنصر حذف

first

curNode

0�A �B C �D �E

temp

temp temp link = cur link = cur link; link;

Page 55: ليست هاي پيوندي

- ادامه پيوندی ليست از عنصر حذف

deletedelete cur; cur;

first 0�A �B �D �E

temp

Page 56: ليست هاي پيوندي

template <class Type>void ListNode<Type> :: Delete( Node *cur){

if( cur == first ){

first = first link;delete cur;return ;

} Node *temp = first;while( temp link != cur)

temp = temp link;temp link = cur link;delete cur;

}

- ادامه پيوندی ليست از عنصر حذف

Page 57: ليست هاي پيوندي

سواالت

. نماييد برعكس را ليست يك عناصر بخش 3سوال تمرينات 3-4از ( يك ( و كنيد متصل بهم را پيوندي ليست زنجير دو

. كنيد توليد زنجير. كنيد اضافه ليست انتهاي به را عنصري

Page 58: ليست هاي پيوندي

حلقوی های ليست

می گره اولين به گره آخرين اتصال ی وسيله به. کرد توليد را حلقوی ليست توان

آخر از توان می راحتی به ها ليست گونه اين در. کرد پرش ليست اول به ليست

Page 59: ليست هاي پيوندي

حلقوی ليست از ای نمونه

first �A �B C �D �E

Page 60: ليست هاي پيوندي

حلقوی ليست عملکردهای

انجام معمولی ليست روی که را کارهايی بيشترانجام حلقوی ليست روی توانيم می داديم می

دهيم. ليست تغييرات از بعد .،بايد بماند حلقوی

Page 61: ليست هاي پيوندي

حلقوی نمايشليست

void ListNode :: Print(){

if( !first ) return; //no node

Node *temp = first;

while(temp link != first)//traverse list{

cout << temp data;temp = temp link; //next node

}}

Page 62: ليست هاي پيوندي

جديد عنصر کردن اضافه

يک از بعد جديد عنصر کردن اضافه برای که تابعینيز جا اين شد گفته ساده ليست برای خاص عنصر

. دارد کاربرد بايد ليست ابتدای به عنصر کردن اضافه برای اما

. شود نوشته جديد تابعیجديد – گر اشاره .lastيک كند آخراشاره عنصر به–. کرد پيمايش عنصر آخرين کردن پيدا برای را ليست

Page 63: ليست هاي پيوندي

حلقوي ليست ابتدای به کردن اضافه

void InsertFirst(Node * newNode){

if( !last ) //no node{

last = first = newNode;first link = first;

}else{

newNode link = first;last link = newNode;first = newNode;

}}

Page 64: ليست هاي پيوندي

- حلقوی ليست ابتدای به کردن اضافهادامه

void InsertFirst)Node * newNode({

if) !first ( //no node{

first = newNode;first link = first;

}else{

newNode link = first;Node *temp = first;while)temp link != first( temp = temp link;temp link = newNode;first = newNode;

}}

Page 65: ليست هاي پيوندي

پيوندی های پشته

پياده را استراتژی اين پيوندی ليست از استفاده با. کنیم سازی

داده خروج و ورود پشته در دانید می که طور همين. شود می انجام طرف يک از ها

top 0

Page 66: ليست هاي پيوندي

تعريفکالسپشته

class Stack{

public :Stack() {top = 0;};void Push( int );int Pop();

private:StackNode *top;

};class StackNode{

friend class stack;private:

int data;StackNode * link;StackNode(int d = 0,StackNode *li = 0):data(d),link(li){};

};

Page 67: ليست هاي پيوندي

پشته در درج

void Push(int newElement)

{

top = new StackNode(newElement , top);

}

top A

E

D C B 0

top B AE D C 0

Page 68: ليست هاي پيوندي

top B AE D C 0

temp

پشته از حذف

temp = top;

Page 69: ليست هاي پيوندي

top B AE D C 0

temp

top B AE D C 0

temp

- ادامه پشته از حذف

top = temp link;

Page 70: ليست هاي پيوندي

top B AE D C 0

temp

top B AE D C 0

temp

top AD C B 0

- ادامه پشته از حذف

deletedelete temp; temp;

Page 71: ليست هاي پيوندي

int Stack :: Pop(){

if( !top ){cout << “empty stack”; return -1;}StackNode *temp = top;int retVal = temp data;top = top link;delete temp;return retVal;

}

- ادامه پشته از حذف

Page 72: ليست هاي پيوندي

پيوندی های صف

اطالعات ورود صف استراتژی در دانيد می که طور همان. است ديگر طرف از اطالعات خروج و طرف يک از

های نام به گر اشاره دو به دليل اين نياز frontو rearبهداريم.

front

0

rear

Page 73: ليست هاي پيوندي

پيوندی تعريفکالسصف

class QueueNode{

friend class Queue;private :

int data;QueueNode * link;QueueNode(int d = 0,QueueNode *li = 0): data(d) , link(li){};

};class Queue{

public :Queue() {front = rear = 0;}void AddQ( int );int DelQ();

private:QueueNode *rear , *front;

};

Page 74: ليست هاي پيوندي

- در درج پيوندی صف به جديد عنصر کردن اضافهانتها

void Queue :: AddQ( int newElement){

if( !front ) front = rear = new QueueNode( newElement , 0);else rear = rear link = new QueueNode( newElement, 0);

}

front 0 rearA B C D E

front 0 rearA B C D E

0

Page 75: ليست هاي پيوندي

ابتدا – از حذف پيوندی يکصف از حذف

int Queue :: DelQ()

{

if( !front ){cout << “empty queue.”; return;}

QueueNode *temp = front;

int retVal = front data;

front = front link;

delete temp;

return retVal;

}

Page 76: ليست هاي پيوندي

نويسي برنامه پروژه

10سوال ] بخش ] تمرينات نويسي برنامه 8-4پروژه

:قسمت .8-4نكته شود خوانده كامل طور به بايستي( خلوت( ماتريس

Page 77: ليست هاي پيوندي

دوگانه پيوندی های ليست

گره به دسترسي عدم طرفه يک های ليست اساسی مشکلقبلی

ی گره به گر اشاره يک کردن اضافه با دوگانه های ليست. است كرده حل را مشكل اين قبلی

Page 78: ليست هاي پيوندي

0

A B C D E

0

first

A B C D E

first

ساده ی دوطرفه ليست

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

دوگانه پيوندی های ليست انواع

Page 79: ليست هاي پيوندي

دوطرفه تعريفکالسليست

class DblListNode{

friend class DblList;private:

int data;DblListNode * next, *pre;

};class DblList{

public ://operations

private:DblListNode *first;

};

Page 80: ليست هاي پيوندي

دوطرفه ليست به عنصر کردن اضافهساده

0

A B D E

0

first

C

cur

newEle

next

pre

Page 81: ليست هاي پيوندي

newEle newEle next = cur next = cur next; next;

0

A B D E

0

first

C

cur

newEle

دوطرفه ليست به عنصر کردن اضافهادامه- ساده

Page 82: ليست هاي پيوندي

cur cur next = newEle; next = newEle;

0

A B D E

0

first

C

cur

newEle

دوطرفه ليست به عنصر کردن اضافهادامه- ساده

Page 83: ليست هاي پيوندي

cur cur next = newEle; next = newEle;

0

A B D E

0

first

C

cur

newEle

دوطرفه ليست به عنصر کردن اضافهادامه- ساده

Page 84: ليست هاي پيوندي

(newEle (newEle next) next) pre = newEle; pre = newEle;

0

A B D E

0

first

C

cur

newEle

دوطرفه ليست به عنصر کردن اضافهادامه- ساده

Page 85: ليست هاي پيوندي

0

A B C Dfirst E

0

cur newEle

دوطرفه ليست به عنصر کردن اضافهادامه- ساده

Page 86: ليست هاي پيوندي

سوال

عنصر بخواهيم ليست newEleاگر ابتداي به راكنيم؟ اضافه

عنصر بخواهيم ليست newEleاگر انتهاي به راكنيم؟ اضافه

باشد؟ خالي ليست اگر

Page 87: ليست هاي پيوندي

ساده دوطرفه لKست به عنصر کردن اضافه

void DblList :: Insert(DblListNode *cur,DblListNode *newEle)

{

newEle next = cur next;

newEle pre = cur;

cur next = newEle;

if(newEle next)

(newEle next) pre = newEle;

}

Page 88: ليست هاي پيوندي

0

A B C Dfirst E

0

cur

ساده دوطرفه ليست از حذف

Page 89: ليست هاي پيوندي

A

0

B C Dfirst

0

E

cur

( cur ( cur next ) next ) pre = cur pre = cur pre; pre;

ادامه - ساده دوطرفه ليست از حذف

Page 90: ليست هاي پيوندي

( cur ( cur pre ) pre ) next = cur next = cur next; next;

0

A B C Dfirst E

0

cur

- ادامه ساده دوطرفه ليست از حذف

Page 91: ليست هاي پيوندي

( cur ( cur pre ) pre ) next = cur next = cur next; next;

0

A

next

pre

B

next

pre

D

next

first

pre

E

0

ساده - دوطرفه ليست از حذفادامه

Page 92: ليست هاي پيوندي

0

A

next

pre

B

next

pre

D

next

firstpre

E

0

ادامه - ساده دوطرفه لLيست از حذف

Page 93: ليست هاي پيوندي

سوال

كنيم؟ حذف را ليست ابتداي عنصر بخواهيم اگر كنيم؟ حذف را ليست ابتداي عنصر بخواهيم اگر

باشد؟ خالي ليست اگر

Page 94: ليست هاي پيوندي

ساده دوطرفه ليست از حذف

void DblList :: Delete( Node * cur){

if( cur next){

( cur next ) pre = cur pre;( cur pre ) next = cur next;delete cur;return;

}( cur --> pre ) --> next = 0;delete cur;

}

Page 95: ليست هاي پيوندي

ساده دوطرفه ليست ابتدای از حذف

void DblList :: Delete(DblListNode *cur){

if( cur == first ){

Node *temp = first ;if( !first --> next ){

delete first;return;

}first = first --> next;first --> pre = 0;delete temp;return;

}}

Page 96: ليست هاي پيوندي

بعدی مباحث

حلقوي طرفه دو ليست ص يافته تعميم 216ليستهاي

Page 97: ليست هاي پيوندي

سواالت

ی طرفه دو ليست انتهای در عنصر درج الگوريتمحلقوی؟

ساده؟ ی طرفه دو ليست کردن معکوس الگوريتم ی طرفه دو ليست کردن معکوس الگوريتم

حلقوی؟