Upload
bryony
View
40
Download
5
Embed Size (px)
DESCRIPTION
ليست هاي پيوندي. تعريف ليست پيوندي Link List. تعريف : مجموعه ای از گره ها که هرگره حداقل شامل يک فيلد داده ويک فيلد اشاره گر است. اشاره گر هر گره از نوع خود گره است. هر گره به وسيله ی اشاره گر خود به گره بعدی اشاره می کند. B. Z. A. 0. نقا يص کار با آرا يه ها به صورت ترت يب ی. - PowerPoint PPT Presentation
Citation preview
پيوندي هاي ليست
پيوندي ليست 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ليستهاي
سواالت
ی طرفه دو ليست انتهای در عنصر درج الگوريتمحلقوی؟
ساده؟ ی طرفه دو ليست کردن معکوس الگوريتم ی طرفه دو ليست کردن معکوس الگوريتم
حلقوی؟