danh saùch lieân keát

65

Upload: blair-barton

Post on 02-Jan-2016

44 views

Category:

Documents


1 download

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Danh saùch lieân keát
Page 2: Danh saùch lieân keát

Ñònh nghóa 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 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.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 Mỗi một phần tử của danh sách liên kết có 2 thành phần chính:chính:

thành phần thứ nhất là một vùng chứa thông tin, thành phần thứ nhất là một vùng chứa thông tin, gọi là vùng info.gọi là vùng info.

thành phần thứ hai gồm có từ 1 đến nhiều vùng 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).dùng để chứa địa chỉ gọi là vùng liên kết (link).

Page 3: Danh saùch lieân keát

Caùc loaïi danh saùch Caùc loaïi danh saùch lieân keátlieân keát

Coù nhieàu kieåu toå chöùc 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 giöõa caùc phaàn töû trong danh saùch nhö :nhö :

Danh saùch lieân keát ñônDanh saùch lieân keát ñôn Danh saùch lieân keát keùpDanh saùch lieân keát keùp Danh saùch lieân keát voøngDanh saùch lieân keát voøng ……

Page 4: Danh saùch lieân keát

Caùc loaïi danh saùch Caùc loaïi danh saùch lieân keátlieân keát

Danh saùch lieân keát ñôn:Danh saùch lieân keát ñôn: moãi phaàn töû moãi phaàn töû lieân keát vôùi phaàn töû ñöùng sau noù trong lieân keát vôùi phaàn töû ñöùng sau noù trong

danh saùch:danh saùch:

Danh saùch lieân keát keùp:Danh saùch lieân keát keùp: moãi phaàn töû moãi phaàn töû lieân keát vôùi caùc phaàn töû ñöùng tröôùc vaø lieân keát vôùi caùc phaàn töû ñöùng tröôùc vaø

sau noù trong danh saùch:sau noù trong danh saùch:

A B X Z Y

A B C D

Page 5: Danh saùch lieân keát

Caùc loaïi danh saùch Caùc loaïi danh saùch lieân keátlieân keát

Danh saùch lieân keát voøng :Danh saùch lieân keát voøng : phaàn töû phaàn töû cuoái danh saùch lieân keát vôùi phaàn töû ñaàu cuoái danh saùch lieân keát vôùi phaàn töû ñaàu

danh saùch:danh saùch:

A B X Z Y

A B C D

Page 6: Danh saùch lieân keát

Danh saùch lieân keát Danh saùch lieân keát ñônñôn

Moãi phaàn töû cuûa danh saùch ñôn gồm 2 Moãi phaàn töû cuûa danh saùch ñôn gồm 2 thaønh phaàn :thaønh phaàn :

Thaønh phaàn döõ lieäuThaønh phaàn döõ lieäu: löu tröõ caùc : löu tröõ caùc thoâng tin veà baûn thaân phaàn töû .thoâng tin veà baûn thaân phaàn töû .

Thaønh phaàn moái lieân keátThaønh phaàn moái lieân keát: löu tröõ : löu tröõ ñòa chæ cuûa phaàn töû keá tieáp trong ñòa chæ cuûa phaàn töû keá tieáp trong danh saùch, hoaëc löu tröõ giaù trò NULL danh saùch, hoaëc löu tröõ giaù trò NULL neáu laø phaàn töû cuoái danh saùch.neáu laø phaàn töû cuoái danh saùch.

Page 7: Danh saùch lieân keát

Khai baùo kieåu cuûa moät Khai baùo kieåu cuûa moät phaàn töûphaàn töû

// kieåu cuûa moät phaàn töû trong danh saùch// kieåu cuûa moät phaàn töû trong danh saùch

Struct Node Struct Node

{{

DataData info; info; // Data laø kieåu ñaõ ñònh nghóa // Data laø kieåu ñaõ ñònh nghóa tröôùctröôùc

Node *pNext; Node *pNext; //con troû chæ ñeán caáu truùc //con troû chæ ñeán caáu truùc NODENODE

};};

Page 8: Danh saùch lieân keát

Khai baùo kieåu cuûa danh Khai baùo kieåu cuûa danh saùch lieân keát saùch lieân keát

// kieåu cuûa danh saùch lieân keát// kieåu cuûa danh saùch lieân keát

Struct ListStruct List

{{

Node *Head;Node *Head;

Node*Tail;Node*Tail;

};};

Page 9: Danh saùch lieân keát

Ví dụ:Ví dụ:

danh saùch lieân keát coù caùc phaàn töû danh saùch lieân keát coù caùc phaàn töû laø kieåu soá nguyeân.laø kieåu soá nguyeân.

Struct NodeStruct Node

{{

int info;int info;

Node *pNext;Node *pNext;

};};

Node *Head,*Tail,*p;Node *Head,*Tail,*p;

Page 10: Danh saùch lieân keát

