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

Post on 20-Jan-2016

39 views 5 download

description

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

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

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

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

AA . . .. . . 0ZZBB

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

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

. کند می اشاره

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

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

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

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

A B D E F

0 1 2 3 4 5

Shift

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

A B C D E F

0 1 2 3 4 5

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

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

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

A B C D E F

0 1 2 3 4 5

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

shift

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

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

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

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

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

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

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

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

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

و- ...

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

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

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

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

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

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

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

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

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

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]

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]

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

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]

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

-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

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

-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

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

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]

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

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

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

جديد

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

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

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

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

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

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

classclass CharNode CharNode

{{

privateprivate ::

charchar data data;;

CharNode CharNode **linklink;;

};};

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

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

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

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

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

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

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

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

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

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

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

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

class List{

public ://list manipulation operations

private:Node * first;

};class Node{

friend class List;private :

char data;Node * link;

};

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

ListList

firstfirst AA BB NN. . .. . . 00

NodeNode

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

ListList

firstfirst ......AA BB NN 00

NodeNode

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

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

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

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

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

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

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

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

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

void List :: InsertFirst ()

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

t link = first;

first = t;

}

AA

BB CCfirst

AA

BB CCfirst AA

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

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

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

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

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;

};

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

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

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

first

temp

�A �B C �D

Output : A

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

first

temp

�A �B C �D

first

temp

�A �B C �D

Output : A B

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

first

temp

�A �B C �D

first

temp

�A �B C �D

first

temp

�A �B C �D

Output : A B C

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

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

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

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

void ListNode :: Print(){

if( !first ) return; //no node

Node *temp = first;

while(temp) //traverse list{

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

}}

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

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

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

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

first

curNode

0

0newNode

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

first

curNode

0

newNode

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

C

BA D E

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

first

curNode

0

newNode

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

A B D E

C

curNode curNode link = newNode ; link = newNode ;

first

curNode

0

newNode

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

A B C D E

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

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

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

}

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

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

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

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

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

first 0

0

newNode

A

B C D E

first 0

newNode

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

A

B C D E

newNode newNode link = first; link = first;

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

first 0

newNode

EDCB

A

first = newNode;first = newNode;

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

first

newNode

0A B C D E

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

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;

}

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

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

first

curNode

0�A �B C �D �E

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

first

curNode

0�A �B C �D �E

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

first = first first = first link;link;

first 0�B C �D �E

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

deletedelete cur; cur;

first

curNode

0�A �B C �D �E

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

temp

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

first

curNode

0�A �B C �D �E

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

temp

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

first

curNode

0�A �B C �D �E

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

temp

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

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

first

curNode

0�A �B C �D �E

temp

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

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

deletedelete cur; cur;

first 0�A �B �D �E

temp

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;

}

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

سواالت

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

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

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

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

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

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

first �A �B C �D �E

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

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

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

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

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

}}

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

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

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

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

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

void InsertFirst(Node * newNode){

if( !last ) //no node{

last = first = newNode;first link = first;

}else{

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

}}

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

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;

}}

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

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

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

top 0

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

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){};

};

پشته در درج

void Push(int newElement)

{

top = new StackNode(newElement , top);

}

top A

E

D C B 0

top B AE D C 0

top B AE D C 0

temp

پشته از حذف

temp = top;

top B AE D C 0

temp

top B AE D C 0

temp

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

top = temp link;

top B AE D C 0

temp

top B AE D C 0

temp

top AD C B 0

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

deletedelete temp; temp;

int Stack :: Pop(){

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

}

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

پيوندی های صف

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

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

front

0

rear

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

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;

};

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

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

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

int Queue :: DelQ()

{

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

QueueNode *temp = front;

int retVal = front data;

front = front link;

delete temp;

return retVal;

}

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

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

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

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

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

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

0

A B C D E

0

first

A B C D E

first

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

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

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

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

class DblListNode{

friend class DblList;private:

int data;DblListNode * next, *pre;

};class DblList{

public ://operations

private:DblListNode *first;

};

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

0

A B D E

0

first

C

cur

newEle

next

pre

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

0

A B D E

0

first

C

cur

newEle

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

cur cur next = newEle; next = newEle;

0

A B D E

0

first

C

cur

newEle

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

cur cur next = newEle; next = newEle;

0

A B D E

0

first

C

cur

newEle

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

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

0

A B D E

0

first

C

cur

newEle

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

0

A B C Dfirst E

0

cur newEle

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

سوال

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

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

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

ساده دوطرفه ل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;

}

0

A B C Dfirst E

0

cur

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

A

0

B C Dfirst

0

E

cur

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

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

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

0

A B C Dfirst E

0

cur

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

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

0

A

next

pre

B

next

pre

D

next

first

pre

E

0

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

0

A

next

pre

B

next

pre

D

next

firstpre

E

0

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

سوال

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

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

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

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;

}

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

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;

}}

بعدی مباحث

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

سواالت

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

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

حلقوی؟