650 likes | 825 Views
Danh saùch lieân keát. Ñònh nghóa danh saùch lieân keát. Danh sách liên kết là một danh sách mà các phần tử được nối với nhau nhờ vào các vùng liên kết của chúng. Mỗi một phần tử của danh sách liên kết có 2 thành phần chính: thành phần thứ nhất là một vùng chứa thông tin, gọi là vùng info.
E N D
Ñònh nghóa danh saùch lieân keát • Danh sách liên kết là một danh sách mà các phần tử được nối với nhau nhờ vào các vùng liên kết của chúng. • Mỗi một phần tử của danh sách liên kết có 2 thành phần chính: thành phần thứ nhất là một vùng chứa thông tin, gọi là vùng info. thành phần thứ hai gồm có từ 1 đến nhiều vùng dùng để chứa địa chỉ gọi là vùng liên kết (link).
Caùc loaïi danh saùch lieân keát Coù nhieàu kieåu toå chöùc lieân keát giöõa caùc phaàn töû trong danh saùch nhö :Danh saùch lieân keát ñônDanh saùch lieân keát keùpDanh saùch lieân keát voøng …
A B X Z Y D A B C Caùc loaïi danh saùch lieân keát Danh saùch lieân keát ñôn: moãi phaàn töû lieân keát vôùi phaàn töû ñöùng sau noù trong danh saùch: Danh saùch lieân keát keùp: moãi phaàn töû lieân keát vôùi caùc phaàn töû ñöùng tröôùc vaø sau noù trong danh saùch:
A B C A B X Z Y D Caùc loaïi danh saùch lieân keát Danh saùch lieân keát voøng : phaàn töû cuoái danh saùch lieân keát vôùi phaàn töû ñaàu danh saùch:
Danh saùch lieân keát ñôn Moãi phaàn töû cuûa danh saùch ñôn gồm 2 thaønh phaàn : Thaønh phaàn döõ lieäu: löu tröõ caùc thoâng tin veà baûn thaân phaàn töû . Thaønh phaàn moái lieân keát: löu tröõ ñòa chæ cuûa phaàn töû keá tieáp trong danh saùch, hoaëc löu tröõ giaù trò NULL neáu laø phaàn töû cuoái danh saùch.
Khai baùo kieåu cuûa moät phaàn töû // kieåu cuûa moät phaàn töû trong danh saùch Struct Node { Data info; // Data laø kieåu ñaõ ñònh nghóa tröôùc Node *pNext; //con troû chæ ñeán caáu truùc NODE };
Khai baùo kieåu cuûa danh saùch lieân keát // kieåu cuûa danh saùch lieân keát Struct List { Node *Head; Node*Tail; };
Ví dụ: danh saùch lieân keát coù caùc phaàn töû laø kieåu soá nguyeân. Struct Node { int info; Node *pNext; }; Node *Head,*Tail,*p;
Toå chöùc, quaûn lyù caùc phaàn töû trong danh saùch lieân keát • Moät phaàn töû trong danh saùch ñôn laø moät bieán ñoäng seõ ñöôïc yeâu caàu caáp phaùt khi caàn. Vaø danh saùch ñôn chính laø söï lieân keát caùc bieán ñoäng naøy vôùi nhau do vaäy ñaït ñöôïc söï linh ñoäng khi thay ñoåi soá löôïng caùc phaàn töû. • Neáu bieát ñöôïc phaàn töû ñaàu tieân trong danh saùch ñôn thì ta coù theå döïa vaøo thoâng tin pNext cuûa noù ñeå truy xuaát ñeán phaàn töû thöù 2 trong xaâu vaø döa vaøo thoâng tin pNext cuûa phaàn töû thöù 2 ñeå truy xuaát ñeán phaàn töû thöù 3…. Nghóa laø ñeå quaûn lyù 1 xaâu ñôn chæ caàn bieát phaàn töû ñaàu xaâu.
Toå chöùc, quaûn lyù caùc phaàn töû trong danh saùch lieân keát • Con troû Head seõ ñöôïc duøng ñeå löu tröõ ñòa chæ phaàn töû ñaàu xaâu, ta goïi Head laø ñaàu xaâu. Ta coù khai baùo: Node *Head; • Ñeå tieän lôïi, coù theå söû duïng theâm moät con troû Tail giöõ ñòa chæ phaàn töû cuoái xaâu. Khai baùo Tail nhö sau: Node *Tail;
A B X Z Y Tail Head Toå chöùc, quaûn lyù caùc phaàn töû trong danh saùch lieân keát • Luùc naøy ta coù xaâu ñôn:
Danh saùch lieân keát kieåu FIFO(first in first out) • Danh saùch lieân keát kieåu FIFO laø moät danh saùch maø caùc phaàn töû nhaäp vaøo tröôùc seõ ñöôïc xuaát ra tröôùc. • Danh saùch lieân keát kieåu FIFO coù bieán chæ ñieåm ñaàu head vaø bieán chæ ñieåm cuoái tail. Phaàn töû môùi theâm vaøo ñöôïc noái vaøo cuoái danh saùch qua con troû tail, phaàn töû cuõ ñöôïc laáy ra töø ñaàu danh saùch do con troû head ñang troû tôùi.
A B X Z Y Tail Head Danh saùch lieân keát kieåu FIFO(first in first out) • Moâ hình: pNext info
Taïo danh saùch kieåu FIFO struct Node { int info; Node *pNext; }; Struct List { Node *Head; Node*Tail; } Node *Head,*Tail,*p; List l; void tao_ds_FIFO(List &l) { char kt; int x; l.Head=l.Tail=NULL;// khôûi taïo danh saùch roãng
Taïo danh saùch kieåu FIFO do { cout<<"nhap vao phan tu cua danh sach\n"; cin>>x; if(l.Head= =NULL) { l.Head=new Node; l.Tail=l.Head; } else { l.Tail->pNext=new Node; l.Tail=l.Tail->pNext; }
Taïo danh saùch kieåu FIFO l.Tail->info = x; l.Tail->pNext = NULL; cout<<"de tiep tuc nhap du lieu ban nhan:'y'\n"; cin>>kt; } while(kt=='y');
Danh saùch lieân keát kieåu LIFO(last in first out) Danh saùch lieân keát kieåu LIFO laø moät danh saùch maø caùc phaàn töû nhaäp vaøo sau seõ ñöôïc xuaát ra tröôùc. Danh saùch lieân keát kieåu LIFO coù bieán chæ ñieåm top. Phaàn töû môùi theâm vaøo ñöôïc noái vaøo ñænh cuûa danh saùch qua con troû top, phaàn töû cuõ ñöôïc laáy ra cuõng töø ñænh cuûa danh saùch do con troû top ñang troû ñeán.
Danh saùch lieân keát kieåu LIFO(last in first out) Moâ hình: top info n pNext info 2 pNext info 1 pNext
Taïo danh saùch kieåu LIFO struct Node { char info[10]; Node *pNext; }; Struct List { Node *top; }; Node *top,*p; List l; void tao_ds_LIFO(List &l)
Taïo danh saùch kieåu LIFO { char kt; char x[10]; l.top=NULL;//khoi_tao_danh_sach roãng do { cout<<"nhap vao phan tu cua danh sach\n"; cin>>x; if(l.top= =NULL) { p=new Node; p->pNext=NULL; }
Taïo danh saùch kieåu LIFO else { p=new Node; p->pNext=top; } strcpy(p->info,x); l.top=p; cout<<"de tiep tuc nhap du lieu ban nhan:'y'\n"; cin>>kt; } while(kt=='y');
Xuaát danh saùch void xuat_ds(List&l) {Node *p; //gaùn p=l.head neáu danh saùch kieåu FIFO //gaùn p=l.top neáu danh saùch kieåu LIFO cout<<"cac phan tu cua danh sach la:\n"; while(p!=NULL) { cout<<p->info<<"\n"; p=p->pNext; } }
Taïo moät phaàn töû cho danh saùch Haøm GetNodeñeå taïo ra moät phaàn töû cho danh saùch vôùi thoâng tin chöùa trong x Node *GetNode(Data x) { Node *p; p = new NODE;// Caáp phaùt vuøng nhôù cho phaàn töû if (p==NULL) cout<<("Khoâng ñuû boä nhôù"); return NULL; p->info = x; // Gaùn thoâng tin cho phaàn töû p p->pNext = NULL; return p; }
Taïo moät phaàn töû cho danh saùch Ñeå taïo moät phaàn töû môùi cho danh saùch, caàn thöïc hieän caâu leänh: new_ele = GetNode(x); new_ele seõ quaûn lyù ñòa chæ cuûa phaàn töû môùi ñöôïc taïo.
Caùc thao taùc cô baûn treân danh saùch ñôn • Taïo danh saùch roãng • Theâm moät phaàn töû vaøo danh saùch • Tìm kieám moät giaù trò treân danh saùch • Huyû moät phaàn töû ra khoûi danh saùch • Duyeät danh saùch • Huûy toaøn boä danh saùch
Khôûi taïo danh saùch roãng void Init(List&l) { l.Head=l.Tail = NULL; } Tail Head
Theâm moät phaàn töû vaøo danh saùch Ba vò trí theâm phaàn töû môùi vaøo danh saùch: • Theâm vaøo ñaàu danh saùch • Theâm vaøo cuoái danh saùch • Theâm vaøo danh saùch sau moät phaàn töû q
X A Theâm moät phaàn töû vaøo ñaàu danh saùch Tail Head B C D E new_ele
Theâm moät phaàn töû vaøo ñaàu danh saùch Giaûi thuaät: //input: danh saùch (head, tail), phaàn töû môùi new_ele //output:danh saùch (head, tail) vôùi new_ele ôû ñaàu danh saùch • Neáu Danh saùch roãng thì • l.Head = new_ele; • l.Tail = l.Head; • Ngöôïc laïi • new_ele ->pNext = l.Head; • l.Head = new_ele ;
Theâm moät phaàn töû vaøo ñaàu danh saùch Caøi ñaët: void AddFirst(List&l , Node *new_ele) { if (l.Head = = NULL) //Xaâu roãng { l.Head = new_ele; l.Tail = l.Head; } else { new_ele->pNext = l.Head; l.Head = new_ele; } }
X A Theâm moät phaàn töû vaøo cuối danh saùch Tail Head B C D E new_ele
Theâm moät phaàn töû vaøo cuối danh saùch Giaûi thuaät: //input: danh saùch (head, tail), phaàn töû môùi new_ele //output: danh saùch (head, tail) vôùi new_ele ôû cuối danh saùch • Neáu Danh saùch roãng thì • l.Head = new_ele; • l.Tail = l.Head; • Ngöôïc laïi • l.Tail->pNext = new_ele ; • l.Tail = new_ele ;
Theâm moät phaàn töû vaøo cuối danh saùch Caøi ñaët: void AddTail(List&l , Node *new_ele) { if (l.Head= =NULL) { l.Head = new_ele; l.Tail = l.Head; } else { l.Tail->pNext = new_ele; l.Tail = new_ele; } }
X A Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q q Tail Head B C D E new_ele
Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q Giaûi thuaät: //input: danh saùch (head, tail), q, phaàn töû môùi new_ele //output: danh saùch (head, tail) vôùi new_ele ôû sau q Neáu ( q != NULL) thì new_ele -> pNext = q -> pNext; q -> pNext = new_ele ; Neáu ( q = = l.Tail) thì l.Tail = new_ele; Ngöôïc laïi Theâm new_ele vaøo ñaàu danh saùch
Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q Caøi ñaët: void AddAfter(List&l , Node *q , Node *new_ele) { if (q!=NULL) { new_ele->pNext = q->pNext; q->pNext = new_ele; if(q = = l.Tail) l.Tail = new_ele; } else // theâm vaøo ñaàu danh saùch AddFirst(l , new_ele); }
STOP Ok, found Tìm moät phaàn töû trong danh saùch p Tail Head A B C D E C X
Tìm moät phaàn töû trong danh saùch Giaûi thuaät: //input: danh saùch (head, tail), döõ lieäu caàn tìm X //output: ñòa chæ phaàn töû chöùa X • Böôùc 1: • p = l.Head; //Cho p troû ñeán phaàn töû ñaàu danh saùch • Böôùc 2: Trong khi (p != NULL) vaø (p->Info != x ) thöïc hieän: • B21 : p = p->Next;// Cho p troû tôùi phaàn töû keá • Böôùc 3: • Neáu p != NULL thì p troû tôùi phaàn töû caàn tìm • Ngöôïc laïi: khoâng coù phaàn töû caàn tìm.
Tìm moät phaàn töû trong danh saùch Caøi ñaët: Node *Search(List&l , Data X) { Node *p; p = l.Head; while((p!= NULL)&&(p->Info != X)) p = p->pNext; return p; }
Huyû moät phaàn töû ra khoûi danh saùch Ba tröôøng hôïp loaïi boû 1 phaàn töû ra khoûi danh saùch: • Huyû phaàn töû ñaàu • Huyû phaàn töû sau moät phaàn töû q • Huyû phaàn töû coù khoaù k • Löu yù: khi caáp phaùt boä nhôù chuùng ta duøng haøm new. Vì vaäy khi giaûi phoùng boä nhôù chuùng ta duøng haøm delete.
Huyû phaàn töû ñaàu xaâu Tail Head A B C D E
Huûy phaàn töû ñaàu xaâu Giaûi thuaät: Neáu l.Head !=NULL thì p=l.Head;//p laø phaàn töû caàn huyû l.Head=l.Head->pNext;//taùch p ra khoûi xaâu delete p// huyû bieán ñoäng do p troû ñeán Ngöôïc laïi l.Tail=NULL;// xaâu roãng
Huûy phaàn töû ñaàu xaâu Caøi ñaët: Data RemoveHead(List&l) { Node *p; Data x = NULLDATA; if (l.Head != NULL) { p= l.Head; x= p->info; l.Head= l.Head->pNext; delete p; }else l.Tail = NULL; return x; }
Huûy phaàn töû sau moät phaàn töû q q Tail Head A B C D E
Huûy phaàn töû sau moät phaàn töû q Giaûi thuaät: //input: xaâu (head, tail), con troû q //output: xaâu ñaõ bò huyû phaàn töû sau phaàn töû q • Neáu (q!= NULL) thì • p = q->pNext; // p laø phaàn töû caàn huûy • Neáu (p != NULL) thì // q khoâng phaûi laø cuoái xaâu • Neáu (p= =l.Tail) thì l.Tail = q; • q->pNext = p->pNext; // taùch p ra khoûi xaâu • deletep; • Ngöôïc laïi: • Huyû phaàn töû ñaàu xaâu
Huûy phaàn töû sau moät phaàn töû q Caøi ñaët: void RemoveAfter (List&l , Node *q) { Node *p; if ( q != NULL) { p = q ->pNext ; if ( p != NULL) { if (p = = Tail) Tail = q; q->pNext = p->pNext; delete p; } } else RemoveHead(l); }
STOP Ok, found Huûy phaàn töû coù khoaù k q p Tail Head A B C D E C K
Huûy phaàn töû coù khoaù k Giaûi thuaät: //input: xaâu (head, tail), khoùa k //output: xaâu ñaõ huyû phaàn töû coù khoùa k • Böôùc 1: • Tìm phaàn töû p coù khoùa k vaø phaàn töû q ñöùng tröôùc noù • Böôùc 2: • Neáu (p!= NULL) thì // tìm thaáy k • Huyû p ra khoûi xaâu töông töï huyû phaàn töû sau q; • Ngöôïc laïi • Baùo khoâng coù k;
Huûy phaàn töû coù khoaù k Caøi ñaët: int RemoveNode(List&l , Data k) { Node *p = l.Head; Node *q = NULL; while ((p != NULL) && (p->Info != k)) { q = p; p = p->pNext; }; if(p!= NULL) { RemoveAfter(l , q); return 1} else return 0; }