Moät phaàn töû trong danh saùch ñôn laø moät bieán 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ø ñ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 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 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öû.ñ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 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 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 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öû 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…. 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 Nghóa laø ñeå quaûn lyù 1 xaâu ñôn chæ caàn bieát phaàn töû ñaàu xaâu.phaàn töû ñaàu xaâu.

Toå chöùc, quaûn lyù caùc phaàn Toå chöùc, quaûn lyù caùc phaàn

töû trong danh saùch lieân keáttöû trong danh saùch lieân keát

Page 11: Danh saùch lieân keát

Toå chöùc, quaûn lyù caùc phaàn Toå chöùc, quaûn lyù caùc phaàn töû trong danh saùch lieân keáttöû trong danh saùch lieân keát

Con troû Con troû HeadHead seõ ñöôïc duøng ñeå löu tröõ ñòa seõ ñöôïc duøng ñeå löu tröõ ñòa chæ phaàn töû ñaàu xaâu, ta goïi chæ phaàn töû ñaàu xaâu, ta goïi HeadHead laø ñaàu laø ñaàu xaâu. Ta coù khai baùo:xaâu. Ta coù khai baùo:

Node *Head;Node *Head;

Ñeå tieän lôïi, coù theå söû duïng theâm moät Ñeå tieän lôïi, coù theå söû duïng theâm moät con troû con troû TailTail giöõ ñòa chæ phaàn töû cuoái xaâu. giöõ ñòa chæ phaàn töû cuoái xaâu. Khai baùo Khai baùo TailTail nhö sau: nhö sau:

Node *Tail;Node *Tail;

Page 12: Danh saùch lieân keát

Toå chöùc, quaûn lyù caùc phaàn Toå chöùc, quaûn lyù caùc phaàn töû trong danh saùch lieân keáttöû trong danh saùch lieân keát

Luùc naøy ta coù xaâu ñôn:Luùc naøy ta coù xaâu ñôn:

A B X Z YHead

Tail

Page 13: Danh saùch lieân keát

Danh saùch lieân keát kieåu Danh saùch lieân keát kieåu FIFO(first in first out)FIFO(first in first out)

Danh saùch lieân keát kieåu FIFO laø moät 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 danh saùch maø caùc phaàn töû nhaäp vaøo tröôùc seõ ñöôïc xuaát ra tröôùc.seõ ñöôïc xuaát ra tröôùc.

Danh saùch lieân keát kieåu FIFO coù bieán chæ 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. ñ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 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 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 laáy ra töø ñaàu danh saùch do con troû head ñang troû tôùi.troû tôùi.

Page 14: Danh saùch lieân keát

Danh saùch lieân keát kieåu Danh saùch lieân keát kieåu FIFO(first in first out)FIFO(first in first out)

Moâ hình:Moâ hình:

A B X Z YHea

d

Tail

infopNext

Page 15: Danh saùch lieân keát

Taïo danh saùch kieåu FIFOTaïo danh saùch kieåu FIFO

