iăv iăm tăbàiătoánăđãăđ căhìnhăth căhoá,ăchúngătaăcóăth ătìmăki măcáchăgi iătrongăthu tăng ăc aămôăhìnhăđóăvàăxácăđ nhăcóăhayăkhôngăm tăph ngăphápăho căm tă ch ngătrìnhăcóăs năđ ăgi i.ăN
Trang 1DATA STRUCTURES
TR NăCAOă
Trang 3M CăL C
CH NGăI:ăM ă U 4
I T BĨẤ TOÁN N Cả NẢ TậÌNả 4
1 Mô hình hóa bài toán 4
2 Gi iăthu tă(algorithms) 7
3 Ngônăng ăgi ăvàătinhăch ăt ngăb că(Pseudo-language and stepwise refinement) 10
4 Tómăt t 13
II KẤ U D LẤ U Tậ U T NẢ (ABSTậACT DATA TYPE -ADT) 13
1 Kháiăni mătr uăt ngăhóa 13
2 Tr uăt ngăhóaăch ngătrình 14
3 Tr uăt ngăhóaăd ăli u 14
III KẤ U D LẤ U - C U TậÚC D LẤ U VĨ KẤ U D LẤ U Tậ U T NẢ (DATA TYPES, DATA STRUCTURES, ABSTRACT DATA TYPES) 15
BĨẤ T P 17
CH NGăII:ăCỄCăKI UăD ăLI UăTR UăT NGăC ăB Năă(BASICăABSTRACTăDATAăTYPES) 18
I KẤ U D LẤ U Tậ U T NẢ DANả SÁCả (LẤST) 18
1 Kháiăni mădanhăsách 18
2 Các phép toán trên danh sách 18
3 Càiăđ tădanhăsách 20
a Cài đ t danh sách b ng m ng (danh sách đ c) 20
b Cài đ t danh sách b ng con tr (danh sách liên k t đ n) 25
c Cài đ t b ng con nháy 30
II NẢ N X P (STACK) 35
1 nhăngh aăng năx p 35
2 Cácăphépătoánătrênăng năx p 35
3 Càiăđ tăng năx p 35
a Cài đ t ng n x p b ng danh sách 36
b Cài đ t b ng m ng 37
4 ngăd ngăng năx păđ ălo iăb ăđ ăquiăc aăch ngătrình 39
III ảĨNẢ Ấ (ẬUEUE) 43
1 nhăNgh a 43
2 Cácăphépătoánăc ăb nătrênăhàng 44
3 Càiăđ tăhàngăđ i 44
a Cài đ t hàng b ng m ng 44
b Cài đ t hàng b ng m ng theo ph ng pháp t nh ti n 45
c Cài đ t hàng v i m ng xoay vòng 47
d Cài đ t hàng b ng danh sách liên k t ( hay cài đ t b ng con tr ) 49
4 M tăs ă ngăd ngăc aăc uătrúcăhàng 51
IV DANả SÁCả LẤÊN K T KÉP (ếỊỐbệe - lists) 51
BĨẤ T P 56
CH NGăIII:ăC UăTRÚCăCỂY (TREES) 60
I CÁC TảU T NẢ C B N TậÊN CÂY 60
1 nhăngh aăcây 60
2 Th ăt ăcácănútătrongăcây 61
3 Cácăth ăt ăduy tăcâyăquanătr ng 61
4 Câyăcóănhãnăvàăcâyăbi uăth c 62
II KẤ U D LẤ U Tậ U T NẢ CÂY 64
III CĨẤ T CÂY 65
Trang 42 Bi uădi năcâyăb ngădanhăsáchăcácăcon 70
3 Bi uădi nătheoăconătráiănh tăvàăanhăemăru tăph i 71
4 Càiăđ tăcâyăb ngăconătr 73
IV CÂY Nả PảÂN (BẤNAậY TậEES) 75
1 nhăngh a 75
2 Duy tăcâyănh ăphân 75
3 Càiăđ tăcâyănh ăphân 76
V CÂY TÌM KẤ M Nả PảÂN (BINARY SEARCH TREES) 79
1 nhăngh a 79
2 Càiăđ tăcâyătìmăki mănh ăphân 80
BĨẤ T P 85
CH NGăIV:ăT PăH P 88
I KảÁẤ NẤ M T P ả P 88
II KẤ U D LẤ U Tậ U T NẢ T P ả P 88
III CĨẤ T T P ả P 89
1 Càiăđ tăt păh păb ngăvectorăBit 89
2 Càiăđ tăb ngădanhăsáchăliênăk t 90
IV T Ấ N (DẤCTẤONAậY) 93
1 Càiăđ tăt ăđi năb ngăm ng 94
2 Càiăđ tăt ăđi năb ngădanhăsáchăliênăk t 95
V C U TậÚC B NẢ B M (ảASả TABLE) 96
1 K ăthu tăb m 96
2 B ngăb măm 97
3 B ngăb măđóng 100
4 Cácăph ngăphápăxácăđ nhăhàmăb m 103
VI ảĨNẢ U TẤÊN (ịrỄỊrỄỏy qỐeỐe) 105
1 Kháiăni măhàngă u tiên 105
2 Càiăđ tăhàngă uătiên 105
a Cây có th t t ng ph n 105
b Cài đ t cây có th t t ng ph n b ng m ng 108
BĨẤ T P 112
CH NGăV:ă ăTH ă(GRAPH) 114
I CÁC Nả NẢả A 114
II KẤ U D LẤ U Tậ U T NẢ Tả 115
III BẤ U DẤ N Tả 116
1 Bi uădi năđ ăth ăb ngămaătr năk 116
2 Bi uădi năđ ăth ăb ngădanhăsáchăcácăđ nhăk 118
IV CÁC PảÉP DUY T Tả (TậAVEậSALS Oạ ẢậAPả) 118
1 Duy tătheoăchi uăsâuă(depth-first search) 118
2 Duy tătheoăchi uăr ngă(breadth-first search) 120
V M T S BĨẤ TOÁN TậÊN Tả 122
1 Bàiătoánătìmăđ ngăđiăng nănh tăt ăm tăđ nhăc aăđ ăth ă(theăsingleăsourceăshortedăpathăproblem) 122 2 Tìmăđ ngăđiăng nănh tăgi aăt tăc ăcácăc păđ nh 124
3 Bàiătoánătìmăbaoăđóngăchuy năti pă(transitiveăclosure) 125
4 Bàiătoánătìmăcâyăbaoătrùmăt iăthi uă(minimum-cost spanning tree) 125
a Gi i thu t Prim 125
b Gi i thu t Kruskal 126
BĨẤ T P 128
TĨẤ LẤ U TảAM Kả O 130
Trang 5L IăNịIă U
ăđápă ngănhuăc uăh căt păc aăcácăb năsinhăviên,ănh tălàăsinhăviênăchuyênăngànhă
ti năhànhăbiênăso năcácăgiáoătrình,ăbàiăgi ngăchínhătrongăch ngătrìnhăh c.ăGiáoătrìnhămônă C uă trúcă D ă li uă đ că biênă so nă c ă b nă d aă trênă quy nă "Dataă Structuresă andăAlgorithms"ăc aăAlfredăV.ăAho,ăJohnăE.ăHopcroftăvàăJeffreyăD.ăUllmanădoăAddison-
Wesley
Giáo trình này đ căso nătheoăđ ăc ngăchiăti tămônăC uătrúc d ăli uăc aăsinhăviênă
chuyên ngành Tinăh căc aăKhoaăCôngă ngh ăThôngătin - Tr ngă iăh căC năTh ă
M cătiêuălà giúpăcácăb năsinhăviênăchuyênăngànhăcóăm tătàiăli uăcôăđ ngădùngălàmătàiă
li uăh căt p.ăTuyăv y,ăcácăđ iăt ngăsinh viên khác v năcóăth ăs ăd ngăgiáoătrìnhănàyălàmă tàiă li uă thamă kh oă hayă t ă h c.ă Chúngă tôiă ngh ă r ngă cácă b nă sinhă viênă khôngăchuyênătinăvàănh ngăng iăquanătâmăt iăcác c uătrúcăd ăli uăvàăgi iăthu tăs ătìmăđ cătrongănàyănh ngăđi uăh uăích
Giáoătrìnhăđ căphátăhànhăn iăb ăl năđ uătiênăvàoăn mă1998,ăvàăđ căch nhăs a,ătuă
b ăhàngăn m.ăL năch nhăs aăvàoăn mă2007ă(vàăhoànăch nhăn mă2008)ăđãăchuy năcácăcàiăđ tăb ngăPascalăsangăCăchoăsátăh năv iăsinhăviênăchuyênăngànhă- hi năđangăđ cătrangăb ăngônăng ăCănh ălàăngônăng ăl pătrìnhăc năb n.ăVi căcàiăđ tăcácăc uătrúcăd ă
li uătrong m tăngônăng ăl pătrìnhăc ăth ănh ăCăhayăPascalăkhôngăph iălàăm căđíchăchínhăc aăgiáoătrình.ăTuyănhiên,ăh uăh tăcácăđo năch ngătrìnhăđ căvi tătrongăgiáoătrìnhăđãăđ căbiênăd chătrongămôiătr ngăVisual C++ 6.0
N iădungăgiáoătrìnhămôn C uătrúcăD ăli uănàyăs ăcungăc păchoăsinhăviênăcácăki nă
th căc ăb năv ăcácăki uăd ăli uătr uăt ngăvàăcácăphépătoánăc ăb nătrên các ki uăd ă
li uătr uăt ngăđó.ăSauăkhiăh căxongămônănày,ăsinhăviênăs :
ng năx p,ăhàngăđ i,ăcây,ăt păh p,ăb ngăb m,ăđ ăth ăb ngăm tăngônăng ăl pătrìnhăc năb n
Giáoătrìnhăcònăcóăth ădùngăđ ăgi ngăd yănh ălàămônăh căc ăb n trongăt tăc ăcácăngànhăg năv iăTinăh c
Trang 6ăh căt tămônăC uătrúcăD ăli uănày,ăsinhăviênăc năph iăcóăcácăki năth căc ăb n:
th ăkhôngăph iălàăm tăyêuăc uăb tăbu c.ăGiáoătrìnhănàyăminhăh aăcácăcàiăđ tă
c ăth ăb ngăngônăng ăC/C++ đóălàăm tăngônăng ăquenăthu căđ iăv iăsinhăviênăchuyênăngànhăTinăh c.ă
N iădungăgiáoătrìnhăg mă5ăch ngăvàăđ căthi tăk ătrongăkhuônăkh ă3 tínăch ă(45
ti t)ăc aăm tămônăh cătrongăch ngătrìnhăđ iăh c,ătrongăđóăcóăkho ngă30ăti tăgi ngălý thuy tăvàă15 ti tăbàiăt pămàăgiáoăviênăs ăh ngăd năchoăsinhăviênătrênăl p.ăN iădungăgiáoătrìnhăh iăchúătr ngăv ăcácăc uătrúcăd ăli uăvàăcácăgi iăthu tătrênăcácăc uătrúcăd ă
li uăđóăh nălàăcácăch ngătrìnhăhoànăch nhătrongăngônăng ăl pătrìnhăC/C++
Ch ngă1:ăTrìnhăbàyăcáchăti păc năt ăm tăbàiătoánăđ năch ngătrình,ănóăbaoăg mămôăhìnhăhoáăbàiătoán,ăthi tăl păc uătrúcăd ăli uătheoămôăhìnhăbàiătoán,ăvi tăgi iăthu tă
gi iăquy tăbàiătoánăvàăcácăb cătinhăch ăgi iăthu tăđ aăđ năcàiăđ tăc ăth ătrongăm tăngônăng ăl pătrình
Ch ngă2:ăTrìnhăbàyăki uăd ăli uătr uăt ngădanhăsách,ăcácăc uătrúcăd ăli uăđ ăcàiă
đ tădanhăsách.ăNg năx păvàăhàngăđ iăc ngăđ cătrìnhăbàyătrongăch ngănàyănh ălàăhaiă
c uătrúcădanhăsáchăđ căbi t.ă ngăd ngăng năx păđ ăkh ăđ ăquiăc aăch ngătrìnhăđ căcoiălàăm tă ngăd ngăquanătr ngăc aăc uătrúcăng năx p.ăNgoàiăraăchúngătôiăcònăg iăýă
m tăs ă ngăd ngăc aăc uătrúcăhàngăđ i.ăCu iăch ng dànhăđ ătrìnhăbàyăc uătrúcădanhăsáchăliênăk tăképăchoănh ngăbàiătoánăc năduy tădanhăsáchătheoăhaiăchi uăxuôi,ăng că
m tăcáchăthu năl i.ă
Ch ngănàyăcóănhi uăcàiăđ tăt ngăđ iăchiăti tăđ ăcácăb năsinhăviênăm iăti păc năv iă
l pătrìnhăcóăc ăh iănângăcaoăkh ăn ngăl pătrìnhătrongăngônăng ăC/C++ đ ngăth iăc ngă
nh măminhăh a vi căcàiăđ tăm tăki uăd ăli uătr uăt ngătrongăm tăngônăng ăl pătrìnhă
c ăth
Ch ngă3:ăGi iăthi uăv ăki uăd ăli uătr uăt ngăcây,ăkháiăni măcâyăt ngăquát,ăcácăphépăduy tăcâyăt ngăquátăvàăcàiăđ tăcâyăt ngăquát.ăK ăđ n, chúngătôiătrìnhăbàyăv ăcâyă
nh ăphân,ăcácăcáchăcàiăđ tăcâyănh ăphân.ăCu iăcùng,ăchúngătôiătrìnhăbàyăcâyătìmăki mă
nh ăphânănh ălàăm tă ngăd ngăc aăcâyănh ăphânăđ ăl uătr ăvàătìmăki măd ăli u m tăcáchăhi uăqu
Ch ngă4:ăNóiăv ăki uăd ăli uătr uăt ngăt păh p,ăcácăcáchăđ năgi năđ ăcàiăđ tăt pă
h pănh ăcàiăđ tăb ngăvect ăbítăvà b ngădanhăsáchăcóăho căkhôngăcóăth ăt ăPh năchínhă
c aăch ngănàyătrìnhăbàyăc uătrúcăd ăli u t ăđi n,ăđóălàăt păh păv iăbaăphépătoánăthêm,ă
hàngă uătiên
Ch ngă5:ăTrìnhăbàyăki uăd ăli uătr uăt ngăđ ăth ,ăcácăcáchăbi uădi năđ ăth ,ăt călà càiăđ tăđ ăth ăCácăphépăduy tăđ ăth ăbaoăg măduy tătheoăchi uăr ngăvàăduy tătheoăchi uăsâuăm tăđ ăth c ngăđ cătrìnhăbàyătrongăch ng.ăDoăh năch ăv ăth iăl ngălên
l pănênăchúngătôiăkhôngătáchăriêngăraăđ ătrìnhăbàyăđ ăth ăcóăh ng,ăđ ăth ăvôăh ngă
nh ngăchúngătôiăs ăphânăbi tănóă ănh ngăch c năthi t.ăCh ngănàyăđ ăc păm tăs ăbàiă
Trang 7trongăcácămônăh cănh ăToánăr iăr căvàăLýăthuy tăđ ăth ,ăvìăv yăch ngănàyăch ăgi iăthi uăm tăs ăbàiătoánăđ năgi nănh tăđ ăsinhăviênăv năd ngăcáchăcàiăđ tăđ ăth ăvàăcác
phép toánătrênăđ ăth ăđ ăl pătrìnhăgi iăcác bài toán đó
Chúngătôiăhyăv ngătàiăli uănàyăđãăđúcăk tăkinhănghi măgi ngăd yănhi uăn mămônă
C uătrúc d ăli uăvàăGi iăthu tăc aăchúngătôi M cădùăđãăr tăc ăg ngătrongăquáătrìnhăbiênăso n,ănh ngăgiáo trình cóăth ăv năcòn nhi uăkhi măkhuy tăvàăh năch ăR tămongă
nh năđ căs ăđóngăgópăýăki năquýăbáuăc aăsinhăviênăvàăcácăb năđ căđ ăgiáoătrìnhăngàyă
m tăhoànăthi năh n
Trang 8CH NGăI: M ă U
1 Mô hình hóa bài toán
ăgi iăm tăbàiătoánătrongăth căt ăb ng máy tính (computer) taăph iăb tăđ uăt ăvi căxácăđ nhăbàiătoán.ăNhi uăth iăgianăvàăcôngăs căb ăraăđ ăxácăđ nhăbàiătoánăc năgi iăquy t,ăt călàăph iătr ăl iărõăràngăcâuăh iă"ph iălàmăgì?"ăsauăđóălàă"làmănh ăth ănào?".ăThôngăth ng,ăkhiăkh iăđ u,ăh uăh tăcácăbàiătoánălàăkhôngăđ năgi n,ăkhôngărõăràng.ăăgi măb tăs ăph căt păc aăbàiătoánăth căt ,ătaăph iăhìnhăth căhóaănó,ăngh aălàăphátă
bi uăl iăbàiătoánăth căt ăthànhăm tăbàiătoánăhìnhăth căhayăcònăg iălàămôăhìnhătoán.ăCóă
th ăcóăr tănhi uăbàiătoánăth căt ăcóăcùngăm tămôăhìnhătoán
Víăd ă1: v năđ ătôămàuăb năđ ăth ăgi i:
Gi ăs ătaăc năph iătôămàuăchoăcácăn cătrênăb năđ ăth ăgi i (hình I.1).ăTrongăđóă
m iăn căđ cătôăm tămàuăvàăhaiăn călángăgi ng (có biênăgi i chung)ăthìăph iăđ cătôăb ngăhaiămàuăkhácănhau.ăHãyătìmăm tăph ngăánătôămàuăcácăn cătrênăb năđ ăsao choăs ămàuăs ăd ngălàăítănh t
Hình I.1: B năđ ăth ăgi i
Môăhìnhăhóaăbàiătoánănàyăcóăth ăhi uălà: tìmăcáchăbi uădi năbàiătoánăm tăcáchătr uă
t ngăh năđ ăg tăb ăcácăchiăti tăkhôngăc năthi t.ăVíăd ătaăch ăc năghiăl iăt tăc ăcácă
n cătrênăb năđ ăvàăm iăquanăh ă“lángăgi ng”ăgi aăhaiăn c,ăt călàăch ăc năbi tăn cănàoăv iăn cănàoăcóăbiênăgi iăchung.ăM tăcáchămôăhìnhăhóaălà:ăv ăm iăn cănh ăm tă
đi m;ăn uăhaiăn căcóăchungăbiênăgi iătaăs ăv ăm tăđ ngăn iăhaiăđi măt ngă ng.ă
V yăb năđ ăth ăgi iăvàăm iăquanăh ălángăgi ngăgi aăcácăn căđãăđ căbi uădi năb ngă
m tăđ ăth (graph):ăm iăđ nhălàăm tăn c,ăhaiăn căcóăbiênăgi iăchungăthìăhaiăđi mă
t ngă ngăs ăđ căn iăv iănhauăb iăm tăđo năth ng hay cong tùy thích,ăg iălàăcung hayăc nhăc aăđ ăth Ch ngăh n,ăm tăph năc aăb năđ ăth ăgi iăđ căchoătrongăhìnhăI.2ăcóăth ămôăhìnhăhóaăb ngăm tăđ ăth ănh ătrongăhìnhăI.3
Trang 9HìnhăI.3:ăMinhăh aăvi cămôăhìnhăhóaăchoăph năb năđ ăth ăgi iătrongăhìnhăI.2
Bài toán “Tôămàuăchoăb năđ ăth ăgi i” tr ăthành:
thìăph iăđ cătôăb ngăhaiămàuăkhácănhau;
Rõăràng,ăgi ăđây bàiătoánătôămàuăđ tăraăbanăđ uăđãăcóăv ă“toánăh c”ăh năvàănóăxácă
đ nhăc ăth ăh năv năđ ă“ph iălàmăgì?”.ăVi călàmăsaoăđ ăgi iăđ căbàiătoánănày,ăt călàă
“làmănh ăth ănào?”ăcònăc năph iăđ căti păt cătháoăg
Trang 10Víăd ă2:ă ènăgiaoăthông
Choăm tăngãăn mănh ăhình I.4,ătrongăđóăCăvàăEălàăcácăđ ngăm tăchi uătheoăchi uă
m iătên,ăcácăđ ngăkhácălàăhaiăchi u.ăHãyăthi tăk ăm tăb ngăđènăhi uăđi uăkhi năgiaoăthôngăt iăngãăn mănàyăm tăcáchăh pălý,ăngh aălà:ăphânăchiaăcácăl iăđiăt iăngãăn mănàyăthànhăcácănhóm,ăm iănhómăg m cácăl iăđiăcóăth ăcùngăđiăđ ngăth iănh ngăkhôngăx yăraătaiăn năgiaoăthôngă(cácăh ngăđiăkhôngăc tănhau),ăvàăs ăl ngănhómălàăítănh tăcóăth ă
đ c.ă
Taăcóăth ăxemăđ uăvàoă(input)ăc aăbàiătoánălàăt tăc ăcácăl iăđiăt iăngãăn mănày,ăđ uăraă(output)ăc aăbàiătoánălàăcácănhómăl iăđiăcóăth ăđiăđ ngăth iămàăkhôngăx yăraătaiăn nă
giao thông M iănhómăs ăt ngă ngăv iăm tăphaăđi uăkhi năc aăđènăhi u Vì v y, ta
ph iătìmăki măl iăgi iăv iăs ănhómălàăítănh tăđ ăgiaoăthôngăkhôngăb ăt căngh năvìăph iă
ch ăđ iăquáălâu.ă
HìnhăI.4:ăVíăd ăm tăngãăn m
T ngăt ănh ătrongăvíăd ă1,ătr căh tătaătìmăcáchămôăhìnhăhóaăbàiătoán,ăt călàătìmăcáchătr uăt ngăhóaăđ ăg tăb ăcácăchiăti tăkhôngăc năthi t.ă ăgi iăbàiătoánăv aăđ tăra,ăítănh tătaăph iăbi tă ăngãăn măcóăbaoănhiêuăl iăđi,ăl iăđiănàoăv iăl iăđiănàoăcóăh ngăgiaoăthôngăkhôngăc tănhau,ăl iăđiănàoăv iăl iăđiănàoăcóăh ngăgiaoăthôngăc tănhau.ă
DC, EA, EB, EC, ED ăcóăth ăgi iăđ căbàiătoánătaăph iătìmăm tăcáchănàoăđóăđ ăth ă
hi năm iăliênăquanăgi aăcácăl iăđiănày.ăL iănàoăv iăl iănàoăkhôngăth ăđiăđ ngăth i,ăl iănàoăvàăl iănàoăcóăth ăđiăđ ngăth i.ăVíăd ăc păABăvàăECăcóăth ăđiăđ ngăth i,ănh ngăADăvàăEBăthìăkhông,ăvìăcácăh ngăgiaoăthôngăc tănhau.ă ăđâyătaăs ădùngăm tăs ăđ ătr căquanănh ăsau:ătênăc aă13ăl iăđiăđ căvi tălênăm tăph ng,ăhaiăl iăđiănàoăn uăđiăđ ngăth iă
s ăx yăraăđ ngănhauă(t călàăhaiăh ngăđiăc tăquaănhau)ătaăn iăl iăb ngăm tăđo năth ng,ă
ho căcong,ăho căngo năngoèoătùy thích.ăTaăs ăcóăm tăs ăđ ănh hình I.5.ăNh ăv y,ătrênăs ăđ ănày,ăhaiăl iăđiăcóăc nhăn iăl iăv iănhauălàăhaiăl iăđiăkhôngăth ăchoăđiăđ ngă
th i.ă
V iăcáchăbi uădi nănh ăv yătaăđãăcóăm tăđ ăth ,ăt călàătaăđãămôăhìnhăhoáăbàiătoánăgiaoăthôngă ătrênătheoămôăhìnhătoánălàăđ ăth ;ătrongăđóăm i l iăđiătr ăthànhăm tăđ nhă
c aăđ ăth ,ăhaiăl iăđiăkhôngăth ăcùngăđiăđ ngăth iăđ căn iănhauăb ngăm tăđo n đ c
g iălàăc nhăc aăđ ăth ăBâyăgi ătaăph iăxácăđ nhăcácănhóm,ăv iăs ănhómăítănh t M iă
Trang 11 Cácăl iăđiăchoăphépăcùngăđiăđ ngăth iăs ăcóăcùngăm tămàu:ăD ădàngănh nă
th yăr ngăhaiăđ nhăcóăc nhăn iănhauăs ăkhôngăđ cătôăcùngămàu;
Hình I.5: Mô hình giao thôngăt i ngãăn mătrongăhìnhăI.4
Tómăl i,ătaăph iăgi iăquy tăbàiătoánăsau:
Tôămàuăchoăđ ăth ă ăhìnhăI.5 sao cho:
năđây,ăbàiătoánă“ ènăgiaoăthông”ăđãăđ căphátăbi uăthànhăm tăbàiătoánăđ ăth ăTaă
c ngăth yăr ngăhaiăbàiătoánăth căt ă“Tôămàuăb năđ ăth ăgi i”ăvàă“ ènăgiaoăthông”ăxemăraăr tăkhácăbi tănhauănh ngăsauăkhiămôăhìnhăhóa,ăchúngăth căch tăch ălàăm t,ăđóălàăbàiătoánă“Tôămàuăđ ăth ”
iăv iăm tăbàiătoánăđãăđ căhìnhăth căhoá,ăchúngătaăcóăth ătìmăki măcáchăgi iătrongăthu tăng ăc aămôăhìnhăđóăvàăxácăđ nhăcóăhayăkhôngăm tăph ngăphápăho căm tă
ch ngătrìnhăcóăs năđ ăgi i.ăN uăkhôngăcóăm tăph ngăphápăho căm tăch ngătrìnhă
nh ăv yăthìăítănh tăchúngătaăc ngăcóăth ătìmăđ cănh ngăgìăđãăbi tăv ămôăhìnhăvàădùngăcácătínhăch tăc aămôăhìnhăđ ăxâyăd ngăm tăgi iăthu tăt t.ă
Khiăđãăcóămôăhìnhăthíchăh păchoăm tăbàiătoánătaăc năc ăg ngătìmăcáchăgi iăquy tă
bàiătoánătrongămôăhìnhăđó.ăKh iăđ uălàătìmăm tăgi iăthu t,ăđóălàăm tăchu iăh uăh nă
cácăch ăth ă(instruction)ămàăm iăch ăth ăcóăm tăýăngh aărõăràngăvàăth căhi năđ cătrongă
m tăl ngăth iăgianăh uăh n.ă
Knuth (1973) đ nhăngh aăgi iăthu tălàăm tăchu iăh uăh năcácăthaoătácăđ ăgi iăm tăbàiătoánănàoăđó.ăCácătínhăch tăquanătr ngăc aăgi iăthu tălà:
Trang 12 ả Ố ể ỉ (finiteness):ăgi iăthu tăph iăluônăluônăk tăthúcăsauăm tăs ăh uăh nă
b c;
XáẾ đ ỉể (definiteness):ăm iăb căc aăgi iăthu tăph iăđ căxácăđ nhărõăràngă
vàăph iăđ căth căhi năchínhăxác,ănh tăquán;
ảỄ Ố qỐ (effectiveness):ăcácăthaoătácătrongăgi iăthu tăph iăđ căth căhi nă
trongăm tăl ngăth iăgianăh uăh n.ă
Ngoàiăraăm tăgi iăthu tăcònăph iăcóăđ uăvàoă(input)ăvàăđ uăraă(output)
Nóiătómăl i,ăm tăgi iăthu tăph iăgi iăquy tăxongăm tăcôngăvi cănàoăđóăkhiătaăchoăd ă
li uăvào.ăCóănhi uăcáchăđ ăth ăhi năgi iăthu t:ădùngăl i,ădùngăl uăđ ,ă ăVàăm tăl iădùngăr tăph ăbi nălàădùngăngônăng ăgi ,ăđóălàăs ăk tăh păc aăngônăng ăt ănhiênăvà các
c uătrúcăc aăngônăng ăl pătrình
Víăd :ăThi tăk ăgi iăthu tăđ ăgi iăbàiătoán “Tôămàuăđ ăth ” trên
Choăđ nănay,ăbàiătoánătôămàuăchoăđ ăth ăkhôngăcóăgi iăthu tăt tăđ ătìmăl iăgi iăt iău,ăt călà,ăkhôngăcóăgi iăthu tănàoăkhácăh nălàă"th ăt tăc ăcácăkh ăn ng"ăhayă"vétăc n"ă
t tăc ăcácătr ngăh păcóăth ăcóăđ ăxácăđ nhăcáchătôămàuăchoăcácăđ nhăc aăđ ăth ăsaoăchoăs ămàuădùngălàăítănh t.ăTh căt ,ătaăch ăcóăth ă"vétăc n"ătrongătr ngăh păđ ăth ăcóă
s ăđ nhănh ,ătrongătr ngăh păng căl iătaăkhôngăth ă"vétăc n"ăt tăc ăcácăkh ăn ngătrongăm tăl ngăth iăgianăh pălý,ădoăv yătaăph iăsuyăngh ăcáchăkhácăđ ăgi iăquy tăv nă
đ :
cácătínhăch tăđ căbi tănàyătaăcóăth ăd ădàngătìmăl iăgi i,ăho c
ch aăch călàăl iăgi iăt iă u.ăM tăcáchălàmănh ăth ăđ iăv iăbàiătoánătrênălàă
"C ăg ngătôămàuăchoăđ ăth ăb ngăítămàuănh tăm tăcáchănhanhăchóng".ăÍtămàuă
nh tă ăđâyăcóăngh aălàăs ămàuămàătaătìmăđ căkhôngăph iăluônăluônătrùng
kh păv iăs ămàuăc nădùngătrongăl iăgi iăt iă uă(ítănh t), nh ngătrongăđaăs ă
tr ngăh păthìănóăs ătrùngăv iăđápăs ăc aăl iăgi iăt iă uăvàăn uăcóăchênhăl chăthìănóă"khôngăchênhăl chănhi u"ăsoăv iăl iăgi iăt iă u,ăbùăl iătaăkhôngăph iă
"vétăc n"ăm iăkh ăn ngăcóăth !ăNóiăkhácăđi,ătaăkhôngădùngăgi iăthu tă"vétă
c n"ăm iăkh ăn ngăđ ătìmăl iăgi iăt iă uămàătìmăm tăgi iăphápăđ ăđ aăraăl iă
gi iăh pălýăm tăcáchăkh ăthiăv ăth iăgian.ăM tăgi iăphápănh ăth ăg iălàăm tă
HEURISTIC
HEURISTICă choă bàiă toánă tôă màuă đ ă th ,ă th ngă g iă làă gi iă thu tă "háuă n"ă
(GREEDY) là:
Cể ỉ m ỏ đ ỉể Ếể a ỏô mỢỐ ốỢ ỏô ỉó b ỉỂ m ỏ mỢỐ m Ễ C ỉỢỊ đó;
DỐy ỏ ếaỉể sáẾể ẾáẾ đ ỉể Ếể a ỏô mỢỐ Ễ ố Ễ m ỏ đ ỉể Ếể a ỏô mỢỐ, ồáẾ
đ ỉể ồem ỉó Ếó Ệ ố Ễ m ỏ đ ỉể ỉỢỊ đ Ế ỏô b ỉỂ mỢỐ C đó ỆểôỉỂ N Ố ỆểôỉỂ Ếó, ỏô ỉó b ỉỂ mỢỐ C đó
Ýăt ngăc aăHeuristicănàyălàăh tăs căđ năgi n:ăếùỉỂ m ỏ mỢỐ đ ỏô ẾểỊ ỉểỄ Ố đ ỉể
ỉể ỏ Ếó ỏể đ Ế (cácăđ nhăđ căxétătheoăm tăth ăt ănàoăđó),ăkhiăkhôngăth ătôăđ că
Trang 13Víăd :ă ăth ăhìnhăI.6 và cách tô màu cho nó
HìnhăI.6:ă ăth ăminhăh aăcáchătôămàuătheoă“háuă n”ă(GREEDY)
Tô theo GREEDY
(xétăl năl tătheoăs ăth ăt ăcácăđ nh)
T iă u (th ăt tăc ăcácăkh ăn ng)
5: vàng
Rõăràngăcáchătôămàuătrongăgi iăthu tă"háuă n"ăkhôngăluônăluônăchoăl iăgi iăt iă uă
nh ngănóăđ căth căhi năm tăcáchănhanhăchóng
Tr ăl iăbàiătoánăgiaoăthôngă ătrênăvàăápăd ngăHEURISTICăGreedyăchoăđ ăth ătrongă
hình I.5 (theoăth ăt ăcácăđ nhăđãăli tăkêă ătrên),ătaăcóăk tăqu :
Nh ăv yătaăđãătìmăraăm tăl iăgi iălàădùngă4ămàuăđ ătôăchoăđ ăth ăhìnhăI.5.ăNh ăđãănói,ăl iăgi iănàyăkhôngăch călàăl iăgi iăt iă u.ăV yăli uăcóăth ădùngă3ămàuăho căítăh nă3ămàuăkhông?ăTaăcóăth ătr ăl iămôăhìnhăc aăbàiătoánăvàădùngătínhăch tăc aăđ ăth ăđ ă
ki mătraăk tăqu ăNh năxétăr ng:
Hình I.7:ăVíăd ăv ăcácăđ ăth ăcóăn iăk tăđ yăđ
Trang 14 M tăđ ăth ăcóăkăđ nhăvàăm iăc păđ nhăb tăk ăđ uăđ căn iănhauăthìăph iădùngăkămàuăđ ătô.ăHìnhăI.7ăch ăraăhaiăvíăd ăv iăk=3ăvàăk=4.ă
đ căn iănhauăthìăkhôngăth ădùngăítăh năkămàuăđ ătôăchoăđ ăth
ăth ătrongăhìnhăI.5 cóă4ăđ nh:ăAC, DA, BD, EBămàăm iăc păđ nhăb tăk ăđ uăđ că
n iănhauăv yăđ ăth ăhìnhăI.5 khôngăth ătôăv iăítăh nă4ămàu.ă i uănàyăchoăphépăk tălu nă
tìmăđ că ătrên,ăv iă4ămàu, c ngălàăl iăgi iăt iă u.ă
Nh ă v yă taă đãă gi iă đ că bàiă toánă giaoă thôngă đãă cho.ă L iă gi iă choă bàiă toánă làă 4ănhóm,ăm iănhómăg măcácăl iăcóăth ăđi đ ngăth i,ănóă ngăv iăm tăphaăđi uăkhi năc aăđènăhi u.ă ăđâyăc nănh năm nhăr ng,ăs ăd ătaăcóăl iăgi iăm tăcáchărõăràngăch tăch ănh ă
v yălàăvìăchúngătaăđãăgi iăbàiătoánăth căt ănàyăb ngăcáchămôăhìnhăhoáănóătheoăm tămôăhìnhăthíchăh pă(môăhìnhăđ ăth )ăvàănh cácăki năth cătrênămôăhìnhănàyă(bàiătoánătôămàuăvàăheuristicăđ ăgi i)ătaăđãăgi iăquy tăđ căbàiătoán.ă i uănàyăkh ngăđ nhăvaiătròă
d năthànhănh ngăchu iăm nhăđ ăc ăth ăh n,ăcu iăcùngălàăcácăch ăth ăthíchăh pătrongă
m tă ngônă ng ă l pă trình.ă Ch ngă h nă v iă heuristică GREEDY,ă gi ă s ă đ ă th ă làă G,ă
heuristicăs ăxácăđ nhăm tăt păh păNewclr cácăđ nhăc aăGăđ cătôăcùngăm tămàu,ămàătaă
g iălàămàuăm iăCă ătrên.ă ăti năhànhătôămàuăhoànăt tăchoăđ ăth ăGăthìăHeuristicănàyă
ph iăđ căg iăl păl iăchoăđ năkhi toànăth ăcácăđ nhăđ uăđ cătôămàu
PROCEDURE GREEDY ( var G: GRAPH ; var Newclr: SET );
begin
{1} Newclr := Ø;
{2} foră(m iăđ nhăvăch aătôămàuăc aăG)ădo
{3} ifă(văkhôngăđ căn iăv iăm tăđ nhănàoătrongăNewclr)ăthenăbegin
{4} đánhăd uăvăđãăđ cătôămàu;
{5} thêm v vào Newclr;
end;
Th ăt căGREEDYăđ căvi tăv iăngônăng ăgi ăPASCAL
Trongăth ăt căb ngăngônăng ăgi ă ătrên,ăchúngătaăđãădùngăm tăs ăt ăkhóa c aăngônă
ng ăPASCAL xenăl năcácăm nhăđ ăti ngăVi t.ă i uăđ căbi tăn aălàătaădùngăcácăki uă
GRAPH,ăSETăcóăv ăxaăl ,ăchúngălàăcácă"ki uăd ăli uătr uăt ng"ămàăsauănàyăchúngătaă
s ăvi tăb ngăcácăkhaiăbáoăthíchăh pătrongăngônăng ăl pătrìnhăc ăth ăD ănhiên,ăđ ăcàiă
đ tăth ăt cănàyăthànhăch ngătrìnhăch yăđ cătrênămáyătính,ătaăph iăc ăth ăhoáăd nă
nh ngăm nhăđ ăb ngăti ngăvi tă ătrênăchoăđ năkhiăm iăm nhăđ ăt ngă ngăv iăm tă
đo nămãăthíchăh păc aăngônăng ăl pătrình Ch ngăh năm nhăđ ăif ă{3} cóăth ăchiăti tă
hoáăh năn aănh ăsau:
Trang 15{2} foră(m iăđ nhăvăch aătôămàuăc aăG)ădoăbegin
{3.1} found:=false;
{3.2} foră(m iăđ nhăwătrongăNewclr)ădo
{3.3} ifă(cóăc nhăn iăgi aăvăvàăw)ăthen
{3.4} found:=true;
{3.5} if found=false then begin
{4} đánhăd uăvăđãăđ cătôămàu;
{5} thêm v vào Newclr;
end;
end;
end;
Th ăt căGREEDYăđãăđ cătinhăch ăm nhăđ ăifă ă{3}
Hình I.8:ăBi uădi năt păh păcácăđ nhănh ălàăm tădanhăsáchă(LIST)
Bâyăgi ătaăhãyăquanătâmăm tăchútăđ năcácăki uăd ăli uătr uăt ngăGRAPHăvàăSET Trongăgi iăthu tăvi tăb ngăngônăng ăgi ă ătrên, GRAPHăđ cădùngăđ ăch ă«ăki u »ăc aă
đ ăth ăđ uăvàoăcònăSETăđ ăch ă« ki u »ăc aăt păh păđ uăra.ăM tăcáchănômănaătaăcóăth ă
coi GRAPH nh ălàăt păh păcácăđ nhăvàăt păh păcácăc nhăc aăđ ăth ăđ uăvàoăcònăSET làăt păh păcácăđ nhă ăđ uăra.ă ăth oălu năkhôngăquáăsaăđàăvàoăcàiăđ t,ătaăhãy gác l iă
vi căbi uădi năt păh păcác c nhăđ ăt pătrungăvàoăt păh păcácăđ nh.ăCóănhi uăcáchăđ ă
bi uădi năt păh păcácăđ nhătrongăngônăng ăl pătrình.ă năgi n, taăxemăcácăt păh păđ nhă
nh ălàăm tădanhăsáchă(LIST)ăcácăs ănguyênăbi uădi năch ăs ăc aăcácăđ nhăvàăk tăthúcă
b ngăm tăgiáătr ăđ căbi tăNULLă(hìnhăI.8).ăV iănh ngăquiă cănh ăv yătaăcóăth ătinhă
ch ăgi iăthu tăGREEDYăm tăb căn aănh ăsau:
PROCEDURE GREEDY ( var G: GRAPH ; var Newclr: LIST );
var found:boolean;
v,w :integer;
begin
Newclr:= Ø;
v:=ăđ nhăđ uătiênăch aăđ cătôămàuătrongăG;
while v<>null do begin
found:=false;
w:=đ nhăđ uătiênătrongănewclr;
while( w<>null) and (not found) do begin
ifăcóăc nhăn iăgi aăvăvàăwăthen
found:=true;
else w:=ăđ nhăk ăti pătrongănewclr;
end;
if found=false then begin
đánhăd uăvăđãăđ cătôămàu;
thêm v vào Newclr;
end;
Trang 16end;
end;
Th ăt căGREEDYăđãăđ cătinhăch ăthêm.ă
Vi cădùngăngônăng ăgi ănh măm căđíchăphátăh aăýăt ngăc aăgi iăthu t,ătránhăsaăđàăvàoăcúăphápăc aăngônăng ăTuyănhiên,ă ăcácăb cătinhăch ăv ăsau,ăth ăt căngônăng ă
gi ăcàngăg năgi ngăv iăch ngătrìnhătrongăm tăngônăng ăl pătrình.ăVìăv y,ăvi căch năngônăng ăgi ăt aăPASCALăhayăt aăCăhayăt aăm tăngôn ng ăl pătrìnhănàoăkhácălàătùyăthu căvàoăthóiăquenăc aăng iăs ăd ng,ăvàoăs ăquenăthu căv iăngônăng ăl pătrình
N uăng iădùngăquenăthu căv i ngônăng ăCăcóăth ăvi tăth ăt căv iăngônăng ăgi ăt aă
C nh ăsau :
void GREEDY ( GRAPH& G, SET& Newclr ){
/*1*/ Newclr = Ø;
/*2*/ foră(m iăđ nhăvăch aătôămàuăc aăG)ă
/*3*/ ifă(văkhôngăđ căn iăv iăm tăđ nhănàoătrongăNewclr){
/*4*/ đánhăd uăvăđãăđ cătôămàu;
/*5*/ thêm v vào Newclr;
}
Th t c GREEDY v i ngôn ng gi C
void GREEDY ( GRAPH& G, SET& Newclr )
{
/*1*/ Newclr= Ø;
/*2*/ foră(m iăđ nhăvăch aătôămàuăc aăG)ă{
/*3.1*/ int found=0;
/*3.2*/ foră(m iăđ nhăwătrongăNewclr)
/*3.3*/ ifă(cóăc nhăn iăgi aăvăvàăw)ă
/*3.5*/ if (!found) {
/*4*/ đánhăd uăvăđãăđ cătôămàu;
/*5*/ thêm v vào Newclr;
} }
}
Th ăt căcóăth ăđ cătinhăch ăthêmăm tăb căn a:
void GREEDY ( GRAPH& G, LIST& Newclr ){
Newclr= ;
intăv=ăđ nhăđ uătiênăch aăđ cătôămàuătrongăG;
while (v<>null) {
int found=0;
intăw=đ nhăđ u tiên trong newclr;
while( w<>null) && (!found)
Ifă(cóăc nhăn iăgi aăvăvàăw)
found=1;
else
Trang 17Thêm v vào Newclr;
} v=ăđ nhăch aătôămàuăk ăti pătrongăG;
}
}
T ănh ngăth oălu n trên, cóăth ătómăt tăcácăb căti păc năv iăm tăbàiătoánăbaoăg m:
khôngăhìnhăth c,ăt călàănóăch ănêuăph ngăh ngăgi iăho căcácăb căgi iă
m tăcáchăt ngăquát
3 Hìnhăth căhoáăgi iăthu tăb ngăcáchăvi tăm tăth ăt căb ngăngônăng ăgi ,ăr iăchiăti tăhoáăd nă("m năd n")ăcácăb căgi iăt ngăquátă ătrên,ăk tăh păv iăvi cădùngăcácăki uăd ăli uătr uăt ngăvàăcácăc uătrúcăđi uăkhi nătrongăngônăng ă
l pătrìnhăđ ămôăt ăgi iăthu t.ă ăb cănày,ănóiăchung,ătaăcóăm tăgi iăthu tă
t ngăđ iărõăràng,ănóăg năgi ngănh ăm tăch ngătrìnhăđ căvi tătrongăngônă
ng ăl pătrình,ănh ngănóăkhôngăph iălàăm tăch ngătrìnhăch yăđ căvìătrongăkhiăvi tăgi iăthu tătaăkhôngăchúătr ngăn ngăđ năcúăphápăc aăngônăng ăvàăcácă
ỆỄ Ố ế ệỄ Ố cònă ăm cătr uăt ngăch ăkhôngăph iălàăcácăkhaiăbáoăcàiăđ tă
ki uătrongăngônăng ăl pătrình
nàyătaădùngăcácăc uătrúcăd ăli uăđ căcungăc pătrongăngônăng ,ăvíăd ăArray,ăRecord, ăđ ăth ăhi năcácăki uăd ăli uătr uăt ng,ăcácăb căc aăgi iăthu tă
đ căth ăhi năb ngăcácăl nhăvàăcácăc uătrúcăđi uăkhi nătrongăngônăng ăl pătrìnhăđ cădùngăđ ăcàiăđ tăgi iăthu t
Tómăt tăcácăb cănh ăsau:
Gi iăthu tăkhôngăhìnhăth c Ch ngătrìnhăngônăng ăgi Ch ngătrìnhăPascal,ăC,
Java
Trongă tină h c,ă tr uă t ngă hóaă ngh aă làă đ nă gi nă hóa,ă làmă choă v nă đ ă (ho că đ iă
t ng)ăsángăs aăh năvàăd ăhi uăh n b ngăcáchăn măb tănh ngăcáiăc ăb nă ăm căt ngă
th ,ăg tăb ăcácăchiăti tăth a Tr uăt ngăhóaălàăcheăđiănh ngăchiăti t,ălàmăn iăb tăcáiă
t ngăth ăTr uăt ngăhóaăcóăth ăth căhi nătrênăhaiăkhíaăc nhălàăỏr Ố ỏ ỉỂ ểóa ế ệỄ Ố
và ỏr Ố ỏ ỉỂ ểóa Ếể ỉỂ ỏrửỉể
Trang 182 Tr uăt ngăhóaăch ngătrình
Tr uăt ngăhóaăch ngătrìnhălàăs ăđ nhăngh aăcácăch ngătrìnhăconăđ ăt oăraăcácăphépătoánătr uăt ng.ăVíăd ,ăcác phép toán s ăh că(c ng,ătr ,ănhân,ăchia) trong máy tínhăđãălàăs ătr uăt ngăhóaăc aăcácăphépătoánătrongăb ănh ătrênăbít,ăbyte,ăd chăchuy n.ăVíăd ăkhác,ăch ngăh nătaăcóăth ăt oăraăm tăch ngătrìnhăconăMatrix_Mult đ ăth căhi năphépătoánănhânăhaiămaătr n.ăSauăkhiăMatrix_mult đãăđ căt oăra,ătaăcóăth ădùngănóănh ă
m tăphépătoánănguyênăth yă(gi ngănh ăphépănhânăhaiăs ănguyên)
Tr uăt ngăhóaăch ngătrìnhăchoăphépăphânăchiaăch ngătrìnhăthànhăcácăch ngătrìnhăcon.ăS ăphânăchiaănàyăs ăcheăd uăt tăc ăcácăl nhăcàiăđ tăchiăti tătrongăcácăch ngătrìnhăcon.ă ăc păđ ăch ngătrìnhăchính,ătaăch ăth yăl iăg iăcácăch ngătrìnhăconăvàă
đi uănàyăđ căg iălàăs ăbaoăgói
Víăd ănh ăm tăch ngătrìnhănhânăhaiămaătr năđ căvi tăb ng tr uăt ngăhóaăcóăth ă
t ngăMatrix t ngăt ănh ăGRAPHăvàăSETă ătrên
Tr uăt ngăhóaăd ăli uălàăđ nhăngh aăcácăki uăd ăli uătr uăt ng
M ỏ ỆỄ Ố ế ệỄ Ố ỏr Ố ỏ ỉỂ (ADT) ệỢ m ỏ mô ểửỉể ỏỊáỉ ể Ế ẾùỉỂ ố Ễ m ỏ ỏ ị ể ị
các phép ỏỊáỉ (ỊịeraỏỊr) ỏr Ố ỏ ỉỂ đ Ế đ ỉể ỉỂể a ỏrỪỉ mô ểửỉể đó.ăVíăd ăt păh pă
s ănguyênăcùngăv iăcácăphépătoánăh p,ăgiao,ăhi uălàăm tăki uăd ăli uătr uăt ng Trongă m tă ADT, cácă phépă toánă cóă th ă th că hi nă trênă cácă đ iă t ngă (toánă h ng)ăkhôngăch ăthu căADTăđó, c ngănh ăk tăqu ăkhôngănh tăthi tăph iăthu căADT.ăTuyănhiênăph iăcóăítănh tăm tătoánăh ngăho căk tăqu ăph iăthu căADTăđangăxét.ă
ADT ệỢ s ỏ ỉỂ qỐáỏ ểỊá Ế a ẾáẾ ỆỄ Ố ế ệỄ Ố ỉỂỐyỪỉ ỏểỐ
ăminhăh a taăcóăth ăxétăb năphácăth oăcu iăcùngăc aăth ăt căGREEDY.ăTaăđãă
dùngăm tădanhăsáchă(LIST)ăcácăs ănguyênăvàăcácăphépătoánătrênădanhăsáchăNewclr là:
Trang 19Câuăl nh M nhăđ ăhìnhăth c
MAKENULL(newclr) newclr=
W=FIRST(newclr) w=ph năt ăđ uătiênătrongănewclr
W=NEXT(w,newclr) w=ph năt ăk ăti pătrongănewclr
INSERT( v,newclr) Thêm v vào newclr
i uănàyăchoăth yăs ăthu năl iăc aăADT,ăđóălàătaăcóăth ăđ nhăngh aăm tăki uăd ăli uă(tr uăt ng)ăc năthi tăcùngăv iăcácăphépătoánătrênănóăr iăchúngătaădùngănh ălàăcácăđ iă
t ngănguyênăthu ăH năn aăchúngătaăcóăth ăcàiăđ tăm tăADTăb ngăb tăk ăcáchănào,ă
ch ngătrìnhădùngăchúngăc ngăkhôngăthayăđ i,ăch ăcóăcácăch ngătrìnhăconăbi uădi năchoăcácăphépătoánăc aăADTălàăthayăđ i.ă
CƠiăđ tăADTălàăs ăth ăhi năcácăphépătoánămongămu nă(cácăphépătoánătr uăt ng)ă
thànhăcácăcâuăl nhăc aăngônăng ăl pătrình,ăbaoăg măcácăkhaiăbáoăthíchăh păvàăcácăth ă
t căth căhi năcácăphépătoánătr uăt ng.ă ăcàiăđ t, taăch năm tăc uătrúcăd ăli u thích
h păcóătrongăngônăng ăl pătrìnhăho călàăm tăc uătrúcăd ăli uăph căh păđ căxâyăd ngălênăt ăcácăki uăd ăli uăc ăb năc aăngônăng ăl pătrình
DATA TYPES)
M că dùă cácă thu tă ng ă ki uă d ă li uă (hayă ki uă - dataă type),ă c uă trúcă d ă li uă (dataăstructure),ă ki uăd ăli uătr uăt ngă(abstractădataătype)ăngheă kháă gi ngănhau,ănh ngăchúngăcóăýăngh aăr tăkhácănhau
Ki uăd ăli u làăm tăt păh păcácăgiáătr ăvàăm tăt păh păcácăphépătoánătrênăcácăgiáătr ă
đó.ăVíăd ăki uăBooleanălàăm tăt păh păcóă2ăgiáătr ăTRUE,ăFALSEăvàăcácăphépătoánătrênă nóă nh ă OR,ă AND,ă NOTă ….ă Ki uă Integeră (trong PASCAL) làă t pă h pă cácă s ănguyênăcóăgiáătr ăt -32768ăđ nă32767ăcùngăcácăphépătoánă+, -, *, /, div, mod …
Ki uăd ăli uăcóăhaiălo iălàăki uăd ăli uăs ăc păvàăki uăd ăli uăcóăc uătrúc Ki uăd ă
li uăs ăc pălàăki uăd ăli uămàăgiáătr ăd ăli uăc aănóălàăđ nănh t.ăVíăd :ăki uăBoolean,ăInteger… Ki uăd ăli uăcóăc uătrúcălàăki uăd ăli uămàăgiáătr ăd ăli uăc aănóălàăs ăk tă
h păc aănhi uăgiáătr ăkhác nhau,ăcùngăki uăho căkhácăki u.ăVíăd :ăARRAYălàăm tăki uă
d ăli uăcóăc uătrúc, ch aănhi uăgiáătr ăcùngăki u;ăRECORDălàăm tăki uăd ăli uăcóăc uătrúcăch aănhi uăgiáătr ăcóăki uăkhácănhau
Cácăngônăng ăl pătrìnhăkhác nhauăcungăc păcácăki uăd ăli uăc ăb năkhácănhau.ăH nă
n a,ăt ăcácăki uăd ăli uăc ăb nănàyăcóăth ăt oăraăcácăki uăd ăli uăcóăc uătrúcăph căh p
h n Cácăki uăd ăli uăcóăc uătrúcăc ăb nă(cungăc păb iăngônăng ăl pătrình)ăvàăcácăc uă
Trang 20trúcăph căh pă(đ căt oăraăt ăcácăki uăd ăli uăc ăb n) g iăchungălàăcácăc uătrúcăd ă
li u
M tăki uăd ăli uătr uăt ng làăm tămôăhìnhătoánăh căcùngăv iăm tăt păh păcácă
phépătoánătrênănó.ăCóăth ănóiăki uăd ăli uătr uăt ngălàăm tăki uăd ăli uădoăchúngătaă
đ nhăngh aă ăm căkháiăni mă(conceptual),ănóăch aăđ căcàiăđ tăc ăth ăb ngăm tăngônă
ng ăl pătrình.ă
Khiăcàiăđ tăm tăki uăd ăli uătr uăt ngătrong m tăngônăng ăl pătrìnhăc ăth ,ăchúngătaăph iăth căhi năhaiăcôngăvi c:
1.ăBi uădi năki uăd ăli uătr uăt ngă( ăm căkháiăni m)ăb ngăm tăc uătrúcăd ăli uă
ho căm tăki uăd ăli uătr uăt ngăkhácăđãăđ căcàiăđ t
2.ăVi tăcácăch ngătrìnhăconăth căhi năcácăphépătoánătrênăki uăd ăli uătr uăt ng Sauăkhiăđãăcàiăđ t,ăki uăd ăli uătr uăt ngăcóăth ăđ căxemănh ăm tăki uă“nguyênă
s ”ă(primitive) c aăngôn ng ăl pătrìnhăvàăcácăphépătoánătrênăki uăd ăli uătr uăt ngăcóă
th ăxemănh ălàăcácăphépătoánă“nguyênăs ”ă– t călàăđãăđ căcàiăđ tăvàăcóăs năđ ădùngătrongăkhiăgi iăcácăbàiătoánăkhác.ăVíăd ,ăsauăkhiăcàiăđ tăLISTă(môăhìnhăcùngăv iăcác
phép toán trên LIST) thì LISTă cóă th ă dùngă càiă đ tă GRAPHă vàă SETă trongă th ă t c GREEDYă ătrên
Trongăgiáoătrình,ăchúngătôiădùngăthu tăng ă“ki uăd ăli uătr uăt ng” đ ănh năm nhăvàoătínhătr uăt ngăc aănó,ănh tălàă ăgiaiăđo năxâyăd ngăkháiăni mătr uăt ng.ăTuyănhiên,ăv ăsau,ăkhiăc uătrúcăđãăđ căcàiăđ tă(theoăm tăcáchănàoăđó) thìăc uătrúcătr uă
t ngăđãăđ căth ăhi năb ngăm tăki uăd ăli uăph căh păc ăth ăvàăvìăv yănóăcóătínhă
“c uătrúcăd ăli u”ăh nălàă“tr uăt ng” Chúngătôiăs ădùngătr năl năhaiăthu tăng ănàyăđ ă
ch ăcácăki uăd ăli uătr u t ngăvàăcácăc uătrúcăxâyăd ngănênăt ăcàiăđ tăcácăki uăd ăli uă
tr uăt ngănày;ăvíăd ,ă“ki uăd ăli uătr uăt ngădanhăsách”ăho că“c uătrúcăd ăli uădanhăsách”ăhayă“c uătrúcădanhăsách”ăchoăg nănh ă
T NGăK TăCH NG
làăvi cămôăhìnhăhóaăbàiătoán.ăSauăkhiăbàiătoánăđãăđ cămôăhìnhăhóa, taăhìnhăth căhóaă
m tăgi iăthu tăđ ăgi iăbàiătoánăd aătrênăki uăd ăli uătr uăt ng.ăGi iăthu tăcóăth ăđ că
di năđ tăb ngăngônăng ăgi ăvàăđ căchiăti t hóaăd nă(m năhóa).ăTrongăkhiăxâyăd ngă
m tăgi iăthu tătaăch ăt pătrungăvàoămôăhìnhăc aăbàiătoán,ăcácăphépătoánătrênămôăhìnhăđóă
ăm cătr uăt ng,ăch aăđ căcàiăđ tătrongăch ngătrình.ăV ăsau,ăkhiăcàiăđ tăki uăd ă
li uătr uăt ngă(môăhìnhăvàăcácăphépătoánătr uăt ng) trongăm tăngônăng ăl pătrình, chúngătaăc năl aăch năcác c uătrúcăd ăli uăthíchăh pă(đ căcungăc pătrongăngônăng ă
l pătrình).ăCácăcàiăđ tăm tăchoăki uăd ăli uătr uăt ngăcóăth ăkhácănhauătùyătheoăc uătrúcăd ăli uăđ căl aăch n.ăTuyănhiênăcácăphépătoánătr uăt ngălàătrongăsu tăđ iăv iă
ng iădùngăvàăkhôngăph ăthu căvàoăcácăc uătrúcăd ăli u.ăChínhăvìăth ăcácăphépătoánă
tr uăt ngăcóăth ăđ cădùngănh ălàăcácă”nguyênăs ”ătrongăthi tăk ăgi iăthu tăv ăsau
Trang 211 Nêuăkháiăni măki uăd ăli u,ăki uăd ăli uătr uăt ng,ăc uătrúcăd ăli u.ăChoăvíă
d ăc ăth ăđ ăminhăh aăt ngăkháiăni m
sangăm tăc căkhácăvàăkhôngăđ căđ tăđ aăl năn mătrênăđ aănh ă(hìnhăI.9)
Hình I.9: Minhăh aăbài toán ThápăHàăN i
a Mô hình hóa bài toán
Trang 22CH NGăII: CỄCăKI UăD ăLI UăTR UăT NGăC ăB N
(BASIC ABSTRACT DATA TYPES)
Môăhìnhătoánăh căc aădanhăsáchălàăm tăt păh păh uăh năcácăph năt ăcóăcùngăm tă
ki u,ămàăt ngăquátătaăg iălàăki uăph năt ă(element type) Taăbi uădi nădanhăsáchănh ălàă
m tăchu iăcácăph năt ăc aănó:ăa1, a2, , an,v iănă 0.ăN uăn=0ătaănóiăếaỉể sáẾể r ỉỂ
(emptyălist).ăN uănă>ă0ătaăg iăa1 làăph năt ăđ uătiênăvàăan là ph năt ăcu iăcùngăc aădanhă
sách.ăS ăph năt ăc aădanhăsáchătaăg iălàăđ ếỢỄ c aădanhăsách
M tătínhăch tăquanătr ngăc aădanhăsáchălàăcácăph năt ăc aădanhăsáchăẾó ỏể ỏ ỏỐy ỉ
ỏíỉể ỏểeỊ ố ỏrí (position)ăxu tăhi năc aăcácăph năt ăTaănóiăaiđ ngătr căai+1, v iăiăt ă1ă
đ năn-1;ăT ngăt ătaănóiăai làăph năt ăđ ngăsauăai-1,ăv iăiăt ă2ăđ năn.ăTaăc ngănóiăai là
ph năt ăt iăv ătríăth ăi,ăhayăph năt ăth ăiăc aădanhăsách
Víăd :ăT păh păh ătênăcácăsinhăviênăc aăl păTINHOCă28ăđ căli tăkêătrênăgi yănh ă
sau:
1.ăNguy n Trung D ngă
2.ăNguy năNg căN ng
2 Các phép toán trên danh sách
ăthi tăl păki uăd ăli uătr uăt ngădanhăsáchă(hayăng năg nălàădanhăsách)ătaăph iă
đ nhăngh aăcácăphépătoánătrênădanhăsách.ăVàănh ăchúngătaăs ăth yătrongătoànăb ăgiáoă
(application).ăVìăv yă ăđâyătaăs ăđ nhăngh aăm tăs ăphépătoánăc ăb nănh tătrênădanhăsách.ă ăthu năti năchoăvi căđ nhăngh aătaăgi ăs ăr ngădanhăsáchăg măcácăph năt ăcóă
ki uălàăki uăph năt ă(ElementType);ăv ătríăc aăcácăph năt ătrongădanhăsáchăcóăki uălàă
ki uă v ă trí (Position); vàă v ă tríă sauă ph nă t ă cu iă cùngă trongă danhă sáchă Lă làăENDLIST(L).ă C nă nh nă m nhă r ngă kháiă ni mă v ă tríă (position)ă làă doă taă đ nhă ngh a
nh măđ ăch ăv ătríăc aăph năt , nóăkhôngăph iălàăgiáătr ăc aăcácăph năt ătrongădanhă
sách V ătríăkhôngănh tăthi tăph iălàăs ănguyên
Cácăphépătoánăđ căđ nhăngh aătrênădanhăsáchălà:ă
position)ătrongădanhăsáchăL.ăT c làăn uădanhăsáchălàăa1,a2, , ap-1, ap , , an
Trang 23thì sau khi xen xăvàoăv ătríăpătaăcóăk tăqu ăa1, a2, , ap-1, x, ap, , an.ăN uă
v ătríăpăkhôngăt năt iătrongădanhăsáchăthìăphépătoánăkhôngăđ căth căhi n
LOCATE(x,L) th căhi năvi căđ nhăv ăph năt ăxă(có ki uălàăki uăph năt ă-
ElementType) đ uătiênătrongădanhăsáchăL.ăLocateătr ăk tăqu ălàăv ătríă(ki uăposition)ăc aăph năt ăxătrongădanhăsách.ăN uăxăkhôngăcóătrongădanhăsáchăthìă
v ătríăsauăph năt ăcu iăcùngăc aădanhăsáchăđ cătr ăv ,ăt călàăENDLIST(L)
sáchăL;ăn uăv ătríăpăkhôngăcóătrongădanhăsáchăthìăk tăqu ăkhôngăxácăđ nhă(cóă
th ăthôngăbáoăl i vàăgiáătr ătr ăv ălà NULL)
DELETE_LIST(p,L) ch ngătrìnhăconăth căhi năvi căxóa ph năt ă ăv ătríăpă
(ki uăposition)ăc aădanhăsách.ăN uăv ătríăpăkhôngăcóătrongădanhăsáchăthìăphépătoánăkhôngăđ căth căhi n vàădanhăsáchăLăs ăkhôngăthayăđ i
n uăpălàăph năt ăcu iăcùngătrongădanhăsáchăLăthìăNEXT(p,L)ăchoăk tăqu ălàăENDLIST(L).ăNextăkhôngăxácăđ nhăn uăpăkhôngăph iălàăv ătríăc aăm tăph nă
t ătrongădanhăsách
trongădanhăsách.ăN uăpălàăph năt ăđ uătiênătrong danh sách thì Previous(p,L) khôngă xácă đ nh.ă Previousă c ngă khôngă xácă đ nhă trongă tr ngă h pă pă khôngă
ph iălàăv ătríăc aăph năt ănàoătrongădanhăsách
danhăsáchăr ngăthìăENDLIST(L)ăđ cătr ăv
choăgiáătr ăFALSE
MAKENULL_LIST(L) kh iăt oăm tădanhăsáchăLăr ng
Trongăthi tăk ăcácăgi iăthu tăsauănàyăchúngătaădùngăcácăphépătoánătr uăt ngăđãă
đ căđ nhăngh aă ăđâyănh ălàăcác phépătoánănguyênăth y.ă
Víăd :ăDùngăcácăphépătoánătr uăt ngătrênădanhăsách,ăvi tăm tăch ngătrìnhăconă
nh năm tăthamăs ălàădanhăsáchăr iăs păx pădanhăsáchătheoăth ăt ăt ngăd n Gi ăs ăcácă
ph năt ătrongădanhăsáchăthu căki uăcóăth ăt (t călàăcóăth ăápăd ng phép so sánh >)
q=NEXT(q,L);
}
Trang 24p=NEXT(p,L);
}
}
RETRIEVE,…)ădoăchúngătaăđ nhăngh a,ănóăch aăđ căcàiăđ tătrongăcácăngônăng ăl pătrình.ăDoăđóăđ ăch ngătrìnhăconăSORT nóiătrênăcóăth ăch yăđ c, taăph iăcàiăđ tăcácă
phép toán này tthànhăcácăch ngătrìnhăconătrongăch ngătrình.ăH năn a,ătrongăkhiăcàiă
đ tăc ăth ,ăm tăs ăthamăs ăhìnhăth cătrongăcácăphépătoánătr uăt ngăkhôngăđóngăvaiătròăgìătrongăch ngătrìnhăconăcàiăđ tăchúng (t călàăkhôngăđ cădùng),ădoăv yătaăcóăth ă
b ăquaănóătrongădanhăsáchăthamăs ăc aăch ngătrìnhăcon.ăVíăd :ăphépătoánătr uăt ngăINSERT_LIST(x,p,L)ăcóă3ăthamăs ăhìnhăth c:ăph năt ămu năthêmăx,ăv ătríăthêmăvàoăpăvàădanhăsáchăđ căthêmăvàoăL.ăNh ngăkhiăcàiăđ tădanhăsáchăb ngăconătr ă(danhăsáchăliênăk tăđ n),ăthamăs ăLălàăkhôngăc năthi tăvìăv iăc uătrúcănàyăch ăcóăconătr ăt iăv ătríăpă
ph iăthayăđ iăđ ăn iăk tăv iăôăch aăph năt ăm i.ăTrongăgiáo trình này,ătaăv năgi ăđúngă
nh ngăthamăs ăhìnhăth căđãăđ nhăngh aătrongăphépătoánătr uăt ngătrong khi càiăđ tăđ ălàmăchoăch ngătrìnhăđ ngănh tăvàătrongăsu t đ iăv iăcácăph ngăphápăcàiăđ tăc aăcùngăm tăki uăd ăli uătr uăt ng Tuy nhiên, trongăth căhành v iăngônăng ăl pătrìnhă
“bi nănàyăđ căkhôngădùng” óăkhôngăph iălàăl iăbiênăd chăc aăch ngătrình,ănênă
đ căgi ăkhôngăc năph iăquanătâmăs aăl i.ă
a Cài đ t danh sách b ng m ng (danh sách đ c)
Danh sách cóăth ăđ căcàiăđ tăb ngăm ngănh ăsau:ăếùỉỂ m ỏ m ỉỂ đ ệ Ố ỂỄ ệỄỪỉ
ỏỄ ị ẾáẾ ịể ỉ ỏ Ế a ếaỉể sáẾể ỏ ố ỏrí đ Ố ỏỄỪỉ Ế a m ỉỂ.ăV iăcáchăcàiăđ tănày,ătaă
ph iă căl ngăs ăph năt ăc aădanhăsáchăđ ăkhaiăbáoăs ăph năt ăc aăm ngăchoăthíchă
h p.ăD ăth yăr ngăs ăph năt ăc aăm ngăph iăđ căkhaiăbáoăkhôngăítăh năs ăph năt ă
c aădanhăsách.ăNóiăchungălàăm ngăcònăth aăm tăs ăch tr ng.ăM tăkhácătaăph iăluôn
l uăgi ăđ ădàiăhi năt iăc aădanhăsách,ăđ ădàiănàyăchoăbi tădanhăsáchăcóăbaoănhiêuăph nă
t ăvàăchoăbi tăph nănàoăc aăm ngăcònătr ngănh ătrongăhìnhăII.1.ăTa đ ỉể ỉỂể a ố ỏrí
Ế a m ỏ ịể ỉ ỏ ỏrỊỉỂ ếaỉể sáẾể ệỢ s ỏể ỏ Ế a ịể ỉ ỏ ỏrỊỉỂ ếaỉể sáẾể Nh ăv yă
trongătr ngăh pănàyă“v ătrí”ăđ căđ nhăngh aălàăs ănguyên.ăC ngăc năph iăth yăr ngă
v ătríănàyăkhôngănh tăthi tăph iălàăch ăs ăc aăm ngăt iăn iăl uătr ăph năt ăCh ngăh nătrongăngônăng ăC,ăch ăs ăc aăm ngăb tăđ uăt ă0,ăvìăv yăph năt ăth ă1ăc aădanhăsáchăcóă(v ătríălàă1)ănh ngăn mătrongăm ngăt iăch ăs ă0,ăph năt ăth ăiă(v ătríălàăi)ăn mătrongă
m ngăt iăch ăs ă(i-1) Trongăngônăng ăl pătrìnhăPASCALăm ngăcóăth ăb tăđ uăb ngăs ă
nguyên tùy ý,ă víă d ă A[10 100] nênă ph nă t ăth ă nh tă c aă danhă sáchă n mă t iă ch ă s ăA[10]ăch ăkhôngăph iălàăA[1]! i măđángăl uătâmănh tălàăcácăph năt ăph iăđ căđ tăvàoăm ngăliênăti pănhau,ăkhôngăcóă“ôătr ng”ătrongăm ngăt ăđ uăchoăđ năcu iădanhă
sách.ăChínhăvìăv yădanhăsáchăv iăcáchăcàiăđ tănàyăcònăđ căg iălàădanh sáẾể đ Ế,ăt că
làă“khôngăr ngă ăgi a”
Trang 25Ch ăs 0 1 … Last-1 … Maxlength-1
…
HìnhăII.1:ăCàiăđ tădanhăsáchăb ngăm ng (danhăsáchăđ c)
V iăhìnhă nhăminhăh aătrên,ăcácăkhaiăbáoăc năthi tălà:
#define MaxLength //S ănguyênăthíchăh păđ ăch ăđ ădàiăc aăm ng
typedefă ăElementType;ă//ki uăc aăph năt ătrongădanhăsách
typedef int Position; //ki uăv ătríăc a cácăph năt
typedef struct {
ElementType Elements[MaxLength]; //m ngăch aăcácăph năt ăc aădanhăsách
Position Last; //gi ăđ ădàiădanhăsách
} List;
Trênăđâyălàăs ăbi uădi năki uăd ăli uătr uăt ngădanhăsáchăb ngăc uătrúcăd ăli uă
m ng.ăPh năti pătheoălàăcác mã (code) càiăđ tăcácăphépătoánăc ăb nătrênădanhăsách
Kh iăt oădanhăsáchăr ngă
Danhăsáchăr ngălàăm tădanhăsáchăkhôngăch aăb tăk ăm tăph năt ănào,ăt călàăđ ădàiădanhăsáchăb ngă0.ăTheoăcáchăkhaiăbáoătrên,ătr ngăLastăch ăv ătríăc aăph năt ăcu iăcùngătrongădanhăsáchăvàăđóăc ngălà đ ădàiăhi năt iăc aădanhăsách,ăvìăv yăđ ăkh iăt oădanhăsáchăr ngătaăch ăvi căgánăgiáătr ătr ngăLastănàyăb ngă0
void MAKENULL_LIST(List& L){
L.Last=0;
}
Cácăb năm iălàmăquenăv iăl pătrìnhăCăc năl uătâmăt iăcúăphápăkhaiăbáoătruy năthamă
s ătrongăth ăt cătrên.ăD uă“&”ănh măđ ăkhaiăbáoătruy nătham s ătheoăki uăthamăchi u,ă
t călàăcácăthayăđ iătrongăch ngătrìnhăconăs ăcònăhi uăl căkhiăch ngătrìnhăconăk tăthúcă( ăđâyăbi năLastăs ăcóăgiáătr ă0ăngayăc ăsauăkhiăch ngătrìnhăconăk tăthúc) Th căraăđóălàăcúăphápăc aăC++.ăTuyănhiênătaăs ăkhôngăđ ăc pănhi uăđ năcácăkhíaăc nhăc aăngônăng ăl pătrìnhă ăđây.ăCácăđo năch ngătrìnhătrongăgiáoătrìnhănàyăđ căbiênăd chă
v iăVisualăC++ă6.0
Ki mătraădanhăsáchăr ng
Danhăsáchăr ngălàăm tădanhăsáchămàăđ ădàiăc aănóăb ngă0 Vìăv yăđ ăki mătraădanhăsáchăr ngătaăc năki mătraăđ ădàiănày.ăHàmăEMPTY_LISTăs ătr ăraăgiáătr ă0ăho că1ătùyătheoăgiáătr ăsoăsánhăc aăLastăv iă0
Trang 26int EMPTY_LIST(List L){
return L.Last==0;
}
Xenăm tăph năt ăvƠoădanhăsách
Khiăxenăph năt ăcóăn iădungăxăvàoăt iăv ătríăpăc aădanhăsáchăL,ătaăc năxétăcác kh ă
n ngăsau:
ph nă t ă cu iă cùngă c aă danhă sáchă n mă ă v ă tríă cu iă cùngă trongă m ng.ă Nóiăcáchăkhác,ăđ ădàiăc aădanhăsáchăb ngăđ ădàiăc aăm ng.ăKhiăđóăkhôngăcònă
ch ăchoăph năt ăm i,ăvìăv yăvi căxenălàăkhôngăth ăth căhi năđ c,ăch ngătrìnhăconăg păl i Lúcănàyăthaoătácăxenăs ăkhôngăđ călàmăvàădanhăsáchăLăs ăkhôngăthayăđ i
l i;
sauă1ăv ătrí
Ch ngătrìnhăconăxenăph năt ăxăvàoăv ătríăpăc aădanhăsáchăLăcóăth ăvi tănh ăsau:
void INSERT_LIST(ElementType X, Position P, List& L){
/*ăD iăcácăph năt ăt ăv ătríăpă(ch ăs ătrongăm ngălàă
(p- 1)ăđ năcu iădanhăsáchăsangăph iă1ăv ătríă*/
for (Q=L.Last;Q>P-1;Q )
L.Elements[Q]=L.Elements[Q-1];
// aăxăvàoăv ătríăp L.Elements[P-1]=X;
//T ngăđ ădàiădanhăsáchălênă1 L.Last++;
} }
L uăýăr ng :ăđ ăd iăcácăph năt ăt ăv ătríăp đ năv ătríăcu iăcùngăc aădanhăsáchăraăsauă1ăv ătrí, thì các ph năt ăph iăđ căd iăm tăcáchăcóăh ăth ng;ăph năt ăcu iăcùngăph iădiă
Trang 27chuy nătr c,ăk ăđ nălàăcácăph năt ătr cănóăm tăcáchătu năt ănh ăđãăđ căcàiăđ tă ă
trên
Xóaăph năt ăraăkh iădanhăsách
ăxóa m tăph năt ă ăv ătríăpăraăkh iădanhăsáchăL, taălàmăcôngăvi căng căl iăv iă
xen
p>L.lastăho căp<1ăthìăđâyăkhôngăph iălàăv ătríăc aăph năt ătrongădanhăsách.ă
t ăcóăv ătríăcu iăcùng trong danh sách ra phía tr căm tăv ătríăvàăđ ădàiădanhăsáchăgi măđiă1ăph năt
Th ăt căxóaăph năt ăcóăv ătríăpătrongădanhăsáchăLăcóăth ăđ căcàiăđ tănh ăsau :
void DELETE_LIST(Position P,List& L){
if ((P<1) || (P>L.Last))
printf("Vi tri khong hop le");
else {
Position Q;
/*D iăcácăph năt ăt ăv ătríăp+1ă(ch ăs ătrongăm ngă
làăp)ăđ năcu iădanhăsáchăv ătr că1ăv ătrí*/
nhăv ăm tăph năt ătrongădanhăsách
ăđ nhăv ăph năt ăx trongădanhăsáchăLă(tìmăph năt ăđ uătiênăcóăn iădungăxătrongă
danh sách L),ătaăti năhànhădòătìmăt ăđ uădanhăsách.ăN uătìmăth yăxăthìăv ătríăc aăph nă
t ătìmăth yăđ cătr ăv ,ăn uăkhôngătìmăth yăthìăhàmătr ăv ăv ătríăsauăv ătríăc aăph năt ă
cu iă cùngă trongă danh sách,ă t că làă ENDLIST(L).ă V iă càiă đ tă b ngă m ngă ă đâyă thìă
ENDLIST(L) là L.Last+1 Trongă tr ngă h pă cóă nhi uă ph nă t ă cùngă giáă tr ă xă trongădanhăsáchăthìăv ătríăc aăph năt ăđ cătìmăth yăđ uătiênăđ cătr ăv ă Nói cách khác,
ch ngătrìnhăconăs ătìmăxăm tăcáchătu năt ăchoăđ năkhiăg păx; ho călàăđiăđ năsauăv ătríă
ph năt cu iăcùngăn uăkhôngăg păx
Position LOCATE(ElementType X, List L){
PositionăPă=ă1;ă//v ătríăph năt ăđ uătiên
/*trongăkhiăch aătìmăth yăvàăch aăk tăthúcă
danhăsáchăthìăxétăph năt ăk ăti p*/
while (P != L.Last + 1)
if (L.Elements[P-1] == X)
Trang 28else
Pă++ă;ă//tìmăti păt căsangăv ătríăk ăti p }
Cácăphépătoánăkhácăc ngăd ădàngăcàiăđ tănênăxemănh ăbàiăt pădànhăchoăb năđ c:
o FIRST(L) tr ăv ă1
o RETRIEVE(P,L) tr ăv L.Elements[P-1]
o ENDLIST(L) tr ăv ăL.Last+1
o NEXT(P,L) tr ăv P+1
Víăd :ăV năd ngăcácăphépătoánătrênădanhăsáchăđ căđ ăvi tăch ngătrìnhănh păvàoă
m tădanhăsáchăcácăs ănguyênăvàăhi năth ădanhăsáchăv aănh păraămànăhình.ăThêmăph nă
t ăcóăn iădungăxăvàoădanhăsáchăt iăvíătríăpă(trongăđóăxăvàăpăđ cănh păt ăbànăphím).ăXóaăph năt ăđ uătiênăcóăn iădungăxă(nh păt ăbànăphím)ăraăkh iădanhăsách
H ngăgi iăquy t :
Gi ăs ătaăđãăcàiăđ tăđ yăđ ăcácăphépătoánăc ăb nătrênădanhăsách.ă ăth căhi năyêuă
c uănh ătrên,ăta c năthi tăk ăthêmăcác phép toán sau:
cácăphépătoánătr uăt ngăc a danh sách)
toán này c ngăch aăcóătrongăcác phépătoánătr uăt ngăc a danh sách
void READ_LIST(List& L){
int n,x;
printf("Nhap so phan tu cua danh sach: ");
scanf("%d",&n);
for (int i=1; i<=n; i++){
printf("nhap phan tu thu %d: ",i);
Bâyă gi ă ch ă c nă s ă d ngă cácă phépă toánă MAKENULL_LIST, INSERT_LIST,
DELETE_LIST, LOCATE và READ_LIST, PRINT_LIST v aănóiătrênălàăcóăth ăgi iăquy tăđ căbàiătoán.ă ăđápă ngăyêuăc uăđ tăra,ătaăvi tăch ngătrìnhăchínhăđ ăn iăk tă
nh ngăch ngătrìnhăconăl iăv iănhauănh ăsau:
int main(){
List L;
ElementType X;
Trang 29Position P;
MAKENULL_LIST(L);ă//Kh iăt oădanhăsáchăr ng
READ_LIST(L);
printf("Danh sach vua nhap: ");
PRINT_LIST(L); // In danh sach len man hinh
printf("Phan tu can them: ");scanf("%d",&X);
printf("Vi tri xen phan tu : ");scanf("%d",&P);
m tă ph nă t ă đ că th că hi nă nh ă th ă nào,ă đ nă gi nă ch ă c nă g iă cácă phépă toánă
INSERT_LIST hay DELETE_LISTă v iă cácă thamă s ă thíchă h p.ă T ă ràyă v ă sau,ă cácăphépătoánătr uăt ngăcóăth ăđ cădùngănh ălàăchúngăđãăcóăs nătrongăngônăng ăl pă
trình
b Cài đ t danh sách b ng con tr (danh sách liên k t đ n)
Cáchăkhácăđ ăcàiăđ tădanhăsáchălàădùngăconătr ăđ ăliênăk tăcácăôăch aăcácăph năt ăTrongăcáchăcàiăđ tănàyăcácăph năt ăc aădanhăsáchăđ căl uătr ătrongăcácăô,ăm iăôăcóă
th ăch ăđ năôăch aăph năt ăk ăti pătrongădanhăsách.ăB năđ căcóăth ăhìnhădungăc ăch ănàyăquaăvíăd ăsau:ă
Gi ăs ă1ăl păcóă4ăb n:ă ông,ăTây,ăNam,ăB căcó đ aăch ăl năl tălàăd,t,n,b.ăGi ăs :ăôngă cóă đ aă ch ă c aă Nam,ă Tâyă khôngă cóă đ aă ch ă c aă b nă nào,ă B că gi ă đ aă ch ă c aăông,ăNamăcóăđ aăch ăc aăTâyă(xemăhìnhăII.2) M tăb năAăgi ăđ aăch ăc aăb năBăthìăcoiănh ălàăAă« ch ăđ n »ăB,ăch ngăh năB căch ăđ nă ôngănh ăm iătênătrongăhìnhăII.2
Hình II.2 :ăC ăch ăliênăk tăcácăph năt ă(« ch ăđ n »)
Trang 30Nh ăv y,ăn uătaăxétăth ăt ăcácăph năt ăb ngăc ăch ă« ch ăđ n » nàyăthìătaăcóăm tă
danh sách: B c,ă ông,ăNam,ăTây.ăH năn aăđ ăcóăth ătìmăđ cădanh sách c ă4ăb n này
thìătaăc năvàăch ăc n gi ăđ aăch ăc aăng iăđ uătiênă(t călàăđ aăch ăc aăB c)
Trongăcàiăđ t,ăđ ăm tăôăcóăth ăch ăđ n ôăkhácătaăcàiăđ tăm iăôălàăm tăm uătină(record
hay struct)ăcóăhaiătr ng:ătr ngăElement gi ăgiáătr ăc aăcácăph năt ătrongădanhăsách;
tr ngăNext làăm tăconătr gi ăđ aăch ăc aăôăk ăti p Tr ngăNext c aăph năt ăcu iă
đ căg iălàăcách càiăđ tăb ngăconătr ăvàădanhăsáchăđ căcàiăđ tănh ăv yăg iălàădanh
sácể ệỄỪỉ Ệ ỏ đ ỉ hayăng năg nălàăếaỉể sáẾể ệỄỪỉ Ệ ỏ
Hình II.3: Danhăsáchăliênăk tăđ n
ăqu nălýădanhăsáchătaăch ăc năm tăbi năgi ăđ aăch ăôăch aăph năt ăđ uătiênăc aădanhăsách,ăt călàăm tăconătr ătr ăđ năph năt ăđ uătiênătrongădanhăsách.ăBi nănàyăg iălàă
Ếể đỄ m đ Ố ếaỉể sáẾể (Header).ă ă đ nă gi nă hóaă v nă đ ,ă trongă chiă ti tă càiă đ t,ă
Header làăm tăbi năcùngăki uăv iăcácăôăch aăph năt ăc aădanhăsáchăvàănóăc ngăđ că
c păphátăôănh ăyănh ăm tăôăch aăph năt ăc aădanhăsáchă(hìnhăII.3).ăTuyănhiênăHeader làăm tăôăđ căbi t, nóăkhôngăch aăph năt ănàoăc aădanhăsách,ătr ngăd ăli uăc aăôănàyălàăr ng,ăch ăcóătr ngăconătr ăNext tr ăt iăôăch aăph năt ăđ uătiênăc aădanhăsách.ăN uă
m tăôăch aăd ăli uăbìnhăth ngănh măt ngătínhăđ năgi năc aăcácăgi iăthu tăthêm,ăxóa cácăph năt ătrongădanhăsách
ăđâyătaăc năphânăbi tărõăgiáătr ăc aăm tăph năt ă(t călàăn iădung)ăvà đ aăch ăc aănóătrongăc uătrúcătrên.ăVíăd ăgiáătr ăc aăph năt ăđ uătiênăc aădanhăsáchătrongăhìnhăII.3ălàă
Giáătr ăvàăđ aăch ăc aăcácăph năt ăc aădanhăsáchătrongăhìnhăII.3ănh ătrongăb ngăsau:
Trang 31Sauă ph nă t ă
(n->Next cóăgiáătr ălàăNULL)
Nh ăđãăth yătrongăb ngătrên,ăđ ăbi tăđ căđ aăch ăc aăph năt ăth ăiătaăph iătruyăxu tă
trongădanhăsáchăliênăk t,ătaăph iăc pănh tăl iăconătr ătr ăt iăôăch aăph năt ăth ăpăđ ănóă
tr ăt iăph năt ăth ăpăm i,ăt călàăph iăc pănh tăl iătr ngăNext trong ôăch aăph năt ăth ă
(p-1) M tăcáchăchínhăxác,ăđ ătruyăc păvàoăph năt ăpătaăc năbi tăđ aăch ăôănh ăch aă
ph năt ăp.ă âyălàăth căch tălàăđ aăch ămáyănênătaătruyăc păthôngăquaăconătr tr ăđ nă
ph năt ăp Conătr ătr ăđ năph năt ăpăn mătrongătr ngăNext c aăôăch aăph năt ă(p-1)
Cho nên đ ăđ năgi nătrongăcácăphépătoán,ătaăđ nhăngh aăv ătríăc aăph năt ăpălƠăđ aăch ă
ôănh ăch aăconătr ătr ăđ năôăch aăph năt ăth ăp Rõăràngăđ aăch ănàyăchínhălàăđ aă
ch ăc aăô ch aăph năt ăth ă(p-1) Cóăth ănóiădi năd chăr ngăv ătríăc aăph năt ăth ă1ălàă
ph năt ăth ă3ălàăconătr ătr ăôăa2,ă ,ăv ătríăph năt ăth ănălàăconătr ătr ăôăch aăan-1.ăV ătríăsauăph năt ăcu iătrongădanhăsách,ăt călàăENDLIST,ăchínhălàăconătr ătr ăôăch aăph năt ă
an (xem hình II.3)
ph năt ăth ăpănàyăn mătrongătr ngăElement c aăôăđ căxácăđ nhăb iăP->Next Nói
cách khác P-> Next-> Element ch aăn iădungăc aăph năt ă ăv ătríăpătrongădanhăsách
Các khai báoăc năthi tălƠ
typedefă ăElementType;ă//ki uăc aăph năt ătrongădanhăsách
typedef struct Node{
ElementTypeăElement;//Ch aăn iădungăc aăph năt
Node*ăNext;ă//conătr ăch ăđ năph năt ăk ăti pătrongădanhăsách
};
typedefăNode*ăPosition;ă//ăKi uăv ătrí
typedef Position List;
T oădanhăsáchăr ng
Nh ăđãănóiă ăph nătrên,ătaădùngăHeader nh ălàăm tăbi năconătr ăcóăki uăgi ngănh ă
ki uă c aă m tă ôă ch aă m tă ph nă t ă c aă danhă sách.ă Tuyă nhiênă tr ngă Element c aă
Header khôngăbaoăgi ăđ cădùng,ăch ăcóătr ngăNext dùngăđ ătr ăt iăôăch aăph năt ă
đ uătiênăc aădanhăsách.ăV yăn uănh ădanhăsáchăr ngăthìăôăHeader v năph iăt năt iăvàăôă
void MAKENULL_LIST(List& Header){
Trang 32Ki mătraăm tădanhăsáchăr ng
Danhăsáchăr ngăkhôngăch aăph năt ănào,ăkhiăđóătr ngăNext trong ô Header tr ăt iă
cóăph iălàăNULLăhayăkhông L uăý r ng,ăHeader ch ălàăm tăkháiăni măđ ăch ăm tăconă
tr ătr ăvàoăđ uădanhăsách.ăTrongăkhiăcàiăđ tăm tădanhăsáchăc ăth ,ăvíăd ădanhăsáchăL,ăthìăLăchínhălàăch ăđi măđ uăc aădanhăsách
int EMPTY_LIST(List L){
return (L- >Next==NULL);ă//LăchínhălàăHeaderăc aădanhăsáchăL
}
Xenăm tăph năt ăvƠoădanhăsách
Xenăm tăph năt ăcóăgiáătr ăxăvàoădanhăsáchăLăt iăv ătríăP taăph iăc păphátăm tăôăm iă
đ ăl uătr ăph năt ăm iănàyăvàăn iăk tăl iăcácăconătr ăđ ăđ aăôăm iănàyăvàoăv ătríăP.ăS ă
đ ăn iăk tăvàăth ăt ăcácăthaoătácăđ căchoătrongăhìnhăII.4.ă
HìnhăII.4:ăThêmăm tăph năt ăvàoădanhăsáchăt iăv ătríăP
void INSERT_LIST(ElementType X, Position P, List& L){
Trang 33Xóaăph năt ăraăkh iădanhăsáchă
Hình II.5: Xóa ph năt ăt iăv ătríăp
T ngăt ănh ăkhiăxenăm tăph năt ăvàoădanh sáchăliênăk t,ămu năxóaăm tăph năt ă
kh iădanhăsáchătaăc năbi tăv ătríăP c aăph năt ămu năxóaătrongădanhăsáchăL.ăN iăk tăl iăcácăconătr ăb ngăcáchăchoăP tr ăt iăph năt ăđ ngăsauăph năt ăth ăP Trong các ngôn
ng ăl pătrìnhăkhôngăcóăc ăch ăthuăh iăvùngănh ăt ăđ ngănh ăngônăng ăPascal,ăCăthìătaă
ph iăthuăh iăvùngănh ăc aăôăb ăxóaăm tăcácăt ngăminhătrongăgi iăthu t.ăTuyănhiênăvìătínhăđ năgi năc aăgi iăthu tăchoănênăđôiăkhiăchúngătaăkhôngăđ ăc păđ năvi căthuăh iăvùngănh ăchoăcácăôăb ăxóa.ăChiăti tăvàătrìnhăt ăcácăthaoătácăđ ăxóa m tăph năt ătrongădanhăsáchăliênăk tănh ătrongăhìnhăII.5.ăCh ngătrìnhăconăcóăth ăđ căcàiăđ tănh ăsau:
void DELETE_LIST(Position P, List& L){
Position T;
if (P->Next!=NULL){
T=P- >Next;ă//gi ăôăch aăph năt ăb ăxóa đ ăthuăh iăvùngănh P->Next=T- >Next;ă//n iăk tăconătr ătr ăt iăph năt ăth ăp+1 free(T);ă//thuăh iăvùngănh
}
}
nhăv ăm tăph năt ătrongădanhăsáchăliênăk t
ăđ nhăv ăph năt ăxătrongădanhăsáchăL, taăti năhànhătìmăt ăđ uădanhăsách (t ăv ătríă
c aăph năt ăđ uătiênă- t călà ô Header) N uătìmăth yăthìăv ătríăc aăph năt ăđ uătiênă
đ cătìmăth yăs ăđ cătr ăv , n uăkhôngăthìăENDLIST(L) đ cătr ăv ăN uăxăcóătrongă
danh sách và hàmăLocateătr ăv ăv ătríăP thì x chính là P->Next->Element
Position LOCATE(ElementType X, List L){
Position P = L;
while (P->Next != NULL)
if (P->Next->Element == X) break;ă//ăng ngăt iăv ătríăP;
else P = P->Next;
return P;
}
Th căch t,ăkhiăg iăhàmăLOCATE ătrênătaăcóăth ătruy năgiáătr ăchoăLălàăb tăk ăgiáă
tr ănào.ăN uăLălàăHeader thìăch ngătrìnhăconăs ătìmăxăt ăđ uădanhăsách.ăN uăLălàăm tă
v ătríăP b tăk ătrongădanhăsáchăthìăhàm LOCATE s ăti năhànhăđ nhăv ăph năt ăxăt ăv ătríă
“đ măs ăl năxu tăhi năc aăxătrongădanhăsách”ăb ngăcáchăg iăhàmăLOCATEă ătrên
Trang 34L yăgiáătr ăc aăph năt
Giáă tr ă (n iă dung)ă c a ph nă t ă đangă l uă tr ă t iă v ă tríă pă trongă danhă sáchă Lă làă
p->Next->Element Doăđó,ăhàmăs ătr ăv ăgiáătr ăp->Next->Elementăn uăph năt ăcóăt nă
ElementType RETRIEVE(Position P, List L){
if (P->Next!=NULL)
return P->Next->Element;
//elseăreturnăm tăgiáătr ănàoăđóăth ăhi năNULLătùyătheoăki uăph năt
}
a S oăsánhăhaiăph ngăphápăcƠiăđ t danh sách nêu trên
Khôngăth ăk tălu năph ngăphápăcàiăđ tănàoăhi uăqu ăh n,ămàănóăhoànătoànă tùy thu căvàoăt ngă ngăd ngăhayătùy thu căvàoăcácăphépătoánătrênădanhăsách.ăTuyănhiênătaăcóăth ăt ngăk tăm tăs ă uănh căđi măc aăt ngăph ngăphápălàmăc ăs ăđ ăl aăch n
ph ngăphápăcàiăđ tăthíchăh păchoăt ngă ngăd ng:
khôngăth ă căl ngăđ căs ăph năt ătrongădanhăsáchăthìăkhóăápăd ngăcáchăcàiăđ tănàyă m tăcáchă hi uăqu ăvìăn uăkhaiă báoăthi uăch ăthìă m ngăth ngăxuyênăb ăđ y,ăkhôngăth ălàmăvi căđ căcònăn uăkhaiăbáoăquáăth aăthìălãngăphíăb ănh
th ăr ngăho căl nătùy ýăch ăph ăthu căvàoăb ănh ăt iăđaăc aămáy.ăTuyănhiênătaăph iăt năthêmăvùngănh ăchoăcácăconătr ă(tr ngăNext)
điăsauăv ătríăxen ho c xóa.ăTrongăkhiăcàiăđ tăb ngăconătr ăcácăphépătoánănàyă
m tăch ăm tăh ngăth iăgian
PREVIOUS,ăch ăt năm tăh ngăth iăgianăđ iăv iăcàiăđ tăb ngăm ng,ătrongăkhiă
đ iăv iădanhăsáchăcàiăđ tăb ngăconătr ătaăph iătìmăt ăđ uădanhăsáchăchoăđ nă
v ătríătr căv ătríăc aăph năt ăhi năhành Nóiăchungădanhăsáchăliênăk t thích
h păv iădanhăsáchăcóănhi uăbi năđ ng,ăt călàătaăth ngăxuyênăthêm,ăxóa các
ph năt
c Cài đ t b ng con nháy
M tăs ăngônăng ăl pătrìnhăkhôngăcungăc păki uăconătr ăTrongătr ngăh pănàyătaăcóă
th ă"gi "ăconătr ăđ ăcàiăđ tădanhăsáchăliênăk t.ăÝăt ngăchínhălà:ădùngăm ngăđ ăch aăcácăph năt ăc aădanhăsách,ăcácă"conătr "ăs ălàăcácăbi năs ănguyênă(int)ăđ ăgi ăch ăs ă
c aăph năt ăk ăti pătrongăm ng.ă ăphânăbi tăgi aă"conătr ăth t"ăvàă"conătr ăgi "ătaăg iăcácăconătr ăgi ănàyălàăcon nháy (cursor).ăNh ăv y, đ ăcàiăđ tădanhăsáchăb ngăconănháyătaăc năm tăm ngămàăm iăph năt ăxemănh ălàăm tăôăg măcóăhaiătr ng:ătr ngăElement
nh ăthôngăl ăgi ăgiáătr ăc aăph năt ătrongădanhăsáchă(cóăki uăElementType)ătr ngă
Next là con nháy đ ăch ăt iăv ătríătrongăm ngăc aăph năt ăk ăti p.ăCh ngăh năhìnhăII.6ă
Trang 35bi uădi năchoăm ngăSPACEăđangăch aăhaiădanhăsáchăL1, L2.ă ăqu nălíăcácădanhăsáchătaă c ngă c nă m tă conă nháyă ch ă đ nă ph nă t ă đ uă c aă m iă danhă sáchă (t ngă t ă nh ă
Header trongădanhăsáchăliênăk t).ăPh năt ăcu iăcùngăc aădanhăsáchătaăcho ch ăt iăgiáătr ă
nàoăcóăch ăs ă-1
Trong hình II.6, danh sách L1 g mă3ăph năt ă:ăF, O, R.ăCh ăđi măđ uăc aăL1 là con
nàyăcóăgiáătr ă1ălàăôăl uătr ăph năt ăk ăti pă(t călàăo).ăTr ngăNext t iăôăch aăoălàă4ălàăôă
l uătr ăph năt ăk ăti pătrongădanhăsáchă(t călàăr).ăCu iăcùngătr ngăNext c aăôănàyă
sáchăđ căcàiăđ tătheoăẾ Ếể ếaỉể sáẾể ệỄỪỉ Ệ ỏ i măkhácăbi tălàădanhăsáchăkhôngă
cóăch ăđi măđ uăth căs ă(t călà,ăkhôngăcó Header),ăthayăvàoăđóătaăch ăcóăm tăbi năs ănguyênăgi ăch ăs ăm ngăch aăph năt ăđ uătiênăc aădanhăsách
HìnhăII.6ăM ngăđangăch aăhaiădanhăsáchăL1 và L2
Khiăxenăm tăph năt ăvàoădanhăsáchătaăl yăm tăôătr ngătrongăm ng (ôăkhôngăch aă
b tăk ăph năt ănàoăc aăb tăk ădanhăsáchănàoăđangăch aătrongăm ng)ăđ ăch aăph năt ă
m iănàyăvàăn iăk tăl iăcácăconănháy.ăNg căl i,ăkhiăxóa m tăph năt ăkh iădanhăsáchătaă
n iăk tăl iăcácăconănháyăđ ălo iăph năt ănàyăkh iădanhăsách,ăđi uănàyăkéoătheoăs ăôă
tr ngătrongăm ngăt ngălênă1.ăV năđ ălàălàmăth ănàoăđ ăqu nălíăcácăôătr ngănàyăđ ăbi tăôă
nàoăcònătr ngăôănàoăđãădùng?ăm tăgi iăphápălàăệỄỪỉ Ệ ỏ ỏ ỏ Ế ẾáẾ ô ỏr ỉỂ ốỢỊ m ỏ ếaỉể
sáẾể đ Ế bỄ ỏ Ể Ễ ệỢ Available Khiăxenăm tăph năt ăvàoădanhăsáchătaăl yăôătr ngăđ uă
Trang 36Available đ ăch aăph năt ăm iănày.ăKhiăxóa m tăph năt ăt ăm tădanhăsáchătaăchoăôăb ă
xóa n iă vàoă đ uă Available.ă T tă nhiênă khiă m iă kh iă đ uă vi că xâyă d ngă c uă trúcă thìă
m ngăch aăch aăph năt ănàoăc aăb tăk ăm tădanhăsáchănào.ăLúcănàyăt tăc ăcácăôăc aă
m ngăđ uălàăôătr ng,ăvàănh ăv y,ăt tăc ăcácăôăđ uăđ căliênăk tăvàoătrongăAvailable
Vi căkh iăt oăAvailable banăđ uăcóăth ăth căhi năb ngăcáchăđ năgi nălàăchoăph năt ă
th ăiăc aăm ngătr ăt iăph năt ăth ăi+1
Cácăkhaiăbáoăc năthi tăchoădanhăsách
#defineăMaxLengthă ă//Chi uădàiăm ng
#define Null -1 //Gia tri Null
typedefă ăElementType;ă/*ki uăc aăcácăph năt ătrongădanhăsách*/
typedef struct{
ElementTypeăElement;ă/*tr ngăch aăph năt ătrongădanhăsách*/
intăNext;ă//conănháyătr ăđ năph năt ăk ăti p
} Node;
Node Space[MaxLength]; //Mang toan cuc
intăAvailable;ă//ch ăđi măđ uădanhăsáchăôătr ng
HìnhăII.7:ăKh iăt oăAvailableăbanăđ u
Kh iăt oăc uătrúcăậ Thi tăl păAvailable banăđ u
Taăchoăph năt ăth ă0ăc aăm ngătr ăđ năph năt ăth ă1;ăph năt ăth ă1ătr đ năph năt ă
th ă2; ; ph năt ăcu iăcùngătr ăNull.ăCh ăđi măđ uăc aăAvailable làă0ănh ătrongăhìnhă
Trang 37Th căch tăc aăvi căxenăhayăxóa m tăph năt ătrongădanhăsáchăcàiăđ tăb ngăconănháyălàăth căhi năvi căchuy năm tăôăt ădanhăsáchănàyăsangădanhăsáchăkhác.ăCh ngăh n, khi
đóăsangăAvailable, thao tác này xemănh ălàăgi iăphóngăb ănh ăb ăchi măb iăph năt ănày.ăDoăđóăt tănh tătaăvi tăm tăhàmăth căhi năthaoătácăchuy năm tăôăt ădanhăsáchănàyăsangădanhăsáchăkhácăvàăhàmăchoăk tăqu ălàă1ăho că0 tùyătheoăchuy năthànhăcôngăhayă
th tăb i.ăHàmăs ătr ăv 0ăn uăchuy năkhông thành công (l i)ăvàăs ătr ăv ă1ăn uăchuy nă
thành công Hàm Move sauăđâyăth căhi năchuy năôăđ cătr ăt iăb iăconănháyăPăvàoădanhăsáchăkhácăđ cătr ăb iăconănháyăQ HìnhăII.8ătrìnhăbàyăcácăthaoătácăc ăb năđ ăchuy năm tăô t ăm tădanhăsáchăsang danh sách khác
Hình II.8: Chuy nă1ăôăt ădanhăsáchănàyăsangădanhăsáchăkhácă(cácăliênăk tăv ăb ngănétăđ tă
bi uădi năchoăcácăliênăk tăc ă- tr căkhiăgi iăthu tăb tăđ u)
Trongăcáchăcàiăđ tăb ngăconănháy, kháiăni măv ătrí t ngăt ănh ăkháiăni măv ătríă
trongătr ngăh păcàiăđ tăb ngăconătr T călà,ăv ătríăc aăph năt ăth ăi trong danh sách làăch ăs ăc aăôătrongăm ngăch aăconănháyătr ăđ năôăch aăph năt ăth ăi.ă
Trang 38Víăd ăxétădanhăsáchăL1 trongăhìnhăII.ă6,ăv ătríăc aăph năt ăth ă2ătrongădanhăsáchă(ph năt ăcóăgiáătr ăO)ălàă5,ăkhôngăph iălàă1;ăv ătríăc aăph năt ăth ă3ă(ph năt ăcóăgiáătr ă
là Null=-1,ăvìăkhôngăcóăôănàoătrongăm ngăch aăconănháyătr ăđ năôăch aăph năt ăF
nguyênăch ăôăch aăph năt ăđ uătiênăc aădanhăsách,ăch ăkhôngăph iălàăs ănguyênăch ăôă
ch aăconănháyătr ăđ năph năt ăđ uătiênăc aădanhăsách.ăVìăv y,ăv ăb năch tăcácăch ă
đi măđ uănàyăkhácăv iăHeader trongăcàiăđ tădanhăsáchăliênăk t.ăTrongăcàiăđ tădanhăsáchăliênăk tăđ nă ătrên,ăkhiădanhăsáchăr ng thì Header v năt năt iăvàăconătr ăNext c aă
nó là NULL (Headrer-> Next làăNULL).ăTrongăcàiăđ tăconănháyă ăđây,ăcácăch ăđi mă
khôngăph iălàăspace[L1].Next là Null
Xenăm tăph năt ăvƠoădanhăsách
Mu năxenăm tăph năt ăvàoădanhăsáchătaăc năbi tăv ătríăxen,ăgi ăs ălà p; ta s ăchuy năôăđ uăc aăAvailable vàoăv ătríănày Chúăýăr ngăv ătríăc aăph năt ăđ uătiênătrongădanhăsáchăđ căđ nhăngh aălàăNull,ădoăđóăn uăp=Null thì th căhi năvi căthêmăvàoăđ uădanhă
sách
void INSERT_LIST(ElementType X, int P, int& L){
if (P==Null) {//Xen dau danh sach
Xóa m tăph năt ătrongădanhăsách
Mu năxóa m tăph năt ăt iăv ătríăpătrongădanhăsáchătaăch ăc năchuy năôăch aăph năt ă
t iăv ătríănàyăvàoăđ uăAvailable.ăT ngăt ănh ăphépăthêmăvào,ăn uăp=Null thì xóa ph nă
t ăđ uădanhăsách
void DELETE_LIST(int p, int& L){
if (p== Null) //Neu la o dau tien
{
if (!Move(L,Available))
printf("Loi trong khi xoa");
// else Khong lam gi ca }
else
if (!Move(Space[p].Next,Available))
printf("Loi trong khi xoa");
//else Khong lam gi ca }
Trang 39II NG NăX Pă(STACK)
Ng năx pă(Stack)ălàăm tădanhăsáchămàăvi căthêmăvàoăho călo iăb ăm tăph năt ăch ă
th căhi năt iăm tăđ uăc aădanhăsách,ăđ uănàyăg iălàăđ nhă(TOP)ăc aăng năx p
Taăcóăth ăxemăhìnhă nhătr căquanăc aăng năx păb ngăm tăch ngăđ aăđ tătrênăbàn.ă
Mu năthêmăvàoăch ngăđóă1ăđ a, taăđ ăđ aăm iătrênăđ nhăch ng; mu năl yăcácăđ aăraă
kh iăch ngătaăc ngăph iăl yăđ aătrênătr c.ăNh ăv yăng năx pălàăm tăc uătrúcăcóătínhă
ch tă“vàoăsauă- raătr c”ă- L IF O (last in - first out )
MAKENULL_STACK(S): t oăm tăng năx păr ng
TOP(S) hàmătr ăv ăph năt ăt iăđ nhăng năx p.ăN uăng năx păr ngăthìăk tăqu ă
c aăhàmăkhôngăxácăđ nh
POP(S) xóa m tăph năt ăt iăđ nhăng năx p.ă
PUSH(x,S) thêmăm tăph năt ăxăvàoăđ uăng năx p
EMPTY_STACK(S) ki mătraăng năx păr ng.ăHàmăchoăk tăqu ă1ă(true)ăn uă
ng năx păr ngăvàă0ă(false)ătrongătr ngăh păng căl i
Nh ăđãănóiăt ătr c,ăkhiăthi tăk ăgi iăthu tătaăcóăth ădùngăcácăphépătoánătr uăt ngă
nh ălàăcácă"nguyênăs "ămàăkhôngăc năph iăđ nhăngh aăl iăhayăgi iăthíchăthêm.ăTuyănhiênăđ ăgi iăthu tăđóăthànhăch ngătrìnhăch yăđ căthìătaăph iăch năm tăc uătrúcăd ă
li uăh pălý đ ăcàiăđ tăcácă"nguyênăs " này
Víăd : Vi tăch ngătrìnhăconăEditănh năm tăchu iăkíăt ăt ăbànăphímăchoăđ năkhiăg pă
kíăt ă@ăthìăk tăthúcăvi cănh păvàăinăk tăqu ătheoăth ăt ăng căl i
Trang 40a Cài đ t ng n x p b ng danh sách
Doă ng nă x pă làă m tă danhă sáchă đ că bi tă nênă taă cóă th ă s ă d ngă ki uă d ă li uă tr uă
t ngădanhăsáchăđ ăcàiăđ tăng năx p Th căch tăvi căcàiăđ t nàyăch ălàăth căhi năcácă
l iăg iăcácăphépătoánăđãăđ căđ nhăngh aăchoădanhăsáchăm tăcáchăđúngăđ năđ ăh năch ă
vi căvàoăraătrênădanhăsáchăch ăt iăm tăđ u.ă
Tr căh tătaăcóăth ăkhaiăbáoăng năx pănh ălà danh sách:
typedef List Stack;
Sauăđó,ăth căhi năcácăl iăg iăhàmătrênădanhăsáchăh pălíăđ ăth căhi năcácăphépătoánătrênăng năx p
T oăng năx păr ng
Ng năx păr ngăc ngăcóăngh aălàădanhăsáchăr ng,ăvìăv y:ă
void MAKENULL_STACK(Stack& S){
MAKENULL_LIST(S);
}
Ki mătraăng năx păr ng
Ki mătraăng năx păr ngăđ ngăngh aăv iăki mătraădanhăsáchăr ng
int EMPTY_STACK(Stack S){
return EMPTY_LIST(S);
}
Thêmăph năt ăvƠoăng năx p
Thêmă1ăph năt ăvàoăng năx p t călàăthêmăm tăph năt ăvàoăđ uădanhăsách
void PUSH(Elementtype X, Stack& S){
INSERT_LIST (x, First (S), S);
}
Xóaăph năt ăraăkh iăng năx p
Xóaăm tăph năt ătrongăng năx păchínhălàăxóaăph năt ăđ uătiênătrongădanhăsách.ă
void POP (Stack& S){
DELETE_LIST (First (S), S);
}
Rõ ràngăr ng,ăchúngătaăkhôngăc năt nănhi uăcôngăs căchoăvi căcàiăđ tăng năx p.ă
Tuy nhiên,ăvi căcàiăđ tădanhăsáchă(t ngăquát)ăsauăđóălàmăcácăl iăg iă“h năch ”ăl iăđ ăcóăng năx pălàăvi că“l yădaoăm ătrâuăđ ăgi tăru i”.ă ăt ngătínhăđ năgi n,ăhi uăqu ăc aă
ng năx pătaăcóăth ăcàiăđ tăng năx pătr căti păt ăcácăc uătrúcăd ăli uănh ătrình bày trong cácăph năsau