struct Nodestruct Node{{ int info;int info;

Node *pNext;Node *pNext;};};Struct ListStruct List{{ Node *Head;Node *Head;

Node*Tail;Node*Tail;}}Node *Head,*Tail,*p; Node *Head,*Tail,*p; List l;List l;void tao_ds_FIFO(List &l)void tao_ds_FIFO(List &l){{ char kt;char kt;

int x; int x; l.Head=l.Tail=NULL;// khôûi taïo danh saùch l.Head=l.Tail=NULL;// khôûi taïo danh saùch roãngroãng

Page 16: Danh saùch lieân keát

Taïo danh saùch kieåu FIFOTaïo danh saùch kieåu FIFO

dodo{{

cout<<"nhap vao phan tu cua danh sach\cout<<"nhap vao phan tu cua danh sach\n";n";

cin>>x;cin>>x;if(l.Head= =NULL)if(l.Head= =NULL)

{{ l.Head=new Node;l.Head=new Node;l.Tail=l.Head;l.Tail=l.Head;

}}elseelse

{{ l.Tail->pNext=new Node;l.Tail->pNext=new Node;l.Tail=l.Tail->pNext;l.Tail=l.Tail->pNext;

}}

Page 17: Danh saùch lieân keát

Taïo danh saùch kieåu FIFOTaïo danh saùch kieåu FIFO

l.Tail->info = x; l.Tail->info = x;

l.Tail->pNext = NULL;l.Tail->pNext = NULL;

cout<<"de tiep tuc nhap du lieu ban cout<<"de tiep tuc nhap du lieu ban nhan:'y'\n";nhan:'y'\n";

cin>>kt;cin>>kt;

}}

while(kt=='y');while(kt=='y');

Page 18: Danh saùch lieân keát

Danh saùch lieân keát kieåu Danh saùch lieân keát kieåu LIFO(last in first out)LIFO(last in first out)

Danh saùch lieân keát kieåu LIFO laø moät danh 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õ saùch maø caùc phaàn töû nhaäp vaøo sau seõ ñöôïc xuaát ra tröôùc.ñöôïc xuaát ra tröôùc.

Danh saùch lieân keát kieåu LIFO coù bieán chæ 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 ñ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, 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 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 do con troû top ñang troû ñeán.

Page 19: Danh saùch lieân keát

Danh saùch lieân keát kieåu Danh saùch lieân keát kieåu LIFO(last in first out)LIFO(last in first out)

Moâ hình:Moâ hình:

top info n pNext

info 2

info 1

pNext

pNext

Page 20: Danh saùch lieân keát

Taïo danh saùch kieåu LIFOTaïo danh saùch kieåu LIFO

struct Nodestruct Node{{ char info[10];char info[10];

Node *pNext;Node *pNext;};};Struct ListStruct List{{

Node *top;Node *top;};};Node *top,*p;Node *top,*p;List l;List l;void tao_ds_LIFO(List &l)void tao_ds_LIFO(List &l)

Page 21: Danh saùch lieân keát

Taïo danh saùch kieåu LIFOTaïo danh saùch kieåu LIFO

{{ char kt;char kt;char x[10];char x[10];l.top=NULL;//khoi_tao_danh_sach roãngl.top=NULL;//khoi_tao_danh_sach roãngdodo

{ { cout<<"nhap vao phan tu cua danh sach\n";cout<<"nhap vao phan tu cua danh sach\n";cin>>x;cin>>x;if(l.top= =NULL)if(l.top= =NULL)

{{p=new Node;p=new Node;p->pNext=NULL;p->pNext=NULL;

}}

Page 22: Danh saùch lieân keát

Taïo danh saùch kieåu LIFOTaïo danh saùch kieåu LIFO

elseelse

{{ p=new Node;p=new Node;

p->pNext=top;p->pNext=top;

} } strcpy(p->info,x);strcpy(p->info,x);

l.top=p;l.top=p;

cout<<"de tiep tuc nhap du lieu ban cout<<"de tiep tuc nhap du lieu ban nhan:'y'\n"; nhan:'y'\n";

cin>>kt;cin>>kt;

}}

while(kt=='y');while(kt=='y');

Page 23: Danh saùch lieân keát

Xuaát danh saùchXuaát danh saùch

void xuat_ds(List&l)void xuat_ds(List&l){{

Node *p;Node *p;//gaùn p=l.head neáu danh saùch kieåu FIFO//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//gaùn p=l.top neáu danh saùch kieåu LIFOcout<<"cac phan tu cua danh sach la:\n";cout<<"cac phan tu cua danh sach la:\n";while(p!=NULL)while(p!=NULL){{

cout<<p->info<<"\n";cout<<p->info<<"\n";p=p->pNext;p=p->pNext;

}}}}

Page 24: Danh saùch lieân keát

Haøm GetNodeHaøm GetNode ñeå taïo ra moät phaàn töû cho ñeå taïo ra moät phaàn töû cho danh saùch vôùi thoâng tin chöùa trong x danh saùch vôùi thoâng tin chöùa trong x

Node *GetNode(Data x) Node *GetNode(Data x) {{

Node *p;Node *p;p = new NODE;// Caáp phaùt vuøng nhôù p = new NODE;// Caáp phaùt vuøng nhôù cho phaàn töûcho phaàn töûif (p==NULL) if (p==NULL) cout<<("Khoâng ñuû boä nhôù"); return cout<<("Khoâng ñuû boä nhôù"); return NULL; NULL; p->info = x; p->info = x; // Gaùn thoâng tin cho phaàn // Gaùn thoâng tin cho phaàn töû ptöû pp->pNext = NULL;p->pNext = NULL;return p; return p;

}}

Taïo moät phaàn töû cho danh Taïo moät phaàn töû cho danh saùchsaùch

Page 25: Danh saùch lieân keát

Ñeå taïo moät phaàn töû môùi 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: caàn thöïc hieän caâu leänh:

new_ele = GetNode(x);new_ele = GetNode(x);

new_ele seõ quaûn lyù ñòa chæ cuûa phaàn töû new_ele seõ quaûn lyù ñòa chæ cuûa phaàn töû môùi ñöôïc taïo.môùi ñöôïc taïo.

Taïo moät phaàn töû cho danh Taïo moät phaàn töû cho danh saùchsaùch

Page 26: Danh saùch lieân keát

Taïo danh saùch roãngTaïo danh saùch roãng Theâm moät phaàn töû vaøo danh saùchTheâm moät phaàn töû vaøo danh saùch Tìm kieám moät giaù trò treân danh saùchTìm kieám moät giaù trò treân danh saùch Huyû moät phaàn töû ra khoûi danh saùchHuyû moät phaàn töû ra khoûi danh saùch Duyeät danh saùchDuyeät danh saùch Huûy toaøn boä danh saùchHuûy toaøn boä danh saùch

Caùc thao taùc cô baûn treân danh Caùc thao taùc cô baûn treân danh saùch ñônsaùch ñôn

Page 27: Danh saùch lieân keát

void Init(List&l)void Init(List&l){{

l.Head=l.Tail = NULL;l.Head=l.Tail = NULL;}}

Khôûi taïo danh saùch roãngKhôûi taïo danh saùch roãng

Head

Tail

Page 28: Danh saùch lieân keát

Ba vò trí theâm phaàn töû môùi vaøo Ba vò trí theâm phaàn töû môùi vaøo danh saùch: danh saùch: Theâm vaøo ñaàu 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 cuoái danh saùch Theâm vaøo danh saùch sau moät Theâm vaøo danh saùch sau moät

phaàn töû q phaàn töû q

Theâm moät phaàn töû vaøo danh Theâm moät phaàn töû vaøo danh saùchsaùch

Page 29: Danh saùch lieân keát

A B C D EHead

Tail

Theâm moät phaàn töû vaøo Theâm moät phaàn töû vaøo ñaàu danh saùchñaàu danh saùch

Xnew_ele

Page 30: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät:

////inputinput: : danh saùch (head, tail), phaàn töû môùi danh saùch (head, tail), phaàn töû môùi new_elenew_ele

////output:output: danh saùch (head, tail) vôùi new_ele ôû danh saùch (head, tail) vôùi new_ele ôû ñaàu danh saùchñaàu danh saùch

Neáu Danh saùch roãng thìNeáu Danh saùch roãng thì l.Head = new_ele;l.Head = new_ele; l.Tail = l.Head;l.Tail = l.Head;

Ngöôïc laïiNgöôïc laïi new_ele ->pNext = l.Head;new_ele ->pNext = l.Head; l.Head = new_ele ;l.Head = new_ele ;

Theâm moät phaàn töû vaøo Theâm moät phaàn töû vaøo ñaàu danh saùchñaàu danh saùch

Page 31: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:

void AddFirst(List&l , Node *new_ele)void AddFirst(List&l , Node *new_ele)

{{

if (l.Head = = NULL) if (l.Head = = NULL) //Xaâu roãng//Xaâu roãng

{{ l.Head = new_ele; l.Head = new_ele;

l.Tail = l.Head;l.Tail = l.Head;

} }

else else

{{ new_ele->pNext = l.Head; new_ele->pNext = l.Head;

l.Head = new_ele; l.Head = new_ele;

}}

}}

Theâm moät phaàn töû vaøo Theâm moät phaàn töû vaøo ñaàu danh saùchñaàu danh saùch

Page 32: Danh saùch lieân keát

A B C D EHead

Tail

Theâm moät phaàn töû vaøo Theâm moät phaàn töû vaøo cuối danh saùchcuối danh saùch

Xnew_ele

Page 33: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät:

////input: danh saùch (head, tail), phaàn töû môùi input: danh saùch (head, tail), phaàn töû môùi new_elenew_ele

////output: danh saùch (head, tail) vôùi new_ele ôû output: danh saùch (head, tail) vôùi new_ele ôû cuối danh saùchcuối danh saùch

Neáu Danh saùch roãng thìNeáu Danh saùch roãng thì l.Head = new_ele;l.Head = new_ele; l.Tail = l.Head;l.Tail = l.Head;

Ngöôïc laïiNgöôïc laïi l.Tail->pNext = new_ele ;l.Tail->pNext = new_ele ; l.Tail = new_elel.Tail = new_ele ; ;

Theâm moät phaàn töû vaøo cuối Theâm moät phaàn töû vaøo cuối danh saùchdanh saùch

Page 34: Danh saùch lieân keát

Caøi ñaët: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;}

}}

Theâm moät phaàn töû vaøo cuối Theâm moät phaàn töû vaøo cuối danh saùchdanh saùch

Page 35: Danh saùch lieân keát

A B C D EHead

Tail

Theâm phaàn töû môùi vaøo danh Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q saùch sau moät phaàn töû q

Xnew_ele

q

Page 36: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät:////input: danh saùch (head, tail), q, phaàn töû môùi input: danh saùch (head, tail), q, phaàn töû môùi

new_elenew_ele

////output: danh saùch (head, tail) vôùi new_ele ôû output: danh saùch (head, tail) vôùi new_ele ôû sau qsau q

Neáu ( q != NULL) thìNeáu ( q != NULL) thì

new_ele -> pNext = q -> pNext;new_ele -> pNext = q -> pNext;

q -> pNext = new_ele ;q -> pNext = new_ele ;

Neáu ( q = = l.Tail) thìNeáu ( q = = l.Tail) thì

l.Tail = new_ele;l.Tail = new_ele;

Ngöôïc laïiNgöôïc laïi

Theâm new_ele vaøo ñaàu danh saùchTheâm new_ele vaøo ñaàu danh saùch

Theâm phaàn töû môùi vaøo danh Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q saùch sau moät phaàn töû q

Page 37: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:void AddAfter(List&l , Node *q , Node void AddAfter(List&l , Node *q , Node

*new_ele)*new_ele){{

if (q!=NULL) if (q!=NULL) {{ new_ele->pNext = q->pNext;new_ele->pNext = q->pNext;

q->pNext = new_ele; q->pNext = new_ele; if(q = = l.Tail) if(q = = l.Tail) l.Tail = new_ele; l.Tail = new_ele;

}}else else // theâm vaøo ñaàu danh saùch// theâm vaøo ñaàu danh saùch

AddFirst(l , new_ele);AddFirst(l , new_ele);}}

Theâm phaàn töû môùi vaøo danh Theâm phaàn töû môùi vaøo danh saùch sau moät phaàn töû q saùch sau moät phaàn töû q

Page 38: Danh saùch lieân keát

Tìm moät phaàn töû trong danh Tìm moät phaàn töû trong danh saùchsaùch

DA B C EHead

Tail

C

p

STOP

Ok, foundX

Page 39: Danh saùch lieân keát

Tìm moät phaàn töû trong danh Tìm moät phaàn töû trong danh saùchsaùch

Giaûi thuaät:Giaûi thuaät:

//input: danh saùch (head, tail), döõ lieäu caàn tìm //input: danh saùch (head, tail), döõ lieäu caàn tìm XX

//output: ñòa chæ phaàn töû chöùa X//output: ñòa chæ phaàn töû chöùa X Böôùc 1:Böôùc 1:

p = l.Head; //Cho p troû ñeán phaàn töû p = l.Head; //Cho p troû ñeán phaàn töû ñaàu danh saùchñaàu danh saùch

Böôùc 2: Trong khi (p != NULL) vaø (p->Info != Böôùc 2: Trong khi (p != NULL) vaø (p->Info != x ) thöïc hieän:x ) thöïc hieän:

B21 : p = p->Next;// Cho p troû tôùi phaàn B21 : p = p->Next;// Cho p troû tôùi phaàn töû keá töû keá

Böôùc 3: Böôùc 3: Neáu p != NULL thì p troû tôùi phaàn töû Neáu p != NULL thì p troû tôùi phaàn töû

caàn tìmcaàn tìm Ngöôïc laïi: khoâng coù phaàn töû caàn tìm.Ngöôïc laïi: khoâng coù phaàn töû caàn tìm.

Page 40: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:Node *Search(List&l , Data X) Node *Search(List&l , Data X)

{{

NodeNode*p;*p;

p = l.Head;p = l.Head;

while((p!= NULL)&&(p->Info != X)) while((p!= NULL)&&(p->Info != X))

p = p->pNext;p = p->pNext;

return p;return p;

}}

Tìm moät phaàn töû trong danh Tìm moät phaàn töû trong danh saùchsaùch

Page 41: Danh saùch lieân keát

Ba tröôøng hôïp loaïi boû 1 phaàn töû ra Ba tröôøng hôïp loaïi boû 1 phaàn töû ra khoûi danh saùch: khoûi danh saùch: Huyû phaàn töû ñaàuHuyû phaàn töû ñaàu Huyû phaàn töû sau moät phaàn töû Huyû phaàn töû sau moät phaàn töû

qq Huyû phaàn töû coù khoaù k Huyû phaàn töû coù khoaù k

Löu yùLöu yù: khi caáp phaùt boä nhôù chuùng : khi caáp phaùt boä nhôù chuùng ta duøng haøm new. Vì vaäy khi giaûi ta duøng haøm new. Vì vaäy khi giaûi phoùng boä nhôù chuùng ta duøng haøm phoùng boä nhôù chuùng ta duøng haøm delete.delete.

Huyû moät phaàn töû ra khoûi Huyû moät phaàn töû ra khoûi danh saùchdanh saùch

Page 42: Danh saùch lieân keát

Huyû phaàn töû ñaàu xaâuHuyû phaàn töû ñaàu xaâu

A B C D EHead

Tail

Page 43: Danh saùch lieân keát

Huûy phaàn töû ñaàu xaâuHuûy phaàn töû ñaàu xaâu

Giaûi thuaät:Giaûi thuaät:

Neáu l.Head !=NULL thì Neáu l.Head !=NULL thì

p=l.Head;//p laø phaàn töû caàn huyûp=l.Head;//p laø phaàn töû caàn huyû

l.Head=l.Head->pNext;//taùch p ra khoûi l.Head=l.Head->pNext;//taùch p ra khoûi xaâuxaâu

delete p// huyû bieán ñoäng do p troû ñeándelete p// huyû bieán ñoäng do p troû ñeán

Ngöôïc laïi l.Tail=NULL;// xaâu roãngNgöôïc laïi l.Tail=NULL;// xaâu roãng

Page 44: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:Data RemoveHead(List&l)Data RemoveHead(List&l)

{{ Node *p; Data x = NULLDATA;Node *p; Data x = NULLDATA;

if (l.Head != NULL)if (l.Head != NULL)

{{ p= l.Head; x= p->info;p= l.Head; x= p->info;

l.Head= l.Head->pNext; l.Head= l.Head->pNext; delete p;delete p;

}}else else l.Tail = NULL;l.Tail = NULL;

return x;return x;

}}

Huûy phaàn töû ñaàu xaâuHuûy phaàn töû ñaàu xaâu

Page 45: Danh saùch lieân keát

Huûy phaàn töû sau moät phaàn Huûy phaàn töû sau moät phaàn töû qtöû q

A B C D EHead

Tailq

Page 46: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät:

////input: xaâu (head, tail), con troû qinput: xaâu (head, tail), con troû q

//output: xaâu ñaõ bò huyû phaàn töû sau phaàn töû //output: xaâu ñaõ bò huyû phaàn töû sau phaàn töû qq

Neáu (q!= NULL) thìNeáu (q!= NULL) thì p = q->pNext;p = q->pNext; // p laø phaàn töû caàn huûy// p laø phaàn töû caàn huûy Neáu (p != NULL) thì Neáu (p != NULL) thì // q khoâng phaûi laø // q khoâng phaûi laø

cuoái xaâucuoái xaâu Neáu (p= =l.Tail) thì Neáu (p= =l.Tail) thì l.Tail = q;l.Tail = q; q->pNext = p->pNext; q->pNext = p->pNext; // taùch p ra khoûi xaâu// taùch p ra khoûi xaâu deletedelete p;p;

Ngöôïc laïi:Ngöôïc laïi: Huyû phaàn töû ñaàu xaâuHuyû phaàn töû ñaàu xaâu

Huûy phaàn töû sau moät phaàn Huûy phaàn töû sau moät phaàn töû qtöû q

Page 47: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:void RemoveAfter (List&l , Node *q)void RemoveAfter (List&l , Node *q){{

Node *p;Node *p;if ( q != NULL) if ( q != NULL) {{ p = q ->pNext ;p = q ->pNext ;

if ( p != NULL)if ( p != NULL){{ if (p = = Tail) Tail = q;if (p = = Tail) Tail = q;

q->pNext = p->pNext;q->pNext = p->pNext;delete p;delete p;

}}} } else RemoveHead(l);else RemoveHead(l);

}}

Huûy phaàn töû sau moät phaàn Huûy phaàn töû sau moät phaàn töû qtöû q

Page 48: Danh saùch lieân keát

Huûy phaàn töû coù khoaù kHuûy phaàn töû coù khoaù k

DA B C EHead

Tail

C

p

STOP

Ok, foundK

q

Page 49: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät://input: xaâu (head, tail), khoùa k//input: xaâu (head, tail), khoùa k//output: xaâu ñaõ huyû phaàn töû coù khoùa k//output: xaâu ñaõ huyû phaàn töû coù khoùa k Böôùc 1:Böôùc 1:

Tìm phaàn töû p coù khoùa k vaø phaàn Tìm phaàn töû p coù khoùa k vaø phaàn töû q ñöùng tröôùc noùtöû q ñöùng tröôùc noù

Böôùc 2:Böôùc 2: Neáu (p!= NULL) thì // tìm thaáy kNeáu (p!= NULL) thì // tìm thaáy k

Huyû p ra khoûi xaâu töông töï huyû Huyû p ra khoûi xaâu töông töï huyû phaàn töû sau q;phaàn töû sau q;

Ngöôïc laïiNgöôïc laïi Baùo khoâng coù k;Baùo khoâng coù k;

Huûy phaàn töû coù khoaù kHuûy phaàn töû coù khoaù k

Page 50: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:intint RemoveNode(List&l , Data k)RemoveNode(List&l , Data k){{ Node *p = l.Head;Node *p = l.Head;

Node *q = NULL;Node *q = NULL;while ((p != NULL) && (p->Info != k))while ((p != NULL) && (p->Info != k)){{

q = p;q = p; p = p->pNext;p = p->pNext;

};};if(p!= NULL) if(p!= NULL)

{{ RemoveAfter(l , q);RemoveAfter(l , q);return 1} return 1} else else return 0; return 0;

}}

Huûy phaàn töû coù khoaù kHuûy phaàn töû coù khoaù k

Page 51: Danh saùch lieân keát

Duyeät danh saùch laø thao taùc thöôøng ñöôïc Duyeät danh saùch laø thao taùc thöôøng ñöôïc thöïc hieän khi coù nhu caàu xöû lyù caùc phaàn thöïc hieän khi coù nhu caàu xöû lyù caùc phaàn töû cuûa danh saùch theo cuøng moät caùch töû cuûa danh saùch theo cuøng moät caùch thöùc hoaëc khi caàn laáy thoâng tin toång hôïp thöùc hoaëc khi caàn laáy thoâng tin toång hôïp töø caùc phaàn töû cuûa danh saùch nhö:töø caùc phaàn töû cuûa danh saùch nhö: Ñeám caùc phaàn töû cuûa danh saùch,Ñeám caùc phaàn töû cuûa danh saùch, Tìm taát caû caùc phaàn töû thoaû ñieàu kieän, Tìm taát caû caùc phaàn töû thoaû ñieàu kieän, Huûy toaøn boä danh saùch (vaø giaûi phoùng Huûy toaøn boä danh saùch (vaø giaûi phoùng

boä nhôù)boä nhôù)

Duyeät danh saùchDuyeät danh saùch

Page 52: Danh saùch lieân keát

Giaûi thuaät:Giaûi thuaät: Böôùc 1:p = l.Head; Böôùc 1:p = l.Head; ////Cho p troû ñeán phaàn töû ñaàu Cho p troû ñeán phaàn töû ñaàu

danh saùchdanh saùch Böôùc 2: Trong khi (Danh saùch chöa heát) thöïc Böôùc 2: Trong khi (Danh saùch chöa heát) thöïc

hieänhieän B21 : Xöû lyù phaàn töû p;B21 : Xöû lyù phaàn töû p; B22 : p = p->pNext;B22 : p = p->pNext; // // Cho p troû tôùi phaàn töû keá Cho p troû tôùi phaàn töû keá

tieáptieáp

Duyeät danh saùchDuyeät danh saùch

Page 53: Danh saùch lieân keát

Duyeät danh saùchDuyeät danh saùch

Caøi ñaët:Caøi ñaët:void ProcessList (List&l)void ProcessList (List&l){{

Node *p;Node *p;p = l.Head;p = l.Head;while (p!= NULL)while (p!= NULL){ {

ProcessNode(p); ProcessNode(p); // xöû lyù cuï theå tuøy // xöû lyù cuï theå tuøy öùng duïngöùng duïng

p = p->pNext;p = p->pNext;}}

}}

Page 54: Danh saùch lieân keát

Ñeå hủy toaøn boä danh saùch, thao Ñeå hủy toaøn boä danh saùch, thao taùc xöû lyù bao goàm haønh ñoäng taùc xöû lyù bao goàm haønh ñoäng giaûi phoùng moät phaàn töû, do vaäy giaûi phoùng moät phaàn töû, do vaäy phaûi caäp nhaät caùc lieân keát lieân phaûi caäp nhaät caùc lieân keát lieân quan.quan.

Huûy toaøn boä danh saùchHuûy toaøn boä danh saùch

Page 55: Danh saùch lieân keát

Huûy toaøn boä danh saùchHuûy toaøn boä danh saùch

Giaûi thuaät:Giaûi thuaät: Böôùc 1: Trong khi (Danh saùch chöa heát) Böôùc 1: Trong khi (Danh saùch chöa heát)

thöïc hieänthöïc hieän B11: B11:

p = l.Head; p = l.Head; l.Head = l.Head->pNext; l.Head = l.Head->pNext; // Cho p troû tôùi // Cho p troû tôùi

phaàn töû keá phaàn töû keá B12: B12:

Huûy p;Huûy p; Böôùc 2:Böôùc 2:

l.Tail = NULL; l.Tail = NULL; //Baûo ñaûm tính nhaát quaùn //Baûo ñaûm tính nhaát quaùn khi xaâu roãngkhi xaâu roãng

Page 56: Danh saùch lieân keát

Caøi ñaët:Caøi ñaët:

void RemoveList(List&l)void RemoveList(List&l)

{{ Node *p;Node *p;

while (l.Head!= NULL) while (l.Head!= NULL)

{{

p = l.Head;p = l.Head;

l.Head = p->pNext;l.Head = p->pNext;

delete p;delete p;

}}

l.Tail = NULL;l.Tail = NULL;

}}

Huûy toaøn boä danh saùchHuûy toaøn boä danh saùch

Page 57: Danh saùch lieân keát

Ví duïVí duï öùng duïng danh saùch öùng duïng danh saùch lieân keátlieân keát

Xeùt baøi toaùn coäng hai ña thöùc Xeùt baøi toaùn coäng hai ña thöùc ñöôïc toå chöùc döôùi daïng danh ñöôïc toå chöùc döôùi daïng danh

saùch moùc noái.saùch moùc noái.

Page 58: Danh saùch lieân keát

Bieåu dieãn ña thöùcBieåu dieãn ña thöùc

Ña thöùc seõ ñöôïc bieåu dieãn döôùi daïng Ña thöùc seõ ñöôïc bieåu dieãn döôùi daïng danh saùch noái ñôn, vôùi moãi nuùt coù quy danh saùch noái ñôn, vôùi moãi nuùt coù quy caùch nhö sau:caùch nhö sau:

• Tröôøng COEF chöùa heä soá khaùc khoâng Tröôøng COEF chöùa heä soá khaùc khoâng cuûa moät soá haïng trong ña thöùc.cuûa moät soá haïng trong ña thöùc.

• Tröôøng EXP chöùa soá muõ töông öùng.Tröôøng EXP chöùa soá muõ töông öùng.• Tröôøng LINK chöùa moái noái tôùi nuùt tieáp Tröôøng LINK chöùa moái noái tôùi nuùt tieáp

theo.theo.

COEF EXP LINK

Page 59: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùc

Tröôùc heát caàn phaûi thaáy raèng ñeå thöïc Tröôùc heát caàn phaûi thaáy raèng ñeå thöïc hieän coäng A(x),B(x) ta phaûi tìm ñeán töøng hieän coäng A(x),B(x) ta phaûi tìm ñeán töøng soá haïng cuûa ña thöùc ñoù, nghóa laø phaûi soá haïng cuûa ña thöùc ñoù, nghóa laø phaûi duøng ñeán 2 bieán con troû p vaø q ñeå duøng ñeán 2 bieán con troû p vaø q ñeå duyeän 2 danh saùch töông öùng vôùi ña thöùc duyeän 2 danh saùch töông öùng vôùi ña thöùc A(x) vaø B(x).A(x) vaø B(x).

Page 60: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùc

Giaûi thuaät:Giaûi thuaät://input:ña thöùc A(x),B(x)(döôùi daïng danh //input:ña thöùc A(x),B(x)(döôùi daïng danh

saùch)saùch)//output:ña thöùc toång C(x)(döôùi daïng danh //output:ña thöùc toång C(x)(döôùi daïng danh

saùch)saùch)while(ds öùng vôùi A(x) vaø B(x) chöa heát)while(ds öùng vôùi A(x) vaø B(x) chöa heát)

if(EXP(p)= =EXP(q)) if(EXP(p)= =EXP(q)) coäng giaù trò COEF ôû 2 nuùt ñoù;coäng giaù trò COEF ôû 2 nuùt ñoù;if(toång khaùc khoâng) if(toång khaùc khoâng) taïo nuùt môùi theå hieän soá haïng toång ñoù;taïo nuùt môùi theå hieän soá haïng toång ñoù;gaén noù vaøo cuoái danh saùch C(x);gaén noù vaøo cuoái danh saùch C(x);p=p->pNext;p=p->pNext; q=q->pNext;q=q->pNext;if(EXP(p)>EXP(q))if(EXP(p)>EXP(q))theâm p vaøo cuoái danh saùch C(x);theâm p vaøo cuoái danh saùch C(x);p=p->pNext;p=p->pNext;

Page 61: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùc

if(EXP(q)>EXP(p))if(EXP(q)>EXP(p))

theâm q vaøo cuoái danh saùch C(x);theâm q vaøo cuoái danh saùch C(x);

q=q->pNext;q=q->pNext;

While(ds öùng vôùi A(x) chöa heát)While(ds öùng vôùi A(x) chöa heát)

theâm p vaøo cuoái danh saùch C(x);theâm p vaøo cuoái danh saùch C(x);

p=p->pNext;p=p->pNext;

While(ds öùng vôùi B(x) chöa heát)While(ds öùng vôùi B(x) chöa heát)

theâm q vaøo cuoái danh saùch C(x);theâm q vaøo cuoái danh saùch C(x);

q=q->pNext;q=q->pNext;

Xuaát danh saùch C(x);Xuaát danh saùch C(x);

Page 62: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùcStruct NodeStruct Node

{{ int COEF;int COEF;

int EXP;int EXP;

Node *pNext;Node *pNext;

};};

Struct ListStruct List

{{ Node *Head;Node *Head;

Node *Tail;Node *Tail;

};};

Node *Head,*Tail, *p,*q, *new_ele;Node *Head,*Tail, *p,*q, *new_ele;

List a,b,c;List a,b,c;

Page 63: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùcint x;int x;tao_ds_FIFO(a);tao_ds_FIFO(a);tao_ds_FIFO(b);tao_ds_FIFO(b);void sum(List&a , List&b)void sum(List&a , List&b){{Init( c);Init( c);p= a.Head; q=b.Head;p= a.Head; q=b.Head;while ((p!=NULL)&&(q!=NULL))while ((p!=NULL)&&(q!=NULL)){{

if(p->EXP= =q->EXP)if(p->EXP= =q->EXP){{ tam = p->COEF + q->COEF;tam = p->COEF + q->COEF;

if(tam!=0) if(tam!=0) {{ new_ele=GetNode(tam);new_ele=GetNode(tam);

AddTail(c , new_ele);AddTail(c , new_ele);}}

Page 64: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùcp=p->pNext;p=p->pNext;

q=q->pNextq=q->pNext

};};

if(p->EXP > q->EXP)if(p->EXP > q->EXP)

{{ AddTail(c, p);AddTail(c, p);

p=p->pNext;p=p->pNext;

}}

if(p->EXP < q->EXP)if(p->EXP < q->EXP)

{{ AddTail(c, q);AddTail(c, q);

q=q->pNext;q=q->pNext;

};};

};};

Page 65: Danh saùch lieân keát

Coäng hai ña thöùcCoäng hai ña thöùcwhile(p!=NULL)while(p!=NULL)

{{

AddTail(c, p);AddTail(c, p);

p=p->pNext;p=p->pNext;

};};

while(q!=NULL)while(q!=NULL)

{{

AddTail(c, q);AddTail(c, q);

q=q->pNext;q=q->pNext;

};};

xuat_ds(c);xuat_ds(c);

};};