You are on page 1of 178

LU NGUYN K TH CU TRC D LIU V GII THUT

P
a
g
e
1

GII THIU MN HC
Trong ngn ng lp trnh, d liu bao gm hai kiu chnh l{ :
- Kiu d liu n gin : char, int, long, float, enumeration, subrange.
- Kiu d liu c cu trc : struct, array, file (kiu d liu c kch thc khng
i)...
Gi|o trnh n{y tp trung v{o vic nghin cu c|c kiu d liu c cu trc c kch
thc khng i hoc thay i trong ngn ng lp trnh, m t thng qua ngn ng C.
Ngo{i ra cn gii thiu c|c gii thut chung quanh c|c cu trc d liu n{y nh c|ch t
chc, thc hin c|c php to|n tm kim, sp th t ni, sp th t ngoi...
iu kin c th tm hiu r r{ng v mn hc n{y l{ hc vin ~ bit c|c kh|i
nim v k thut lp trnh trn ngn ng C. Trong phn m u, b{i ging n{y s gii
thiu c|ch thc ph}n tch & thit k mt gii thut trc khi tm hiu v c|c cu trc d
liu c th.
V{o cui kha hc, sinh vin c th:
- Ph}n tch phc tp ca c|c chng trnh c kch thc nh v{ trung bnh.
- Nhn thc c s cn thit ca vic thit k cu trc d liu.
- L{m quen vi c|c kh|i nim stacks, queues, danh s|ch c, danh s|ch lin kt,
c}y nh ph}n, c}y nh ph}n tm kim, ....
- Hiu c nguyn l ca vic x}y dng mt chng trnh m|y tnh.
- C th chn la vic t chc d liu ph hp v{ c|c gii thut x l d liu c
hiu qu trong khi x}y dng chng trnh. Sinh vin cn lu rng, ty v{o cng vic c
th m{ ta nn chn cu trc d liu n{o l{ thch hp theo hng ti u v thi gian thc
hin hay ti u v b nh.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2

CHNG I
PHN TCH & THIT K
GII THUT
I. M U
Hu ht c|c b{i to|n u c nhiu gii thut kh|c nhau gii quyt chng. Vy l{m
th n{o chn c mt gii thut tt nht ?
Vic chn la ph thuc v{o nhiu yu t nh : phc tp tnh to|n ca gii
thut, chim dung lng b nh, tn sut s dng, tnh n gin, tc thc hin...
Thng thng mc tiu chn la l{ :
1. Gii thut r r{ng, d hiu, d m~ ha v{ hiu chnh.
2. Gii thut s dng c hiu qu t{i nguyn ca m|y tnh v{ c bit chy c{ng
nhanh c{ng tt.
Do khi vit chng trnh chy mt ln hoc t chy th mc tiu 1 l{ quan
trng hn c.
Ngc li khi vit chng trnh chy nhiu ln th ph tn chy chng trnh c
th vt qu| ph tn lp chng trnh, nht l{ khi phi nhp nhiu s liu. Ni chung,
ngi lp trnh phi bit chn la, vit, |nh gi| c|c gii thut c c gii thut ti
u cho b{i to|n ca mnh.
II. NH GI THI GIAN CHY CA CHNG TRNH
Thi gian chy ca chong trnh ph thuc v{o :
1. Input cho chng trnh
2. Cht lng m~ sinh ra ca chng trnh dch.
3. Trng th|i v{ tc ca c|c lnh chy trn m|y.
4. phc tp thi gian ca gii thut.
iu 1 l{ chc nng nhp. Kch thc ca input (v d l{ n) v{ ta thng k hiu
T(n) l{ i lng thi gian cn thit gii b{i to|n kch thc n.
iu 2, 3 thng |nh gi| kh khn v ph thuc v{o phn mm chng trnh dch
v{ phn cng ca m|y.
iu 4 l{ iu m{ ngi lp trnh cn kho s|t l{m tng tc ca chng trnh.
III. K HIU O(n) V O(n) :
Ta |nh gi| t l ph|t trin c|c h{m T(n) qua k hiu O(n).
Ta ni thi gian chy T(n) ca chng trnh l{ O(n
2
) c ngha l{ :
- c > 0 v n0 sao cho n > n0 ta c T(n) s c.n
2
.
V d : Gi s T(0) = 1, T(1) = 4, v v...
Tng qu|t T(n) = (n +1)
2
th ta ni T(n) l O(n
2
) v c th t c1 = 4, n0 = 1, th khi n
> 1 ta c (n +1)
2
s 4n
2
.
Nhng khng th ly n0 = 0 v T(0) = 1 khng nh hn c.0
2
= 0,c; gi thit rng n >
0 v T(n) > 0.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3

Ta ni T(n) l O(f(n)) nu - const c v n0 sao cho T(n) s c.f(n), n > n0.
Chng trnh chy vi thi gian O(f(n)) ta ni n ph|t trin t l vi f(n). Khi ni
T(n) l{ O(f(n)) th f(n) l{ chn trn ca T(n).
ni chn di ca T(n) ta dng k hiu O.
Ta ni T(n) l O(g(n)) nu - const c, n0 sao cho T(n) > c.g(n), n > n0.
V d : kim tra T(n) = n
3
+ 2n
2
l O(n
3
) ta t c = 1 th T(n) > c.n
3
, n = 0, 1,...
(no= 0).
* S tr|i ngc ca t l ph|t trin :
Ta gi s c|c chng trnh c th |nh gi| bng c|ch so s|nh c|c h{m thi gian ca
chng vi c|c hng t l khng |ng k. Khi ta ni chng trnh c thi gian chy
O(n
2
). Nu chng trnh 1 chy mt 100.n
2
thi gian (mili gi}y) th chng trnh 2 chy
mt 5.n
3
thi gian, th ta c t s thi gian ca 2 chng trnh l{ 5.n
3
/100.n
2
= n/20,
ngha l{ khi n = 20 th thi gian chy 2 chng trnh l{ bng nhau, khi n < 20 th chng
trnh 2 chy nhanh hn chng trnh 1. Do khi n > 20 th nn dng chng trnh 1.
V d : C 4 chng trnh c 4 phc tp kh|c nhau c biu din trong bng
di }y.
Thi gian chy
T(n)
Kch thc b{i to|n
ti a cho 10
3
s
Kch thc b{i to|n
ti a cho 10
4
s
T l tng v kch
thc
100.n 10 100 10.0 ln
5.n
2
14 45 3.2 ln
n
3/2
12 27 2.3 ln
2
n
10 13 1.3 ln
Gi s trong 10
3
s th 4 chng trnh gii c|c b{i to|n c kch thc ti a trong ct
2. Nu c m|y tt tc tng ln 10 ln th kch thc ti a tng ng ca 4 chng
trnh trnh b{y ct 3. T l hai ct 1,2 ghi ct 4. Nh vy nu u t v tc 10 ln
th ch thu li c 30% v kch thc b{i to|n nu dng chng trnh c phc tp
O(2
n
).
IV. CCH TNH THI GIAN CHY CHNG TRNH :
1. Qui tc tng:
Gi s T1(n) v T2(n) l{ thi gian chy chng trnh P1 v P2 tng ng c |nh
gi| l{ O(f(n)) v{ O(g(n)). Khi T1(n) + T2(n) s l{ O(max(f(n),g(n))) (chy xong chng
trnh P1 th chy P2).
Chng minh:
Theo nh ngha O(f(n)) v{ O(g(n)) th - c1, n1, c2, n2 sao cho
T1(n) s c1.f(n) n > n1 ; T2(n) s c2.g(n) n > n2.
t n0 = max(n1, n2)
Nu n > no th T1(n) + T2(n) s (c1 + c2).max(f(n),g(n)).
2. Qui tc tch:
T1(n). T2(n) l O(f(n).g(n)).
Chng minh : tng t nh tng.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4

V d : C 3 chng trnh c thi gian chy tng ng l{ O(n
2
), O(n
3
), O(n.logn).
Th th thi gian chy 3 chng trnh ng thi l{ O(max(n
2
, n
3
, nlogn)) s l{ O(n
3
).
Ni chung thi gian chy mt d~y c nh c|c bc l{ thi gian chy ln nht ca
mt bc n{o trong d~y. Cng c trng hp c 2 hay nhiu bc c thi gian chy
khng tng xng (khng ln hn m{ cng khng nh hn). Khi qui tc tnh tng
phi c tnh trong tng trng hp.
{ n
4
nu n chn
V d : f(n) =
n
2
nu n l
g(n) = { n
2
nu n chn

n
3
nu n l
Thi gian chy l{ O(max(f(n),g(n))) l{ n
4
nu n chn v{ n
3
nu n l.
Nu g(n) s f(n), n > no, no l{ const n{o th O(f(n)+g(n)) s l{ O(f(n)).
V d : O(n
2
+ n) = O(n
2
)
Trc khi a ra qui tc chung ph}n tch thi gian chy ca chng trnh th ta
xt v d n gin sau.
V d : Xt chng trnh Bubble dng sp d~y s nguyn theo chiu tng.
Procedure Bubble (var A: array [1..n] of integer);
Var i, j, temp : integer ;
Begin
1 For i := 2 to n do
2 For j := n downto i do
3 If A[j-1] > A[j] then
Begin
4 temp := A[j-1] ;
5 A[j-1] := A[j] ;
6 A[j] := temp ;
End ;
End ;
Phn tch :
- N l{ s phn t - kch thc ca b{i to|n. Mi lnh g|n t dng 4 - > dng 6 mt 3
n v thi gian, theo qui tc tnh tng s l{ O(max(1,1,1) = O(1).
- Vng If v{ For lng nhau, ta phi xt t trong ra ngo{i. i vi iu kin sau If
phi kim tra O(1) thi gian. Ta khng chc th}n lnh If t 4 - 6 c thc hin hay khng.
V xt trong trng hp xu nht nn ta gi thuyt l{ c|c lnh t 4 - 6 u c thc hin.
Vy nhm If t c|c lnh 3 -6 l{m mt O(1) thi gian.
- Ta xt vng lp ngo{i t 2 - 6. Nguyn tc chung ca vng lp: thi gian vng lp
l{ tng thi gian mi ln lp trong th}n vng lp. t nht l{ O(1) cho mi ln lp khi ch s
tng. S ln lp t 2 - 6 l n - i +1
Vy theo qui tc tch : O((n - i +1), 1) l O(n -i +1).
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5

- Ta xt vng ngo{i cng cha c|c lnh ca chng trnh. Lnh 1 l{m n-1 ln, tn n-
1 n v thi gian. Vy tng thi gian chy ca chng trnh b chn di bi 1 thi gian
c nh l{ :

=
= +
n
2 i
2 / ) 1 n ( * n ) 1 i n ( tc l{ O(n
2
)
Tuy nhin khng c qui tc y ph}n tch chng trnh.
Ni chung thi gian chy ca 1 lnh hoc 1 nhm lnh c th l{ 1 h{m ca kch
thc c|c input hoc 1 hay nhiu bin. Nhng ch c n - kch thc ca b{i to|n l{ thng
s cho php i vi thi gian chy ca chng trnh.
3. Qui tc tnh thi gian chy
a) Thi gian chy ca mi lnh g|n, read, write c gi thit l{ O(1).
b) Thi gian chy ca 1 d~y lnh x|c nh theo qui tc tng; ngha l{ thi gian
chy ca d~y l{ thi gian ln nht ca 1 lnh n{o trong d~y lnh.
c) Thi gian chy lnh If l{ thi gian thc hin lnh iu kin cng vi thi
gian kim tra iu kin.
Thi gian thc hin lnh If c cu trc If then eles l{ thi gian kim tra iu
kin cng vi thi gian ln nht ca 1 trong 2 lnh r nh|nh true v{ false.
d) Thi gian thc hin vng lp l{ tng thi gian thc hin th}n vng lp v{
thi gian kim tra kt thc vng lp.
e) Gi th tc:Nu chng trnh c c|c th tc v{ khng c th tc n{o l{
qui th ta c th tnh thi gian chy cng mt lc, bt u t c|c th tc khng gi n
c|c th tc kh|c. Tt nhin phi c t nht 1 th tc nh vy trong trng hp n{y, nu
khng th phi c th tc qui. Sau ta c th |nh gi| thi gian chy ca c|c th tc
c gi, n c|c th tc khng cha li gi ~ c |nh gi|. C nh th ta li |nh gi|
thi gian chy ca c|c th tc c li gi n c|c th tc ~ |nh gi|, ngha l{ mi th tc
c |nh gi| sau khi |nh gi| ht c|c th tc m{ c n gi.
Nu c th tc qui th khng th tm c th t ca tt c c|c th tc sao cho
mi th tc ch gi n c|c th tc ~ |nh gi|. Khi ta phi lp 1 lin h gia mi th
tc qui vi 1 h{m thi gian cha bit T(n) trong n l{ kch thc ca i s ca th
tc. Lc ta c th nhn c s truy hi i vi T(n), ngha l{ 1 phng trnh din t
T(n) qua c|c T(k) vi c|c gi| tr k kh|c nhau.
V d : Xt chng trnh qui tnh n giai tha (n!), trong n l{ kch thc ca
hm nu trn.
Function Fact (n:integer) : LongInt ;
Begin
1 If n <= 1 then
2 Fact := 1
Else
3 Fact := n*fact (n-1)
End ;
Phn tch:
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6

Ta k hiu T(n) l{ thi gian chy tnh h{m Fact(n).
Thi gian chy i vi c|c dng 1, 2 l{ O(1) v{ i vi dng 3 l O(1) + T(n-1). Vy
vi c|c hng c, d n{o ta c phng trnh:
c + T(n-1) nu n > 1
T(n) =
d nu n s 1
Gii phng trnh :
Gi s n > 2, ta c th khai trin T(n-1) trong cng thc :
T(n) = 2.c + T(n-2) nu n > 2
Sau ta li thay T(n-2) = c + T(n-3) ta c.
T(n) = 3.c + T(n-3) nu n > 3
.....
T(n) = i.c + T(n-i) nu n > i
Cui cng ta thay i = n - 1, ta c
T(n) = c(n-1) + T(1) = c(n-1) + d
Kt lun T(n) l{ O(n).
V. S PHN LP CC THUT TON :
Nh ~ c ch trn, hu ht c|c thut to|n u c mt tham s chnh l{ N,
Thng thng l{ s lng c|c phn t d liu c x l m{ nh hng rt nhiu ti
thi gian chy. Tham s N c th l{ bc ca 1 a thc, kch thc ca 1 tp tin c sp
xp hay tm kim, s nt trong 1 th...Hu ht tt c thut to|n trong b{i ging n{y c
thi gian chy tim cn ti 1 trong c|c h{m sau :
1. Hu ht tt c c|c ch th ca c|c chng trnh u c thc hin mt ln hay
nhiu nht ch mt v{i ln. Nu tt c c|c ch th ca cng 1 chng trnh c tnh cht n{y
th chng ta s ni rng thi gian chy ca n l{ hng s. iu n{y hin nhin l{ mc tiu
phn u t c trong vic thit k thut to|n.
2. logN
Khi thi gian chy ca chng trnh l{ logarit, tc l{ thi gian chy chng
trnh tin chm khi N ln dn. Thi gian chy loi n{y xut hin trong c|c chng trnh
m{ gii 1 b{i to|n ln bng c|ch chuyn n th{nh b{i to|n nh hn, bng c|ch ct b
kch thc bt 1 hng s n{o . Vi mc ch ca chng ta, thi gian chy c c xem
nh nh hn 1 hng s "ln". C s ca logarit l{m thay i hng s nhng khng
nhiu: Khi n l{ 1000 th logN l{ 3 nu c s l{ 10; l{ 10 nu c s l{ 2 ; khi N l{ 1000000,
logN c nh}n gp i. Bt c khi n{o N c nh}n gp i, logN c tng ln thm
mt hng s, nhng logN khng c nh}n gp i ti khi N tng ti N
2
.
3. N
Khi thi gian chy ca chng trnh l{ tuyn tnh, ni chung }y l{ trng hp
m{ mt s lng nh c|c x l c l{m cho mi phn t d liu nhp.
Khi N l{ 1.000.000 th thi gian chy cng c nh vy.
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7

Khi N c nh}n gp i th thi gian chy cng c nh}n gp i. }y l{ tnh
hung ti u cho 1 thut to|n m{ phi x l N d liu nhp (hay sn sinh ra N d liu
xut).
4. NlogN
}y l{ thi gian chy tng dn ln cho c|c thut to|n m{ gii 1 b{i to|n bng
c|ch t|ch n th{nh c|c b{i to|n con nh hn, k n gii quyt chng 1 c|ch c lp v{
sau t hp c|c li gii. Bi v thiu 1 tnh t tt hn (c l l{ "tuyn tnh logarit" ?),
chng ta ni rng thi gian chy ca thut to|n nh th l{ "NlogN".
Khi N l{ 1000000, NlogN c l khong 6 triu.
Khi N c nh}n gp i, thi gian chy b nh}n ln nhiu hn gp i (nhng
khng nhiu lm).
5. N
2

Khi thi gian chy ca 1 thut to|n l{ bc hai, trng hp n{y ch c ngha
thc t cho c|c b{i to|n tng i nh. Thi gian bnh phng thng tng ln trong c|c
thut to|n m{ x l tt c c|c cp phn t d liu (c th l{ 2 vng lp lng nhau).
Khi N l{ 1000 th thi gian chy l{ 1000000.
Khi N c nh}n i th thi gian chy tng ln gp 4 ln.
6. N
3

Tng t, mt thut to|n m{ x l mt b 3 ca c|c phn t d liu (c l 3
vng lp lng nhau) c thi gian chy bc 3 v{ cng ch c ngha thc t trong c|c b{i
to|n nh.
Khi N l{ 100 th thi gian chy l{ 1.000.000.
Khi N c nh}n i th thi gian chy tng ln gp 8 ln.
7. 2
n

Mt s t thut to|n c thi gian chy ly tha li thch hp trong 1 s trng
hp thc t, mc d c|c thut to|n nh th l{ "s p buc th bo" gii b{i to|n.
Khi N l{ 20 th thi gian chy xp x l{ 1.000.000
Khi N l{ gp 2 th thi gian chy c n}ng ln ly tha 2.
Thi gian chy ca 1 chng trnh c th i khi l{ mt hng s nh}n vi c|c
s hng ni trn cng thm mt s hng nh hn. C|c gi| tr ca hng s v{ c|c s hng
ph thuc v{o c|c kt qu ca s ph}n tch v{ c|c chi tit c{i t. H s ca hng s lin
quan ti s ch th bn trong vng lp : 1 tng ty ca thit k thut to|n th phi cn
thn gii hn s ch th nh th. Vi N ln th c|c hng s ng vai tr ch cht, vi N
nh th c|c s hng cng ng gp v{o v{ s so s|nh thut to|n s kh khn hn. Ngo{i
nhng h{m va ni trn cng cn c 1 s h{m kh|c, v d nh 1 thut to|n vi N
2
phn
t d liu nhp m{ c thi gian chy l{ bc 3 theo N th s c ph}n lp nh 1 thut
ton N
3/2
. Mt s thut to|n c 2 giai on ph}n t|ch th{nh c|c b{i to|n con v{ c thi
gian chy xp x vi Nlog
2
N.
VI. CC CNG THC TRUY HI C S :
Phn ln c|c thut to|n u da trn vic ph}n r~ qui mt b{i to|n ln th{nh
c|c b{i to|n nh hn, ri dng c|c li gii ca c|c b{i to|n nh gii b{i to|n ban u.
Thi gian chy ca c|c thut to|n nh th c x|c nh bi kch thc v{ s lng c|c
b{i to|n con v{ gi| phi tr ca s ph}n r~. Trong phn n{y ta quan s|t c|c phng ph|p
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8

c s ph}n tch c|c thut to|n nh th v{ trnh b{y mt v{i cng thc chun thng
c |p dng trong vic ph}n tch nhiu thut to|n.
Tnh cht rt t nhin ca 1 chng trnh qui l{ thi gian chy cho d liu nhp
c kch thc N s ph thuc v{o thi gian chy cho c|c d liu nhp c kch thc nh
hn : iu n{y c din dch th{nh 1 cng thc to|n hc gi l{ quan h truy hi. C|c
cng thc nh th m t chnh x|c tnh nng ca c|c thut to|n tng ng, do c
c thi gian chy chng ta phi gii c|c b{i to|n truy hi. B}y gi chng ta ch v{o
c|c cng thc ch khng phi c|c thut to|n.
Cng thc 1 :
Cng thc n{y thng dng cho c|c chng trnh qui m{ c vng lp duyt qua
d liu nhp b bt 1 phn t.
Cn = Cn-1 + n, vi n >= 2 v{ C1 = 1
Chng minh :
Cn khong n
2
/2. gii 1 cng thc truy hi nh trn, chng ta ln lt |p dng
chnh cng thc nh sau :
Cn = Cn-1 + n
= Cn-2 + (n-1) + n
= ...
= C1 + 2 + ... + (n-2) + (n-1) + n
= 1 + 2 + ... + n
= n(n+1)/2
Cng thc 2 :
Cng thc n{y dng cho chng trnh qui m{ chia d liu nhp th{nh 2 phn
trong mi bc.
Cn = Cn/2 + 1, vi n >= 2 v{ C1 = 0
Chng minh :
Cn khong logn. Phng trnh n{y v ngha tr phi n chn hay chng ta gi s rng
n/2 l{ php chia nguyn : b}y gi chng ta gi s rng n = 2
m
cho cng thc lun lun
c ngha. Chng ta vit nh sau :
1
2 2
1
+ =

C C
m m

2
2
2
+ =

C
m

3
2
3
+ =

C
m

= ......
m
C
m m
+ =

2

n m log = =

Cng thc chnh x|c cho n tng qu|t th ph thuc v{o biu din nh ph}n ca n,
ni chung Cn khong logn vi mi n.
Cng thc 3 :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9

Cng thc n{y dng cho chng trnh qui m{ chia i d liu nhp nhng c th
kim tra mi phn t ca d liu nhp.
Cn = Cn/2 + n, vi n >= 2 v{ C1 = 0
Chng minh :
Cn khong 2n. Tng t trn, cng thc n{y chnh l{ tng n + n/2 + n/4 + ... (d
nhin iu n{y ch chnh x|c khi n l{ ly tha ca 2).
Nu d~y l{ v hn, th }y l{ 1 chui hnh hc n gin m{ c c lng chnh
x|c l{ 2n. Trong trng hp tng qu|t li gii chnh x|c ph thuc v{o biu din nh
ph}n ca n.
Cng thc 4 :
Cng thc n{y dng cho chng trnh qui m{ duyt tuyn tnh xuyn qua d
liu nhp, trc, trong, hay sau khi d liu nhp c chia i.
Cn = 2Cn/2 + n, vi n >= 2 v{ C1 = 0
Chng minh :
Cn khong nlogn. Cng thc n{y |p dng cho nhiu thut to|n theo phng php
"chia tr".
2
2 2
1
m
m m
C C
+ =


1
2 2
1
1
2 2
+ =

m
m
m
m
C C

1 1
2
2
2
2
+ + =

m
m
C

m
C
m m
m m
+ =

2
2

m m
C
= + =
2
0


n n
m C
m
n
log
2
= =

Li gii cho cng thc n{y rt ging nh trong cng thc 2, nhng phi chia 2 v
ca cng thc cho 2
n
trong bc th hai.
Cng thc 5 :
Cng thc n{y dng cho chng trnh qui m{ t|ch d liu th{nh 2 phn.
Cn = 2Cn/2 + 1, vi n >= 2 v{ C1 = 0
Chng minh :
Cn khong 2n. Chng minh ging nh cng thc 4.
C|c bin dng ca nhng cng thc n{y chng hn nh iu kin kh|c nhau hay c|c
s hng thm v{o kh|c nhau mt t, c th c lng bng c|ch dng cng mt k thut
nh trn. Mc d vy, chng ta cng nn ch 1 quan h truy hi dng nh tng t
vi mt quan h ~ bit th i khi li kh gii hn rt nhiu.
VII. GII PHNG TRNH TRUY HI :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0

gii phng trnh truy hi c nhiu c|ch gii kh|c nhau, }y chng ti trnh
b{y c|ch gii phng trnh truy hi bng c|ch truy v phng trnh c trng. Chng ti
dng c|ch gii n{y vit chng trnh gii t ng phng trnh truy hi.
a) Ta xt phng trnh truy hi thun nht tuyn tnh vi c|c h s khng i sau
}y :
a0tn + a1tn-1 + ... + aktn-k = 0 (VII.1)
trong ti(i=n, n-1,..., n-k) l{ c|c n s cn tm.
Tuyn tnh v c|c ti ch c bc nht, thun nht v v phi bng khng v{ c|c h s
a0, a1,..., ak l{ khng i v khng ph thuc v{o n.
Sau khi gi thit tn = x
n
ta a (VII.1) v dng:
a
0
x
n
+ a
1
x
n-1
+...+ a
k
x
n-k
= 0
hay x
n-k
(a0x
k
+ a1x
k-1
+...+ ak) = 0
R r{ng x = 0 l{ nghim hin nhin, nhng ta quan t}m nghim phng trnh a0x
k
+
a1x
k-1
+...+ ak = 0 (VII.2) v{ }y chnh l{ phng trnh c trng bc k ca phng trnh
truy hi (VII.1)
Gi s r1, r2,..., rk l k nghim ca phng trnh (VII.2) v{ chng kh|c nhau (c th
phc). D d{ng kim tra:
r c t
n
i
k
i
i n

=
=
1

Vi c1, c2,..., ck l{ c|c hng x|c nh t k iu kin ban u.
V d 1 :
Xt phng trnh truy hi:

0
4 3 2 1
=
t t t n n n

iu kin ban u : t0 = 1 ; t1 =1
Phng trnh c trng tng ng ca n l{:
x
2
- 3x - 4 = 0
c nghim bng -1 v{ 4. Vy nghim tng qu|t l{ :

) 4 ( ) 1 (
2 1
n n
n
c c t
+ =


Theo iu kin ban u (khi n =0 v{ n = 1) ta c :
c1 + c2 = 1 = t0
- c1 + 4c2 =1
Vy c1 = 3/5, c2 = 2/5. Ta c tn = - [4
n
- (-1)
n
] /5
V d 2 : (phng trnh Fibonacci)
tn = tn-1 + tn-2 n > 2
iu kin : t0 = 0, t1 = 1
Vit li phng trnh trn :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1

tn - tn-1 - tn -2 = 0
Phng trnh c trng tng ng :
x
2
- x -1 = 0
Nghim : 2 / ) 5 1 (
r
1
+ = , 2 / ) 5 1 (
r
2
=
Nghim tng qu|t : tn = c1r1
n
+ c2r2
n

T iu kin ban u :
c1 + c2 = 0 (n = 0)
r1c1 + r2c2 = 1 (n =1)
Ta c 5 / 1
c
1
= ,
5 / 1
c
2
=
Vy: tn = 5 / ) n n (
r r
2 1

Gi s c|c nghim phng trnh c trng l{ khng ph}n bit, P(x) l{ 1 a thc.
P(x) = a0x
k
+ a1x
k-1
+ ... + ak
v{ r l{ nghim kp.
Vi mi r > k, ta xt a thc bc n c x|c nh nh sau :
h(x) = x [x
n-k
P(x)] = a0nx
n
+ a1(n-1)x
n-1
+ ... + ak(n-k)x
n-k

t q(x) l{ a thc tha iu kin
P(x) = (x-r)
2
q(x)
Ta c :
h(x) = x[(x-r)
2
x
n-k
q(x)] = x[2(x-r)x
n-k
q(x) + (x-r)
2
[x
n-k
q(x)]]
R r{ng h(r) = 0, do
a0nr
n
+ a1(n-1)x
n-1
+ ... + ak(n-k) r
n-k
= 0
Ngha l{ tn = nrn cng l{ nghim ca (5.13). Tng qu|t hn, nu nghim r trng
nhau m ln (r bi m) th
tn = r
n
, tn = nr
n
, tn = n
2
r
n
,...., tn = n
m-1
r
n

cng l{ c|c nghim ca (5.13). Nghim tng qu|t (nghim chung) l{ t hp tuyn tnh
ca c|c nghim ring n{y v{ nghim ring kh|c ca phng trnh c trng. K hng
c x|c nh t c|c iu kin ban u.
V d 3 : Xt phng trnh
tn = 5tn-1 - 8tn-2 + 4tn-3 n > 3
vi c|c iu kin t0 = 0, t1 = 1, t2 = 2
Ta vit li phng trnh:
tn - 5tn-1 + 8tn-2 - 4tn-3 = 0
v{ phng trnh c trng tng ng l{:
x
3
- 5x
2
+ 8x - 4 = 0
hay (x-1) (x-2)
2
= 0
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2

Ta c c|c nghim 1 (c bi 1), 2 (c bi 2). Vy nghim tng qu|t l{ :
tn = c11
n
+ c22
n
+ c3n2
n

C|c iu kin ban u cho trc l{:
c1 + c2 = 0 khi n = 0
c1 + 2c2 + 2c3 = 1 khi n = 1
c1 + 4c2 + 8c3 = 2 khi n = 2
T }y ta tm ra c1 = -2, c2 = 2, c3 = -1/2. Vy tn = 2
n+1
- n2
n-1
- 2
b) Phng trnh truy hi khng thun nht:
Ta xt phng trnh c dng sau :
a0tn + a1tn-1 + ... + aktn-k = b
n
P(n) (VII.3)
Trong v tr|i nh trong (VII.1), v phi l{ b
n
P(n) vi b l{ hng v{ P(n) l{ a
thc.
V d 4 :
tn - 2tn-1 = 3
n

th b = 3 v{ P(n) = 1 l{ a thc bc 0.
Bng php bin i n gin ta c th chuyn v d n{y v dng (VII.1) l{ phng
trnh truy hi thun nht. Trc ht ta nh}n 2 v cho 3 ta c :
3tn - 6tn-1 = 3
n+1
(1)
Sau ta thay n ra n + 1 trong phng trnh ban u:
tn+1 - 2tn = 3
n+1
(2)
Cui cng, ly (2) - (1) , ta thu c (c cng v phi 3
n+1
), ta c:
tn+1 - 5tn + 6tn-1 = 0
n }y ta c th gii phng trnh ~ trnh b{y mc a.
Phng trnh c trng ca n l{ :
x
2
- 5x + 6 = 0
hay (x-2) (x-3) = 0
Trc gi|c cho ta thy rng th{nh phn (x-2) tng ng vi v tr|i phng
trnh ban u; cn (x-3) l{ biu hin kt qu ca vic bin i v{ tr v phi.
V d 5 :
tn - 2tn-1 = (n+5)3
n

S bin i c phc tp nh sau :
- Nh}n 2 v cho 9
- Thay n bi n+2
- Thay n bi n+1,sau nh}n cho -6
- Ta c kt qu :
9tn - 18tn-1 = (n + 5) 3
n+2

tn+2 - 2tn+1 = (n + 7) 3
n+2

-6tn+1 + 12tn = -6(n + 6) 3
n+1

Cng 3 phng trnh li ta c :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3

tn+2 - 8tn+1 + 21tn - 18tn-1 = 0
Phng trnh c trng.
x
2
- 8x
2
+ 21x - 18 = 0 hay (x-2) (x-3)
2
= 0
Ta li thy (x-2) tng ng v tr|i phng trnh ban u v{ (x-3)
2
l{ kt qu ca s
bin i.
Nh vy chng ta c th ni rng gii phng trnh truy hi khng thun nht
c dng (VII.3) ta ch cn gii phng trnh c trng sau.
(a0x
k
+ a1x
k-1
+ ... + ak) (x-b)
d+1
= 0 (VII.4)
V d 6 : (b{i to|n th|p H{ Ni)
Phng trnh truy hi cho b{i to|n chuyn n a n{y c dng:
{ 1 nu n = 1
tn =
2tn-1 + 1 nu n > 1
hay tn = 2tn-1 + 1, n > 1 vi t0 = 0
Ta vit li phng trnh :
tn - 2tn-1 = 1
V{ thy n c dng (VII.3) vi b = 1, P(n) = 1 bc 0
Phng trnh c trng l{ (x-2) (x-1) = 0
Vy : tn =c11
n
+ c22
n
. T t0 = 0 tm t1 ta vit :
t1 = 2to + 1 = 1
Vy c1 + c2 = 0, n = 0
c1 + 2c2 = 1, n = 1
Suy ra c1 = -1, c2 = 1. Vy tn = 2
n
-1
Ta nhn thy t tn = c11
n
+ c22
n
cng c th kt lun tn c O(2
n
).
V d 7 :
tn = 2tn-1 + n
hay tn - 2tn-1 = n
}y b = 1, P(n) = n bc 1
Ta c phng trnh c trng:
(x-2) (x-1)
2
= 0
Vy nghim tng qu|t l{ :
tn = c12
n
+ c21
n
+ c3n1
n

Nu tn > 0 vi mi n th ta c th kt lun T(n)= O(2n),
B}y gi ta xt phng trnh truy hi khng thun nht tng qu|t hn.
aotn +a1tn-1 + ... + aktn-k = b1
n
p1(n) + b2
n
p2(n) + ... (VII.5)
Trong bi l{ c|c hng kh|c nhau v{ pi(n) l{ c|c a thc bc di ca n.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4

Bng c|ch bin i gn nh tng t vi dng phng trnh (VII.1), ta c th vit
c phng trnh c trng cho dng (VII.1)5) nh sau :
(aox
k
+ a1x
k-1
+ ... + ak) (x-b1)
d1+1
(x-b2)
d2+1
= 0 (VII.6)
V d 8 : Gii phng trnh
tn = 2tn-1 + n + 2
n
n > 1
vi to = 0, ta c
tn - 2tn-1 = n + 2
n

c dng (VII.1)5) vi b1 = 1, p1(n) = n, b2 = 2, p2(n) = 1. Bc ca p1(n) l{ 1, bc ca
p2(n) l{ 0. Vy phng trnh c trng l{ :
(x-2) (x-1)
2
(x-2) = 0
C hai nghim 1 v{ 2 u c bi l{ 2. Vy nghim tng qu|t ca phng trnh
truy hi l{ :
tn = c11
n
+ c2n1
n
+ c32
n
+ c4n2
n

S dng dng truy hi tn = 2tn-1 + n+ 2
n
vi to = 0 ta c th tnh c t1, t2 v t3
v{ t x|c nh c c|c h s c1, c2, c3 v c4 qua h sau:
c1 + c3 = 0 khi n = 0
c1 + c2 + 2c3 + 2c4 = 3 n = 1
c1 + 2c2 + 4c3 + 8c4 = 12 n = 2
c1 + 3c2 + 8c3 + 24c4 = 35 n = 3
Kt qu cui cng l{ :
tn = -2 -n + 2
n+1
+ n2
n

D d{ng nhn thy tn c O(n2
n
)
V d 9 :
Gi s n l{ ly tha ca 2. Tm T(n) t phng trnh:
T(n) = 4T(n/2) + n, n > 1
Thay n bng 2k (vi k = logn), ta c T(2k) = 4T(2k-1) + 2k. Khi ta c th vit:
tk = 4tk-1 + 2
k

Nu tk = T(2k) = T(n). Ta ~ bit c|ch gii phng trnh truy hi mi n{y.
Phng trnh c trng ca n l{ :
(x-4) (x-2) = 0
v{ t ta c tk = c14
k
+ c22
k

t n ngc li thay cho k, ta tm c :
T(n) = c1n
2
+ c2n
Do T(n) c 0(n
2
) khi n l{ ly tha ca 2.
V d 10 :
T(n) = 4t(n/2) + n
2
, n > 1, ly tha ca 2. t n = 2
k
, ta c.
T(2
k
) = 4T(2
k-1
) + 4
k

LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5

Phng trnh c trng (x-4)2 = 0 v ta c tk = c14
k
+ c2k4
k

Vy T(n) = c1n2 + c2n
2
logn v T(n) l 0(n
2
logn) vi n ly tha 2.
V d 11 :
T(n) = 2T(n/2) + nlogn, n > 1
Sau khi thay n = 2k, ta c T(2
k
)= 2T(2
k-1
) + k2
k
v
tk = 2tk-1 + k2
k

Phng trnh c trng (x-2)
3
= 0 v tk = c12
k
+ c2k2
k
+ c3k
2
2
k
.
Vy T(n) = c1n + c2nlogn + c3nlog
2
n c 0(nlog
2
n), n ly tha 2.
V d 12 :
T(n) = 3T(n/2) + cn (c l const, n = 2
k
> 1)
Ta s nhn c :
T(2
k
) = 3T(2
k-1
) + c2
k
; tk = 3tk-1 + c2
k

Phng trnh c trng l{ (x-3) (x-2) = 0, v{ do .
Tk = c13
k
+ c22
k
; T(n) = c13
logn
+ c2n
Do alogb = bloga nn T(n) = c1n
log3
+ c2n c 0(n
log3
),n ly tha 2.
c) Phng trnh truy hi c h s bin i
Ta xt v d c th :
T(1) = 6
T(n) = nT
2
(n/2), n > 1,n ly tha ca 2
(h s v phi l{ bin n)
Trc ht ta t tk = T(2
k
) v{ t y ta c :
tk = 2
k
t
2
K-1 k > 0
to = 6
lp phng trnh truy hi mi khng c h s bin i ta t Vk = lgtk, ta c :
Vk = K + 2Vk-1 k >0
Vo = lg6
Ngha l{ ta c h phng trnh dng (VI.3)
Phng trnh c trng s l{
(x-2) (x-1)2 = 0
v{ do :
Vk = c12
k
+ c21
k
+ c3k1
k

T Vo = 1 + lg3, V1 = 3+2lg3 v V2 = 8 + 4lg3 ta tm ra
c1 = 3 + lg3, c2 = -2 v c3 = -1.
Vy V3 = (3 + lg3) 2
k
- K -2
Cui cng, s dng tk = 2
vk
v T(n) = tlgn, ta c :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6


n
n T
n n
3 2
) (
2 3
=

LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7

CHNG II
QUI
I. KHI NIM :
qui l{ 1 cng c rt thng dng trong khoa hc m|y tnh v{ trong to|n hc
gii quyt c|c vn . Trc ht, chng ta h~y kho s|t th n{o l{ mt vn c qui
qua v d sau:
Tnh S(n) = 1 +2 +3 +4+ ... +n-1+n =S(n-1) + n
Ta nhn thy rng, cng thc trn c th din t li nh sau:
S(n) = S(n-1) + n, v
S(n-1) = S(n-2) + (n-1)
.....
S(2) = S(1) + 2
S(1) = 1
Nh vy, mt vn c qui l vn c nh ngha li bng chnh n.
Mt c|ch tng qu|t, mt chng trnh qui c th c biu din nh b P gm
c|c mnh c s S (khng cha P) v{ bn th}n P:
P P (Si, P)
tnh S(n): ta c kt qu ca S(1), thay n v{o S(2), c S(2) ta thay n v{o S(3)....,
c nh vy c S(n-1) ta s tnh c S(n)
Cng nh c|c lnh lp, c|c th tc qui cng c th thc hin c|c tnh to|n khng
kt thc, v vy ta phi xt n vn kt thc c|c tnh to|n trong gii thut qui. R
r{ng 1 th tc P c gi qui ch khi n{o tha 1 iu kin B, v{ d nhin iu kin B
n{y phi khng c tha m~n ti 1 thi im n{o . Nh vy m hnh v c|c gii thut
qui l{:
P if (B) P(Si, P)
hay P P(Si, if (B) P).
Thng thng trong c|c vng lp while, m bo cho vng lp kt thc ta phi
nh ngha mt h{m f(x) (x l{ 1 bin trong chng trnh) sao cho n phi tr v tr bng
0 ti mt thi im n{o . Tng t nh vy, chng trnh qui cng c th c
chng minh l{ s dng bng c|ch chng minh rng h{m f(x) s gim sau mi ln thc
hin. Mt c|ch thng l{m l{ kt hp mt gi| tr n vi P v{ gi P mt c|ch qui vi gi|
tr tham s l{ n-1. iu kin B b}y gi l{ n > 0 th s m bo c s kt thc ca gii
thut qui. Nh vy, ta c m hnh qui mi:
P(n) if (n >0) P(Si, P(n-1))
Hay P P (Si, if (n>0) P(n-1) )
II. HM QUI V STACK:
Mt chng trnh C thng gm c h{m main() v{ c|c h{m kh|c. Khi chy chng
trnh C th h{m main() s c gi chy trc, sau h{m main() gi c|c h{m kh|c, c|c
h{m n{y trong khi chy c th gi c|c h{m kh|c na. Khi mt h{m c gi, th mt khung
kch hot ca n c to ra trong b nh stack. Khung kch hot n{y cha c|c bin cc b
ca h{m v{ mu tin hot ng ca h{m. Mu tin hot ng cha a ch tr v ca h{m gi
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
8

n v{ c|c tham s kh|c.
Bin cc b
Mu tin
hot ng
{
a ch tr v
Thng s kh|c

Khung kch hot
Sau khi h{m c gi ~ thi h{nh xong th chng trnh s thc hin tip dng
lnh a ch tr v ca h{m gi n, ng thi xa khung kch hot ca h{m khi b
nh.
Gi s ta c c ch gi h{m trong mt chng trnh C nh sau:
main()
{ ......
A();
.....;
B();
....;
}
A()
{.....;
C();
....;
D();
}
B()
{.....;
D();
}
C()
{......;
D();
.....;
}
D()
{........;
........;
}
Hnh sau }y cho ta thy s chim dng b nh stack khi chy chng trnh C nh
m t trn.

Tng t vi trng hp h{m qui, khi gi qui ln nhau th mt lot c|c
khung kch hot s c to ra v{ np v{o b nh Stack. Cp qui c{ng cao th s
khung kch hot trong Stack c{ng nhiu, do , c kh nng dn n tr{n Stack (Stack
overflow). Trong nhiu trng hp khi lp trnh, nu c th c, ta nn g qui cho
cc bi ton.
III. V D
V d 1: H{m giai tha:
n! =
{
1*2*3*......*(n-1)*n , n>0
1 , n=0
n! =
{
n*(n-1)! , n>0
M M M M M M M M M M M M M
A A A A A A A B B B
C C C D D
D
Bonh
Stack
Thi gian
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
9

1 , n= 0
Nhn xt:
- Theo cng thc trn, ta nhn thy trong nh ngha ca n giai tha (n!) c nh
ngha li chnh n nn h{m giai tha c qui.
- iu kin dng tnh h{m giai tha l{ n=0, khi n! = 1
- H{m qui:
long giaithua(int n)
{
if (n == 0)
return(1);
else
return(n * giaithua(n-1));
}
hay:
long giaithua(int n)
{ return ((n==0) ? 1 : n*giaithua(n-1));
}
- H{m khng qui:
long giaithua (int n)
{ long gt=1;
for (int i=1; i<=n; i++)
gt= gt * i ;
return (gt);
}
V d 2: Hm FIBONACCI:

Fn =
{ 1 ; n =0,1
Fn-1 + Fn-2 ; n>1
Nhn xt:
- Theo nh ngha trn, h{m Fibonacci c li gi qui.
- Qu| trnh tnh dng li khi n= 1
- H{m qui:
long fib(int n)
{ if (n==0 || n==1)
return 1 ;
else return(fib(n-1) + fib(n-2));
}
- H{m khng qui:
long fib(int n)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
0

{ long kq, Fn_1, Fn_2;
kq = 1;
if (n > 1)
{
Fn_1 = 1;
Fn_2 = 1;
for (int i=2; i<=n; i++)
{
kq = Fn_1 + Fn_2 ;
Fn_2 = Fn_1;
Fn_1 = kq;
}
}
return (kq);
}
V d 3: B{i to|n Th|p H{ ni
C 3 ct A, B, C. Ct A hin ang c n da kch thc kh|c nhau, da nh trn da
ln di. H~y di n da t ct A sang ct C (xem ct B l{ ct trung gian) vi iu kin
mi ln ch c di 1 da v{ da t trn bao gi cng nh hn da t di.
- Gii thut qui: di n da t ct A sang ct C (vi ct B l{ ct trung gian), ta
c th xem nh :
+ Di (n-1) da t ct A sang ct B ( vi ct C l{ ct trung gian)
+ Di da th n t ct A sang ct C
+ Di (n-1) da t ct B sang ct C ( vi ct A l{ ct trung gian)
- Chng trnh:
void hanoi (int n, char cotA, char cotC, char cotB)
{
if(n == 1)
printf("\n%s%c%s%c", " chuyen dia 1 tu cot ", cotA, " den cot ", cotC);
else
{
hanoi(n-1, cotA, cotB, cotC);
printf("\n%s%d%s%c%s%c", " chuyen dia ", n, " tu cot ", cotA,
" den cot ", cotC);
hanoi(n-1, cotB, cotC, cotA);
}
}
IV. CC THUT TON LN NGC:
Trong lp trnh, i khi ta phi x|c nh c|c thut gii tm li gii cho c|c b{i
to|n nht nh nhng khng phi theo mt lut tnh to|n c nh, m{ bng c|ch th-v-
sai. C|ch chung l{ ph}n tch th-v-sai th{nh nhng cng vic cc b. Thng thng
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
1

cng vic n{y c thc hin trong dng qui v{ bao gm vic thm d mt s hu hn
c|c nhim v nh. Trong b{i ging n{y ta khng tm hiu c|c qui tc tm kim tng qu|t,
m{ ch tm nhng nguyn l chung chia vic gii b{i to|n th{nh nhng vic nh v{
ng dng ca s qui l{ ch chnh. Trc ht, ta minh ha k thut cn bn bng
c|ch xt b{i to|n m~ i tun.
V d 1. B{i to|n m~ i tun.
Cho b{n c c n x n . Mt con m~ c php i theo lut c vua, u tin n c
t c to x0, y0. C}u hi l{, nu c th h~y tm c|ch sao cho con m~ i qua c tt
c c|c ca b{n c, mi i qua ng 1 ln.
* Lut i ca con m~ trn b{n c: Ti mt c ta ct x0, hng y0 (x0,y0) trn bn
c, con m~ c 1 trong 8 nc i nh sau:
3 2
4 1
Con
M

5 8
6 7
Hnh 2.1 8 nc i c th ca con m xut pht t ct x0, hng y0.
Vi ta bt u (x0,y0), c tt c 8 (u,v) m{ con m~ c th i n c. Chng
c |nh s t 1 n 8 trong hnh 2.1
Phng ph|p n gin c c u,v t x,y l{ cng c|c chnh lch ct, dng v ta
c lu trong 2 mng a v{ b. C|c gi| tr trong 2 mng a, b ~ c khi ng thch
ng nh sau:
Ta xem nh c 1 h trc ta (Oxy) ngay ti v tr (x0,y0) ca con m~, th :
+ V tr 1 m{ con m~ c th i c l{ :
u= x0 + 2, v = y0 + 1
+ V tr 2 m{ con m~ c th i c l{ :
u= x0 + 1, v = y0 + 2
+ V tr 3 m{ con m~ c th i c l{ :
u= x0 + (-1), v = y0 + 2 ....
Nh vy, mng a v{ b c gi| tr sau:
int a[8] = {2, 1, -1,-2, -2, -1, 1, 2};
int b[8] = {1, 2, 2, 1, -1, -2,-2, -1};
* C|ch biu din d liu: m t c b{n c, ta dng ma trn BanCo theo khai
bo sau:
#define KICHTHUOC 5 // Kch thc ca b{n c
int BanCo[KICHTHUOC][KICHTHUOC]; // T chc b{n c l{ m~ng hai chiu
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
2

Ta th hin mi c bng 1 s nguyn |nh u ~ c i qua cha, v ta
mun ln d theo qu| trnh di chuyn ca con m~. V{ ta qui c nh sau:
BanCo [x][y]=0 ; (x,y) cha i qua
BanCo [x][y]=i ; (x,y) ~ c i qua nc th i ( 1 s i s n
2
)
* Thut gii:
C|ch gii quyt l{ ta phi xt xem c th thc hin mt nc i k na hay khng
t v tr x0, y0. Thut gii th thc hin nc i k.
void th nc i k
{ khi ng c|c chn la c th i
do
{ chn mt nc i;
if chp nhn c
{ ghi nhn nc i;
if b{n c cha y
{ th nc i k ti v tr va ghi nhn c;
if khng c
xa nc i trc
}
}
} while (khng i c && cn nc i)
}
* Nhn xt:
- x|c nh ta (u,v) ca nc i k ( 0 s i s 7 ), ta thc hin nh sau:
u = x + a[i] ; v = y + b[i]
- iu kin nc i k chp nhn c l{ (u,v) phi thuc b{n c v{ con m~
cha i qua , ngha l{ ta phi tha c|c iu kin sau:
(0 s u <KICHTHUOC && 0 s v< KICHTHUOC && BanCo[u][v]==0 )
- Ghi nhn nc i th n, ngha l{ BanCo [u][v] = n; cn b vic ghi nhn nc i l{
BanCo [u][v] = 0
- B{n c y khi ta ~ i qua tt c c|c trong BanCo, lc :
n = KICHTHUOC
2
.
Qua nhn xt trn, ta c thut gii chi tit hn nh sau:
void thu_nuoc_di(int n, int x, int y, int &q) // th 8 c|ch i ca con m~ ti
// nc th n xut ph|t t (x,y)
{ int u,v, q1;
khi ng c|c chn la c th i
do
{ u = x + a[i] ;
v = y + b[i];
if (0 s u < KICHTHUOC && 0 s v < KICHTHUOC
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
3

&& BanCo [u][v] == 0 )
{ BanCo [u][v] = n;
if n < KICHTHUOC*KICHTHUOC
{ thu_nuoc_di (n+1, u, v, q1)
if !q1
BanCo [u][v] = n;
}
else q1=TRUE;
}
} while (q1==FALSE && cn nc i)
}
* Chng trnh m~ i tun:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define KICHTHUOC 5 // Kch thc ca b{n c
#define TRUE 1
#define FALSE 0 // T chc b{n c l{ m~ng hai chiu
int BanCo[KICHTHUOC][KICHTHUOC];
// 8 c|ch i ca con m~
int a[8] = {2, 1, -1,-2, -2, -1, 1, 2};
int b[8] = {1, 2, 2, 1, -1, -2,-2, -1};
void innuocdi(int BanCo[][KICHTHUOC])
{
int i, j;
char c;
randomize();
textmode(C80);
textbackground(BLACK);
textcolor(1);
for(i = 0; i < KICHTHUOC; i++)
for(j = 0; j < KICHTHUOC; j++)
{
gotoxy(23+5*j, 8+2*i);
textcolor(1 + random(15));
if(BanCo[i][j] == 0 ? printf(" ") : cprintf("%2d", BanCo[i][j]));
}
}
// H{m thu_nuoc_di gip i nc th n xut ph|t t (x, y)
void thu_nuoc_di (int n, int x, int y, int &q)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
4

int k=-1,u,v, q1;
do
{ k++; q1=FALSE;
u = x+a[k];
v = y+b[k];
if (u >= 0 && u < KICHTHUOC && v >= 0 && v < KICHTHUOC)
if (BanCo[u][v] ==0)
{
// i nc th n
BanCo[u][v] = n;
if (n < KICHTHUOC*KICHTHUOC) // D/kien dung, di duoc nuoc cuoi
{ try(n+1, u, v, q1); // Buoc de qui, goi di nuoc n+1
if (q1 == FALSE)
BanCo[u][v]=0;
}
else q1=TRUE;
}
} while (q1==FALSE && k <7);
q=q1;
}
void vebanco()
{
printf("\n\t\t\t CHUONG TRINH MA DI TUAN\n");
printf("\n\t\tKich thuoc ban co %dx%d", KICHTHUOC, KICHTHUOC);
printf("\n\n\t\t 0 1 2 3 4 5 6 7");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 0 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 1 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 2 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 3 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 4 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 5 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 6 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 7 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
}
void main()
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
5

{
int i, j,q;
clrscr();
vebanco();
for(i = 0; i < KICHTHUOC; i++)
for(j = 0; j < KICHTHUOC; j++)
BanCo[i][j] = 0;
// Chon nuoc di dau tien va goi ham de qui de di nuoc thu hai
BanCo[0][0] = 1;
thu_nuoc_di(2, 0, 0,q);
if (q==FALSE)
printf ("\n Khong co loi giai");
else innuocdi(BanCo);
}
* Bng sau }y cho ta mt s li gii tng ng vi c|c v tr u v{ kch thc ca
b{n c:
- Kch thc b{n c = 5
+ V tr bt u (1,1) + V tr bt u (3,3)
1 6 15 10 21 23 10 15 4 25
14 9 20 5 16 16 5 24 9 14
19 2 7 22 11 11 22 1 18 3
8 13 24 17 4 6 17 20 13 8
25 18 3 12 23 21 12 7 2 19
- Kch thc b{n c = 8
+ V tr bt u (1,1)
1 60 39 34 31 18 9 64
38 35 32 61 10 63 30 17
59 2 37 40 33 28 19 8
36 49 42 27 62 11 16 29
43 58 3 50 41 24 7 20
48 51 46 55 26 21 12 15
57 44 53 4 23 14 25 6
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
6

52 47 56 45 54 5 22 13
V d 2: B{i to|n t|m ho{ng hu.
B{i to|n t|m h{ng hu c m t nh sau: t|m ho{ng hu c t ln b{n c
vua sao cho khng b n{o c th chim ly c|c b{ kh|c.
* Theo lut ca c vua, mt ho{ng hu c th chim ly c|c qu}n kh|c nm cng
dng, hay cng ct, hay cng c|c ng cho. Do , ta suy ra rng mi ct ch c th cha
mt ho{ng hu v{ ch 1 m{ thi. Ta qui c ho{ng hu th 0 s t ct 0, ho{ng hu th
1 s t ct 1,.., ho{ng hu th 7 s t ct 7. Nh vy, vic chn ch cho ho{ng hu th
i l{ tm v tr dng j c th c trn ct i.
Sau }y l{ hnh minh ha cho mt li gii ca b{i to|n: (0 6 4 7 1 3 5 2)
0 Q
1 Q
2 Q
3 Q
4 Q
5 Q
6 Q
7 Q
* C|ch biu din d liu:
B{n c 8x8 c 8 h{ng, 8 ct, 15 ng cho xui, 15 ng cho ngc, ta qui c
1 con hu ch c th t trn 1 ct i v{ h{ng j n{o ca b{n c. Khi , c|c v tr trn
ng cho xui v{ ng cho ngc ca b{n c khng th dng t c|c con hu
kh|c. Ta lu rng c|c phn t cng nm trn 1 ng cho xui ca b{n c tha m~n
biu thc sau (ct i - h{ng j + 7 = hng s), v{ c|c phn t cng nm trn 1 ng cho
ngc ca b{n c tha m~n biu thc sau (ct i + h{ng j = hng s) nh hnh sau:
ng cho xui ng cho ngc
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
7


Nh vy, ta s x}y dng cu trc d liu sau lu tr d liu:
int hang_trong[8] ; // h{ng trng cn c th t ho{ng hu
int cheo_xuoi[15];
// duong cheo xuoi co the dat hoang hau. Cac phan tu tren duong cheo xuoi //thoa
(cot i -hang j +7 = hangso)
int cheo_nguoc[15];
// duong cheo nguoc co the dat hoang hau. Cac phan tu tren duong cheo
// nguoc thoa (cot i +hang j = hangso)
int loi_giai[8] ; // loi giai chua ket qua.
vi:
- hang_trong[j] = TRUE ngha l{ cha c con hu n{o trn h{ng th j
- cheo_xuoi[k] = TRUE ngha l{ cha c con hu n{o trn ng cho xui th k
- cheo_nguoc[k] = TRUE ngha l{ cha c con hu n{o trn ng cho ngc th
k
V d:
C|c v tr trn ng cho xui th 12 : 5 - 0 +7 = 6 -1 +7 = 7 -2 + 7 = 12
C|c v tr trn ng cho ngc th 12: 7 + 5 = 6 + 6 = 5 + 7 = 12
-loi_giai[i] ch v tr ca ho{ng hu ct th i
* Thut gii:
void chon_vi_tri (int i) // tm v tr thch hp cho ho{ng hu th i
{ khi ng c|c v tr c th chn cho ho{ng hu th i
do
{ chn v tr k;
if an ton
{ t ho{ng hu
if cha t ht 8 ho{ng hu
{ chon_vi_tri (i+1);
14
13
12
11
10
9
8
7 6 5 4 3 2 1 0
Hang j:0
1
2
3
4
5
6
7
- ng
cho xui
0
1
2
3
4
5
6
7 8 9 10 11 12 13 14
- ng
cho ng- c
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
8

if khng thnh cng
di ho{ng hu i
}
}
} while (khng th{nh cng && cha t ht c|c v tr)
}
* Nhn xt: Vi c|c d liu ~ cho, th:
- iu kin an to{n l{ iu kin sao cho ho{ng hu th i (ct i) nm trn h{ng j sao
cho h{ng j v{ c|c ng cho i qua (j,i) cha b chim gi bi c|c ho{ng hu kh|c;
ngha l{ n phi tha biu thc logic:
hang_trong[j] && cheo_xuoi [i-j+7] && cheo_nguoc[i+j]
- t ho{ng hu s c th hin bi:
loi_giai[i] = j ;
hang_trong[j] = FALSE ; cheo_xuoi [i-j+7] =FALSE; cheo_nguoc[i+j] = FALSE;
- Di ho{ng hu i s c th hin bi:
hang_trong[j]=TRUE ; cheo_xuoi [i-j+7] =TRUE;
cheo_nguoc[i+j] = TRUE;
- iu kin cha t ht c|c ho{ng hu : i < 7
- bit c t ho{ng hu th i c th{nh cng hay khng, ta dng thm 1 tham
s hnh thc bin q. Nu t th{nh cng th q = TRUE, ngc li q=FALSE.
* Chng trnh: Qua nhn xt trn, ta c chng trnh ca b{i to|n 8 ho{ng hu
nh sau:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
// tim 1 loi giai cho bai toan 8 hoang hau
int hang_trong[8] ; // hng trong con co the dat hoang hau
int cheo_xuoi[15]; // duong cheo xuoi co the dat hoang hau. Cac phan tu
// tren duong cheo xuoi thoa (cot i -hang j +7 = hangso)
int cheo_nguoc[15]; // duong cheo nguoc co the dat hoang hau. Cac phan tu
// tren duong cheo nguoc thoa (cot i +hang j = hangso)
int loi_giai[8] ; // loi giai chua ket qua.
int i, q;
void in_loigiai(int *loigiai)
{
int i, j;
char c;
randomize();
textmode(C80);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
2
9

textbackground(BLACK);
clrscr();
textcolor(1 + random(15));
printf("\n\t\t\t CHUONG TRINH 8 HOANG HAU\n");
printf("\n\n\t\t 0 1 2 3 4 5 6 7 ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 0 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 1 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 2 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 3 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 4 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 5 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 6 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 7 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
for(i = 0; i < 8; i++)
{
gotoxy(24+5*i,8+2*loigiai[i] );
textcolor(1 + random(15));
cprintf("Q");
}
gotoxy(13, 25);
printf("Nhan phim bat ky de thoat ...");
getche();
}
void chon_vi_tri ( int i, int &q)
{ int j= -1;
do
{
j++;
q=FALSE;
if (hang_trong[j] && cheo_xuoi[i-j+7] && cheo_nguoc[i+j])
{ loi_giai[i]= j;
hang_trong[j]=FALSE; cheo_xuoi[i-j+7] = FALSE;
cheo_nguoc[i+j]=FALSE;
if (i < 7)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
0

chon_vi_tri (i+1,q);
if (q==FALSE)
{
hang_trong[j]=TRUE; cheo_xuoi[i-j+7] = TRUE;
cheo_nguoc[i+j]=TRUE;
}
}
else q=TRUE;
}
} while ((q==FALSE) && (j<7)); //Cha th{nh cng v{ cha ht v tr
// th tip tc
}
void main (void)
{
/*Khoi dong tat ca cac hang, duong cheo xuoi, duong cheo nguoc deu co the
dat hoang hau */
for(i = 0; i < 8; i++)
hang_trong[i] = TRUE;
for(i = 0; i < 15; i++)
{
cheo_xuoi [i] = TRUE;
cheo_nguoc[i] = TRUE;
}
// Goi ham de qui de bat dau dat HoangHau0 (hoang hau o cot 0)
chon_vi_tri (0,q);
in_loigiai(loi_giai);
}
Lu :
- Trn }y l{ thut gii tm mt li gii cho b{i to|n 8 ho{ng hu. Tuy nhin, ta c
th m rng c th tm mi li gii cho b{i to|n. S tng qu|t cho gii thut back-
tracking tm mi li gii cho b{i to|n:
void chon_vi_tri (int i)
{ int j;
for (j=0; j < m; j++)
{ chn bc th j;
if c
{ ghi nhn
if i < n
chon_vi_tri (i+1) ;
else in li gii;
b vic ghi nhn;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
1

}
}
}
- Chng trnh tm mi li gii cho b{i to|n t|m ho{ng hu:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0 // tim tat ca loi giai cho bai toan 8 hoang hauint
hang_trong[8] ; // cot trong con co the dat hoang hauint cheo_xuoi[15];
// duong cheo xuoi co the dat hoang hau
int cheo_nguoc[15]; // duong cheo nguoc co the dat hoang hau
int loi_giai[8] ; // loi giai chua ket qua
int i, q;
int SoLoiGiai =0;
void in_loigiai(int *loigiai)
{
int i, j;
char c;
randomize();
textmode(C80);
textbackground(BLACK);
clrscr();
textcolor(1 + random(15));
cprintf("\n CHUONG TRINH 8 HOANG HAU\n ");
printf("\n Loi giai thu %d", ++SoLoiGiai);
printf("\n\n\t\t 0 1 2 3 4 5 6 7 ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 0 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 1 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 2 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 3 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 4 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 5 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 6 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
printf("\n\t\t 7 |-----|-----|-----|-----|-----|-----|-----|-----| ");
printf("\n\t\t +-----+-----+-----+-----+-----+-----+-----+-----+ ");
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
2

for(i = 0; i < 8; i++)
{
gotoxy(24+5*i,8+2*loigiai[i] );
textcolor(1 + random(15));
cprintf("Q");
}
gotoxy(13, 25);
printf("Nhan phim <ESC> de thoat, nhan phim bat ky de tiep tuc ...");
c = getche();
if(c == 27)
exit(1);
}
void chon_vi_tri( int i)
{ int j;
for (j=0; j<8; j++)
{
if (hang_trong[j] && cheo_xuoi[i-j+7] && cheo_nguoc[i+j])
{ loi_giai[i]= j;
hang_trong[j]=FALSE; cheo_xuoi[i-j+7] = FALSE;
cheo_nguoc[i+j]=FALSE;
if (i < 7)
chon_vi_tri (i+1);
else in_loigiai(loi_giai);
hang_trong[j]=TRUE; cheo_xuoi[i-j+7] = TRUE; cheo_nguoc[i+j]=TRUE;
}
} // for
} // chon_vi_tri
void main(void)
{
/* Khoi dong tat ca cac cot, duong cheo xuoi, duong cheo nguoc deu co the dat
hoang hau */
for(i = 0; i < 8; i++)
hang_trong[i] = TRUE;
for(i = 0; i < 15; i++)
{
cheo_xuoi [i] = TRUE;
cheo_nguoc[i] = TRUE;
}
// Goi ham de qui de bat dau dat HoangHau0 (hoang hau o hang 0)
chon_vi_tri (0);
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
3

BI TP
1. Vit mt h{m quy v{ khng quy tnh gi| tr ca h{m
{ 1 , n=0
Pn(x)= x , n =1
Pn-1(x) - Pn-2 (x) , n >= 2
2. Vit chng trnh Th|p H{ Ni.
M t chng trnh Th|p H{ Ni : Ta c 3 cc A, B, C v{ n da c xp trn cc
A sao cho da nh trn da ln.
H~y vit chng trnh di chuyn n da t cc A sang cc C vi cc B l{m trung
gian, theo iu kin :
- Mi ln ch di chuyn mt da
- Bao gi da nh cng nm trn da ln
3. Vit chng trnh tm mi li gii cho b{i to|n m~ i tun.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
4

CHNG III
DANH SCH TUYN TNH
KHI NIM :
Danh s|ch l{ mt tp hp n phn t a0, a1, a2,....., an-1, mi phn t c kiu n gin
hoc kiu d liu c cu trc.
Tnh tuyn tnh ca danh s|ch th hin s r{ng buc gia c|c phn t trong danh
s|ch vi nhau, v d nh t v tr ca phn t ai ta s tm c gi| tr ca phn t ai+1.
I. NH NGHA:
Danh s|ch tuyn tnh l{ 1 d~y c|c phn t c cng kiu d liu c sp xp lin
tip nhau trong b nh.
0100
0102 0 int
0104 1 danh s|ch n phn t

n-1
B nh
c im ca danh s|ch tuyn tnh:
- Kch thc ca danh s|ch s c cp ph|t theo khai b|o.
- C|c phn t ca danh s|ch nm lin tc nhau trong b nh, gia c|c phn t n{y
khng c khong trng.
- Tiu biu cho danh s|ch c l{ d~y (array). c{i t danh s|ch tuyn tnh, ta
dng mng 1 chiu.
+ Khai bo: Ta khai b|o cu trc list l{ mt mu tin (struct) c 2 field:
- n : cho bit s phn t hin c trong danh s|ch. Nu n ==0 th c ngha l{ danh
s|ch rng.
- danhsach : l{ mng 1 chiu, mi phn t ca mng l{ 1 phn t trong danh s|ch.
#define MAXLIST 100
typedef struct list
{ int n; // s nt ca danh s|ch
int danhsach[MAXLIST]; // danh s|ch l{ m~ng 1 chiu
};
list ds; // bin ds thuc kiu struct list
V d: Khai b|o 1 danh s|ch h tn hc vin ca 1 lp hc, c ti a 50 hc vin.
#define MAXLIST 50
typedef struct list
{ int n;
char dshv[MAXLIST][30]; // h tn hc vin c ti a 30 k t
};
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
5

list ds;
II. CC PHP TON TRN DANH SCH TUYN TNH:
n gin, c|c php to|n sau }y s c thao t|c trn danh s|ch c|c s nguyn
vi khai b|o nh sau:
#define MAXLIST 100
typedef struct list
{ int n; // s nt ca danh s|ch
int nodes[MAXLIST]; // danh s|ch l{ m~ng 1 chiu
};
struct list ds; // bin ds thuc kiu struct list
1. Php ton Empty: kim tra xem danh s|ch c rng hay khng?
int Empty(struct list plist)
{
return (plist.n==0 ? TRUE : FALSE);
}
2. Php ton Full: kim tra xem danh s|ch ~ y cha?
int Full(struct list plist)
{
return (plist.n==MAXLIST ? TRUE : FALSE);
}
3. Php thm vo : Thm mt phn t c ni dung l{ info v{o v tr th i ca danh
sch.
Nu i ==0 : thm phn t v{o u danh s|ch
Nu i ==ds.n+1 : thm phn t v{o cui danh s|ch.
Lu :
Khi thm mt phn t v{o danh s|ch, ta phi kim tra xem danh s|ch ~ y hay
cha?
void Insert_item(struct list &plist, int i, int info)
{
int j;
if(i < 0 || i > plist.n+1)
printf("Vi tri chen khong phu hop.");
else
if(Full(plist))
printf("Danh sach bi day.");
else
{ if (i==0) i=1;
for(j = plist.n -1; j >= i-1; j--)
plist.nodes[j+1] = plist.nodes[j];
plist.nodes[i-1] = info;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
6

plist.n ++;
}
}
4. Php loi b : Loi b phn t th i khi danh s|ch tuyn tnh. Khi loi b 1
phn t th danh s|ch phi c t nht mt phn t.
void Delete_item (struct list &plist, int i)
{
int j;
int temp;
if(i <= 0 || i > plist.n)
printf("Vi tri xoa khong phu hop.");
else
if(Empty(plist))
printf("Danh sach khong co phan tu.");
else
{
for(j = i; j< plist.n ; j++)
plist.nodes[j-1] = plist.nodes[j];
plist.n--;
}
}
* Mun loi b tt c c|c phn t trong danh s|ch, ta ch cn cho ds.n=0
5. Duyt danh s|ch: duyt t u cho n cui danh s|ch, mi phn t c duyt
qua 1 ln. Gi s ta duyt danh s|ch in gi| tr c|c phn t.
void Traverse(struct list plist)
{
int i;
if(plist.n == 0)
{
printf("\n Danh sach khong co phan tu");
return;
}
for(i = 0; i < plist.n; i++)
printf("%7d", plist.nodes[i]);
}
6. Tm kim: tm v tr u tin ca phn t c gi| tr x trong danh s|ch plist. Nu
khng c x trong plist th h{m Search_info s tr v gi| tr -1.
int Search_info(struct list plist, int info)
{
int vitri = 0;
while( vitri < plist.n && plist.nodes[vitri] != info )
vitri++;
return(vitri==plist.n ? -1 : vitri+1);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
7

}
Lu : nhp danh s|ch, ta c th dng gii thut sau:
void Create_list(struct list &plist)
{ int i;
printf("\nSo phan tu cua danh sach :");
scanf("%d", &plist.n);
for (i=0; i< plist.n; i++)
{ printf("List[%d] =", i+1);
scanf("%d",&plist.nodes[i]);
}
}
Nhn xt : Danh s|ch c dng phng ph|p truy xut trc tip nn thi gian truy
xut nhanh, nhng hiu qu s dng b nh thp. Danh s|ch c khng ph hp vi
php thm v{o v{ loi b v mi ln thm v{o v{ loi b th chng ta phi i ch nhiu
ln. c bit trng hp xu nht l{ khi thm v{o v{ loi b u danh sch
Kt lun : Danh s|ch c khng nn s dng cho c|c danh s|ch hay b bin ng.
Cn i vi nhng danh s|ch thng b bin ng th ngi ta chn cu trc l{ danh
s|ch lin kt.
V d: To mt menu cho php ta thc hin c|c php to|n sau trn danh s|ch c|c s
nguyn:
1. To danh s|ch
2. Lit k danh s|ch trn m{n hnh
3. Thm mt phn t c gi| tr info ti v tr th i
- Nu i ==0 : thm phn t v{o u danh s|ch
- Nu i ==ds.n+1 : thm phn t v{o cui danh s|ch.
4. Xa phn t u tin c gi| tr info trong danh sch
5. Xa to{n b danh s|ch. Trc khi xa hi li ngi s dng c mun xa hay
khng? Nu ngi s dng ng "C" th mi xa.
* Chng trnh :
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define MAXLIST 100 // so phan tu toi da trong danh sach
#define TRUE 1
#define FALSE 0
typedef struct list
{
int n;
int nodes[MAXLIST];
};
// Phep toan empty: kiem tra danh sach co bi rong khong
int empty(struct list plist)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
8

{
return(plist.n == 0 ? TRUE : FALSE);
}
// Phep toan full: kiem tra danh sach bi day khong
int full(struct list plist)
{
return(plist.n == MAXLIST ? TRUE : FALSE);
}
// Tao danh sach
void create_list(struct list &plist)
{ int i;
printf("\nSo phan tu cua danh sach :");
scanf("%d", &plist.n);
for (i=0; i< plist.n; i++)
{ printf("List[%d] =", i+1);
scanf("%d",&plist.nodes[i]);
}
}
// Tac vu insert_item: chen nut co noi dung info vao vi tri i
// i==0 : them vao dau danh sach
// i==plist->n +1 : them vao cuoi danh sach
void insert_item(struct list &plist, int i, int info)
{
int j;
if(i < 0 || i > plist.n+1)
printf("Vi tri chen khong phu hop.");
else
if(full(plist))
printf("Danh sach bi day.");
else
{ if (i==0) i=1;
for(j = plist.n -1; j >= i-1; j--)
plist.nodes[j+1] = plist.nodes[j];
plist.nodes[i-1] = info;
plist.n ++;
}
}
// Tac vu delete_item: xoa nut tai vi tri i trong danh sach
void delete_item (struct list &plist, int i)
{
int j;
int temp;
if(i <= 0 || i > plist.n)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
3
9

printf("Vi tri xoa khong phu hop.");
else
if(empty(plist))
printf("Danh sach khong co phan tu.");
else
{
for(j = i; j< plist.n ; j++)
plist.nodes[j-1] = plist.nodes[j];
plist.n--;
}
}
// Tac vu clearlist: xoa tat ca cac nut trong danh sach
void clearlist(struct list &plist)
{
plist.n = 0;
}
// Tac vu traverse: duyet danh sach cac so nguyen
void traverse(struct list plist)
{
int i;
if(plist.n == 0)
{
printf("\n Danh sach khong co phan tu");
return;
}
for(i = 0; i < plist.n; i++)
printf("%7d", plist.nodes[i]);
}
/* Phep toan search: tim kiem tuyen tinh, neu khong tim thay ham nay tra
ve -1, neu tim thay ham nay tra ve vi tri tim thay */
int search_info(struct list plist, int info)
{
int vitri = 0;
while( vitri < plist.n && plist.nodes[vitri] != info )
vitri++;
return(vitri==plist.n ? -1 : vitri+1);
}
int menu()
{ int chucnang;
clrscr();
// menu chinh cua chuong trinh
printf("\n\n CHUONG TRINH QUAN LY DANH SACH CAC SO \n");
printf(" Cac chuc nang cua chuong trinh:\n");
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
0

printf(" 1: Nhap danh sach\n");
printf(" 2: Xem danh sach \n");
printf(" 3: Them mot so vao vi tri thu i\n");
printf(" 4: Xoa phan tu dau tien co tri info\n");
printf(" 5: Xoa toan bo danh sach\n");
printf(" 0: Ket thuc chuong trinh\n");
printf(" Chuc nang ban chon: ");
do
scanf("%d", &chucnang);
while (chucnang<0 || chucnang >5);
return chucnang;
}
void main()
{
struct list ds;
int chucnang, vitri, info;
char c;
ds.n=0;
do
{
clrscr();
chucnang=menu();
switch(chucnang)
{
case 1:
{
printf("\nNhap danh sach: ");
create_list(ds);
break;
}
case 2:
{
printf("\nDanh sach so: ");
traverse(ds);
getche();
break;
}
case 3:
{
printf("\nVi tri them (1, 2, ...): ");
scanf("%d", &vitri);
printf("Gia tri: ");
scanf("%d", &info);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
1

insert_item(ds, vitri, info);
getche();
break;
}
case 4:
{
printf("\nGia tri so can xoa: ");
scanf("%d", &info);
vitri = search_info(ds, info);
if(vitri == -1)
printf("Khong co so %d trong danh sach", info);
else
delete_item(ds, vitri);
getche();
break;
}
case 5:
{
printf("\nBan co chac muon xoa hay khong (c/k):");
c = toupper(getche());
if( c == 'C')
clearlist(ds);
break;
}
}
} while(chucnang != 0);
}
III. STACK (CHNG):
III.1. Kh|i nim:
Stack l{ mt danh s|ch m{ vic thm v{o v{ loi b ch din ra cng mt u ca
danh s|ch, tc l{ theo c ch LIFO (Last In First Out). Stack gm nhiu phn t c cng
kiu d liu, phn t trn cng Stack lun lun c mt con tr ch ti ta gi l{ Stack
Pointer (k hiu: sp).
to Stack ta c hai c|ch : danh s|ch tuyn tnh (mng) hoc danh s|ch lin kt
(con tr). Trong chng n{y, ta ch quan t}m n vic to Stack bng danh s|ch tuyn
tnh.
- Stack c 2 php ton chnh :
* Push : thm mt phn t v{o u Stack
* Pop : xa mt phn t khi Stack, tr cho chng trnh gi gi| tr ca phn t va
xa.
Di }y l{ hnh minh ha cho c|c php to|n push, pop trn Stack.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
2


* Lu : Ta khai b|o bin st c kiu cu trc stack nh sau:
#define STACKSIZE 100
#define TRUE 1
#define FALSE 0
struct stack
{
int sp;
int nodes[STACKSIZE];
} st;
III.2. Cc php ton trn stack:
a. Php ton push : thm mt phn t c gi| tr x v{o u stack
void push (struct stack &st, int x)
{
if(st.sp == STACKSIZE-1)
{
printf("%s", "stack bi day");
exit(1);
}
else
st.nodes[++(st.sp)] = x;
}
b. Php ton pop : loi b phn t khi Stack v{ tr v gi| tr ca phn t va xa;
trc khi xa, ta phi kim tra Stack c kh|c rng hay khng.
20
15
10
5
0
1
2
3
sp
push(20)
20
15
10
5
0
1
2
3
sp
20
4
(a)
(b)
20
15
10
5
0
1
2
3
sp
20
4
(d)
20
15
10
5
0
1
2
3
20
4
(c)
1
sp
5
push(1) pop()
20
15
10
5
0
1
2
3
sp
push(20)
20
15
10
5
0
1
2
3
sp
20
4
(a)
(b)
20
15
10
5
0
1
2
3
sp
20
4
(d)
20
15
10
5
0
1
2
3
20
4
(c)
1
sp
5
push(1) pop()
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
3

int pop(struct stack &st)
{
if(empty(st))
{
printf("%s", "stack bi rong");
exit(1);
}
return(st.nodes[(st.sp)--]);
}
ng dng ca Stack:
- Stack thng c dng trong c|c b{i to|n c c ch LIFO (v{o sau ra trc)
- Stack cng c dng trong c|c b{i to|n g qui (chuyn mt gii thut qui
th{nh gii thut khng qui)
III.3. V d:
a. Vit chng trnh i s nguyn khng }m h thp ph}n sang s h nh ph}n.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define STACKSIZE 100
#define TRUE 1
#define FALSE 0
struct stack
{
int sp;
int nodes[STACKSIZE];
};
int empty(struct stack st)
{
if(st.sp == -1)
return(TRUE);
else
return(FALSE);
}
void push(struct stack &st, int x)
{
if(st.sp == STACKSIZE-1)
{
printf("%s", "stack bi day");
exit(1);
}
else
st.nodes[++(st.sp)] = x;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
4

int pop(struct stack &st)
{
if(empty(st))
{
printf("%s", "stack bi rong");
exit(1);
}
return(st.nodes[(st.sp)--]);
}
void main()
{
struct stack st;
int sodu;
long int so;
char c;
clrscr();
do
{
st.sp =- 1; // khoi dong stack
printf("\n\nNhap vao mot so thap phan: ");
scanf("%lD", &so);
do
{
sodu = so % 2;
push(st, sodu); // push so du vao stack
so = so / 2;
} while (so != 0);
printf("So da doi la: ");
while(!empty(st))
printf("%d", pop(st)); // pop so du ra khoi stack
printf("\n\nBan co muon tiep tuc khong? (c/k): ");
c = getche();
} while(c == 'c' || c == 'C');
}
b. Vit chng trnh tnh tr mt biu thc dng hu t (PostFix), bit rng mi s
hng l{ 1 k s v{ c|c to|n t trong biu thc gm c: cng(+), tr (-), nhn (*), chia (/),
ly tha (^).
Dng hu t ca biu thc c dng nh sau:
82- = 6
84-21+^ = 64
23+3^ = 125
#include <stdio.h>
#include <stdlib.h>
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
5

#include <conio.h>
#include <math.h>
#define TOIDA 80
#define TRUE 1
#define FALSE 0
// Khai bao stack chua cac toan hang
struct stack
{
int sp;
double nodes[TOIDA];
} st;
int empty(struct stack st)
{
if (st.sp == -1)
return(TRUE);
else
return(FALSE);
}
void push(struct stack &st, double x)
{
if(st.sp == TOIDA-1)
{
printf("%s", "stack bi day");
exit(1);
}
else
st.nodes[++(st.sp)] = x;
}
double pop(struct stack &st)
{
if(empty(st))
{
printf("%s", "Bieu thuc sai nen khong the tinh");
getch();
exit(1);
}
else
return(st.nodes[st.sp--]);
}
/* Ham tinh: tnh tr ca hai to|n hng toanhang1 va toanhang2 qua
php ton toantu */
double tinh(int toantu, double toanhang1, double toanhang2)
{
switch(toantu)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
6

{
case '+':
return(toanhang1 + toanhang2); break;
case '-':
return(toanhang1 - toanhang2); break;
case '*':
return(toanhang1 * toanhang2); break;
case '/':
return(toanhang1 / toanhang2); break;
case '^':
return(pow(toanhang1, toanhang2)); break;
default:
printf("%s", "toan tu khong hop le");
exit(1);
}
}
// H{m dinhtri: tnh mt biu thc postfix
double dinhtri(char bieuthuc[])
{
int c, i;
double toanhang1, toanhang2, tri;
st.sp = -1; // khoi dong stack
for(i = 0; (c = bieuthuc[i]) != '\0'; i++)
if(c>='0' && c<='9') // c la toan hang
push(st, (double)(c-'0'));
else // c la toan tu
{
toanhang2 = pop(st);
toanhang1 = pop(st);
tri = tinh(c, toanhang1, toanhang2); // tinh ket qua trung gian
push(st, tri);
}
return(pop(st));
}
void main()
{
char c, bieuthuc[TOIDA];
clrscr();
do
{
printf("\n\nNhap bieu thuc postfix can dinh tri: ");
gets(bieuthuc);
double ketqua = dinhtri(bieuthuc) ;
if (empty(st))
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
7

printf("Bieu thuc %s co tri la %5.2f", bieuthuc, ketqua);
else
printf("Bieu thuc sai nen khong the tinh");
printf("\n\nTiep tuc khong ? (c/k): ");
c = getche();
} while(c == 'c' || c == 'C');
}
IV. QUEUE (HNG I):
IV.1. Kh|i nim:
Queue l{ mt danh s|ch hn ch m{ vic thm v{o c thc hin u danh s|ch,
v{ vic loi b c thc hin u cn li (FIFO - First In First Out). Queue cha c|c
phn t c cng kiu d liu. Queue cng c th c t chc theo danh s|ch tuyn tnh
hoc danh s|ch lin kt. }y, ta ch t chc queue theo danh s|ch tuyn tnh.
- V tr loi b phn t c gi l{ Front
- V tr thm v{o c gi l{ Rear
Queue c hai php ton chnh:
- Insert_queue : thm mt phn t v{o h{ng i; khi thm ta phi lu xem h{ng
i b tr{n hay b y x l cho thch hp.
+ H{ng i b tr{n : l{ trng hp khi Rear = QUEUESIZE-1 (=n) v Front > 0, tc l{
khng th thm phn t mi v{o cui h{ng. khc phc trng hp n{y, ta c th dng
mt trong 2 c|ch:
Di chuyn tnh tin tng phn t ln c Front = 0 v{ Rear < QUEUESIZE-1
(trng hp n{y Front lun nh hn Rear)
Di chuyn vng : cho Rear = 0, Front gi nguyn
(trng hp n{y Front c lc nh hn, c lc ln hn Rear )

H{ng i b tr{n Rear > Front Rear >< Front
+ H{ng i b y: h{ng i khng c phn t n{o trng: Front = 0 v{ Rear = n hoc
Rear ng ngay trc Front; do nu tip tc thm v{o s b mt d liu.
Rear = QUEUESIZE-1
Front = -1
} Rear - Front + 1 =
QUEUESIZE

hoc
Rear ng ngay trc Front:
Rear - Front + 1 = 0
C
B
A
Rear
Front
C
B
A
Rear
Front
Di chuyn
tnh tin
C
B
A
Rear
Front
Di chuyn
vng
0
1
2
3
n
C
B
A
Rear
Front
C
B
A
Rear
Front
Di chuyn
tnh tin
C
B
A
Rear Rear
Front Front
Di chuyn
vng
0
1
2
3
n
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
8


- Delete_queue: loi b phn t khi Queue v{ tr v gi| tr ca phn t va xa;
trc khi xa, ta phi kim tra Queue c kh|c rng hay khng.
- Khi to h{ng i:
Front := -1;
Rear := -1;
Lu :
- Php ton Insert_queue thc hin cui h{ng i, cn php to|n Delete_queue
thc hin u h{ng i.
Ta khai b|o bin q c kiu cu trc Queue gm 3 th{nh phn:
- front, rear : s nguyn ch u v{ cui h{ng i
- nodes: mng 1 chiu, mi phn t ca mng l{ 1 phn t trong queue.
#define QUEUESIZE 100
#define TRUE 1
#define FALSE 0
struct queue
{
int front, rear;
int nodes[QUEUESIZE];
} q;
IV.2. Cc php ton trn hng: i vi h{ng i, ta c hai php to|n ch yu l{
thm v{o (Insert_queue) v{ loi b (Delete_queue).
a. Php thm vo : thm mt phn t x v{o h{ng i; khi thm ta phi lu xem
h{ng i b tr{n hay b y x l cho thch hp.
int Insert_queue(struct queue &q, int x)
{
if (q.rear - q.front + 1== 0 || q.rear -q.front+1== QUEUESIZE)
return 0 ;
else
{
if(q.front==-1)
{ q.front=0;
q.rear =-1;
Rear
Front
n
0
Rear - Front + 1 = QUEUESIZE
Rear
Front
Rear - Front + 1 = 0
Rear
Front
n
0
Rear - Front + 1 = QUEUESIZE
Rear
Front
Rear - Front + 1 = 0
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
4
9

}
if (q.rear==QUEUESIZE-1) q.rear=-1;
++q.rear;
q.nodes[q.rear]=x;
return 1;
}
}
b. Php loi b : loi b phn t khi Queue v{ tr v gi| tr ca phn t va xa;
trc khi xa, ta phi kim tra Queue c kh|c rng hay khng.
int Delete_queue(struct queue &q, int &x)
{
if(empty(q))
return 0;
else
{
x= q.nodes[q.front];
if(q.front == q.rear) // Hang chi co 1 phan tu
{
q.front = -1;
q.rear = -1;
}
else
{
(q.front)++;
if (q.front ==QUEUESIZE)
q.front=0;
}
return 1;
}
}
* ng dng ca Queue:
- Queue thng c dng trong c|c b{i to|n c c ch FIFO (v{o trc ra trc).
- Queue thng c dng trong c|c cng vic ang i phc v trong c|c h iu
h{nh a nhim, qun l c|c h{ng i in trn m|y in mng (print server)...
IV.3. V d:
Vit chng trnh i phn thp ph}n ca s khng }m h thp ph}n sang s h
nh ph}n, ti a ta ch ly 8 s l trong h nh ph}n
* Gii thut:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
0

#define QUEUESIZE 8
#define TRUE 1
#define FALSE 0
struct queue
{
int front, rear;
int nodes[QUEUESIZE];
};
struct queue q;
void Initialize(struct queue &q)
{
q.front = q.rear = -1;
}
int empty(struct queue q)
{
return((q.front == -1 || q.rear== -1) ? TRUE : FALSE);
}
void Insert_queue(struct queue &q, int x)
{
if (q.rear - q.front + 1== 0 || q.rear -q.front+1== QUEUESIZE)
{
printf("\nHang bi day");
}
else
{
if(q.front==-1)
{ q.front=0;
q.rear =-1;
}
if (q.rear==QUEUESIZE-1) q.rear=-1;
++q.rear;
q.nodes[q.rear]=x;
}
}
int Delete_queue(struct queue &q)
{
int x;
if(empty(q))
printf("Hang doi rong");
else
{
x= q.nodes[q.front];
if(q.front == q.rear) // Hang chi co 1 phan tu
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
1

q.front = -1;
q.rear = -1;
}
else
{
(q.front)++;
if (q.front ==QUEUESIZE)
q.front=0;
}
return x;
}
}
void dec_bin2(double n)
{ double positive;
double r, le;
le = modf(n,&positive); // H{m modf t|ch s double n ra th{nh 2 phn
// phn nguyn cha trong positive (double) v{ phn thp ph}n cha
// trong le (double)
int i=0;
do
{ r =le*2;
le = modf(r,&positive);
Insert_queue(q, positive);
i++ ;
} while (i <8 && r!=1);
printf("\n So nhi phan cua phan le : 0.");
while (!empty(q))
{
printf("%d", Delete_queue(q));
}
getch();
}
// chuong trinh chinh
void main(void)
{
int chucnang, so;
float n;
clrscr();
// khoi tao queue
Initialize(q);
printf("\nNhap phan thap phan cua so thuc :");
scanf("%e", &n);
dec_bin2(n);
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
2

BI TP
1. Vit chng trnh cho php :
- Nhp mt vn bn c ti a 100 c}u, mi c}u c ti a 80 k t, v{ mi t trong
c}u c t nht mt khong trng. Ta kt thc vic nhp bng c}u rng.
- X l c}u :
+ In ra m{n hnh c|c c}u bt k trong vn bn
+ Loi b mt on gm mt s c}u n{o trong vn bn
+ Xen v{o mt on mi ti mt v tr bt k trong vn bn
- X l t :
+ Cho bit s ln xut hin ca mt t trong vn bn
+ Thay th mt t bng mt t kh|c.
2. To menu thc hin c|c cng vic sau:
a. Nhp danh s|ch hc vin, mi hc vin gm : maso (s nguyn), ho (chui),
ten (chui). Danh s|ch hc vin c lu tr trong 1 danh s|ch tuyn tnh c
ti a 100 phn t.
b. Lit k danh s|ch trn m{n hnh
c. Sp xp li danh s|ch theo th t tng dn ca tn, trng tn th sp qua h.
d. Thm mt hc vin v{o danh s|ch sao cho sau khi thm th vn m bo tnh
th t ca danh s|ch.
e. In ra m{n hnh thng tin ca hc vin c m~ s do ta nhp
f. Xa hc vin c m~ s do ta nhp
g. Save danh s|ch hc vin v{o file DSHV.TXT.
h. Load danh s|ch hc vin t file DSHV.TXT v{o danh s|ch tuyn tnh.
3. To menu thc hin c|c cng vic sau:
a. i s thc dng h thp ph}n sang h nh ph}n
b. i s thc dng h thp ph}n sang h thp lc
c. i s nh ph}n sang s thp ph}n
d. i s thp lc sang s thp ph}n
4. H~y m c bao nhiu bit 1 trong 1000 t, mi t 4 byte
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
3

CHNG IV
DANH SCH LIN KT
(LINKED LIST)
I. KHI NIM:
Cu trc danh s|ch lin kt l{ cu trc ng, vic cp ph|t nt v{ gii phng nt
trn danh s|ch xy ra khi chng trnh ang chy. Ta thng cp ph|t nt cho danh s|ch
lin kt bng bin ng. Danh s|ch lin kt c nhiu loi nh danh s|ch lin kt n,
danh s|ch lin kt kp, danh s|ch lin kt a v{ danh s|ch lin kt vng. Trong chng
n{y ra s kho s|t mt s loi danh s|ch lin kt nh n, kp v{ vng.
C|c phn t trong danh s|ch lin kt s c cp ph|t vng nh trong qu| trnh
thc thi chng trnh, do chng c th nm ri r|c nhiu ni kh|c nhau trong b
nh (khng lin tc).



Null
Firs
t

1 2 3 4

Hnh 4.1 Minh ha danh sch lin kt trong b nh
C|c phn t trong danh s|ch c kt ni vi nhau theo chm lin kt nh hnh
trn:
- First l{ con tr ch n phn t u ca danh s|ch lin kt
- Phn t cui ca danh s|ch lin kt vi vng lin kt c gi| tr NULL
- Mi nt ca danh s|ch c trng info cha ni dung ca nt v{ trng next l
con tr ch n nt k tip trong danh s|ch.
* Lu :
- Cu trc danh s|ch lin kt l{ cu trc ng, c|c nt c cp ph|t hoc b gii
phng khi chng trnh ang chy.
- Danh s|ch lin kt rt thch hp khi thc hin c|c php to|n trn danh s|ch
thng b bin ng. Trong trng hp xa hay thm phn t trong danh s|ch lin kt
th ta khng di c|c phn t i nh trong danh s|ch tuyn tnh (mng) m{ ch vic hiu
chnh li trng next ti c|c nt ang thao t|c. Thi gian thc hin c|c php to|n thm
v{o v{ loi b khng ph thuc v{o s phn t ca danh s|ch lin kt.
- Tuy nhin, danh sch lin kt cng c c|c im hn ch sau:
3
.
First
Nul
1
.
2
4
.
.
3
.
First
Nul
1
.
2
4
.
.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
4

+ V mi nt ca danh s|ch lin kt phi cha thm trng next nn danh s|ch
lin kt phi tn thm b nh.
+ Tm kim trn danh s|ch lin kt khng nhanh v ta ch c truy xut tun t
t u danh s|ch.
Khai bo : Mt phn t ca danh s|ch lin kt t nht phi c hai th{nh phn : ni
dung ca phn t (info) v{ th{nh phn next lin kt phn t n{y vi phn t kh|c.
Gi s ta khai b|o kiu NODEPTR l{ kiu con tr ch n nt trong 1 danh sch lin
kt, mi phn t c 2 th{nh phn : info (s nguyn) v{ next.
struct node
{ int info ;
struct node *next ;
};
typedef struct node *NODEPTR;
- khai b|o bin First qun l danh s|ch lin kt ta vit nh sau:
NODEPTR First;
- Khi to danh s|ch lin kt : First = NULL;
- Ghi ch :
Th{nh phn cha ni dung c th gm nhiu vng vi c|c kiu d liu kh|c nhau.
V d: Khai b|o bin First qun l mt danh s|ch sinh vin vi cu trc d liu l{
danh sch lin kt n, mi sinh vin gm c 2 th{nh phn l{: mssv (s nguyn) v{ h
tn.
struct sinhvien
int mssv;
char hoten[30];
};
struct node
{ sinhvien sv ;
struct node *next ;
};
typedef struct node *NODEPTR;
NODEPTR First;
Th{nh phn lin kt cng c th nhiu hn mt nu l{ danh s|ch a lin kt hoc
danh s|ch lin kt kp.
First l{ con tr tr n phn t u tin ca danh s|ch lin kt, n c th l{ kiu
con tr (nh khai b|o trn), v{ cng c th l{ mt struct c hai th{nh phn: First tr n
phn t u tin ca danh s|ch lin kt, v{ Last tr n phn t cui ca danh s|ch lin
kt.
struct Linked_List;
{ First NODEPTR;
Last NODEPTR;
};
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
5

II. CC PHP TON TRN DANH SCH LIN KT:
n gin, c|c php to|n sau }y s c thao t|c trn danh s|ch c|c s nguyn
vi khai b|o nh sau:
struct node
{ int info ;
struct node *next ;
};
typedef struct node *NODEPTR;
- khai b|o bin First qun l danh s|ch lin kt ta vit nh sau:
NODEPTR First;
II.1. To danh sch:
a. Khi to danh s|ch (Initialize): dng khi ng mt danh s|ch lin kt, cho
chng trnh hiu l{ hin ti danh s|ch lin kt cha c phn t.
void Initialize(NODEPTR &First)
{
First = NULL;
}
b. Cp ph|t vng nh (New_Node): cp ph|t mt nt cho danh s|ch lin kt. H{m
New_Node n{y tr v a ch ca nt va cp ph|t.
Trong chng trnh c s dng h{m malloc (trong <alloc.h>), h{m n{y cp ph|t
mt khi nh tnh theo byte t b nh heap. Nu cp ph|t th{nh cng, h{m malloc tr v
a ch ca vng nh va cp ph|t, ngc li n s tr v NULL.
NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
}
c. Thm v{o u danh s|ch (Insert_first): thm mt nt c ni dung x v{o u
danh s|ch lin kt.
NULL
First

x

Hnh 4.2 Thm nt c ni dung x vo u danh sch lin kt
void Insert_first(NODEPTR &First, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
6

p->next = First;
First = p;
}
d. Thm nt mi v{o sau nt c a ch p (Insert_after): thm mt nt c ni
dung x v{o sau nt c a ch p trong danh s|ch lin kt First.
NULL
First

x
p
q

Hnh 4.3 Thm nt c ni dung x vo sau nt c a ch p
void Insert_after(NODEPTR p, int x)
{
NODEPTR q;
if(p == NULL)
printf("khong them phan tu vao danh sach duoc");
else
{
q = New_node();
q->info = x;
q->next = p->next;
p->next = q;
}
}
II.2. Tm kim (Search_info):
Tm nt u tin trong danh s|ch c info bng vi x. Do }y l{ danh s|ch lin kt
nn ta phi tm t u danh sch.
H{m Search_info nu tm thy x trong danh s|ch th tr v a ch ca nt c tr
bng x trong danh s|ch, nu khng c th tr v tr NULL.
NODEPTR Search_info(NODEPTR First, int x)
{
NODEPTR p;
p = First;
while(p != NULL && p->info != x )
p = p->next;
return(p);
}
II.3. Cp nht danh s|ch:
a. Gii phng vng nh (free): H{m n{y dng hy nt ~ cp ph|t, v{ tr vng
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
7

nh v li cho memory heap.
free( p) ; vi p l{ bin con tr
b. Kim tra danh s|ch lin kt rng hay khng (Empty): hm Empty tr v
TRUE nu danh s|ch lin kt rng, v{ ngc li.
int Empty(NODEPTR First)
{
return(First == NULL ? TRUE : FALSE);
}
c. Xa phn t u ca danh s|ch (Delete_First): mun xa 1 phn t khi danh
s|ch lin kt th ta phi kim tra xem danh s|ch c rng hay khng. Nu danh s|ch c
phn t th mi xa c.
NULL
First

p

Hnh 4.4 Xa nt u tin trong danh sch lin kt
void Delete_First (NODEPTR &First)
{ NODEPTR p;
if (Empty(First))
printf("Danh sach rong nen khong the xoa");
else
{
p = First; // nut can xoa la nut dau
First = p->next;
free(p);
}
}
d. Xa phn t ng sau nt c a ch p (Delete_after):
NULL
First

p q

Hnh 4.5 Xa nt sau nt c a ch p
void Delete_after(NODEPTR p)
{ NODEPTR q;
// nu p l{ NULL hoc sau p khng c nt
if((p == NULL) || (p->next == NULL))
printf("Khong xoa duoc");
else
{
q = p->next; // q chi nut can xoa
p->next = q->next;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
8

free(q);
}
}
e. Xa phn t theo ni dung (Delete_info):
- Tm a ch ca phn t c ni dung l{ x trong danh s|ch lin kt.
- Loi b phn t n{y theo a ch.
void Delete_info(NODEPTR &First,int x)
{ NODEPTR q,p;
p= search_info(First,x);
if (p==NULL)
printf("Khong co gia tri %d trong danh sach", x);
else
{
if (p==First)
Delete_first(First);
else
{
q=First;
while (q->next != p)
q=q->next;
Delete_after(q);
}
printf("Da xoa phan tu co gia tri %d trong danh sach",x);
}
}
Lu : Gii thut n{y ch loi b phn t u tin trong danh s|ch c gi| tr info =
x.
f. Xa to{n b danh s|ch (Clearlist): ta c th s dng lnh First = NULL xa
to{n b danh s|ch, nhng trong b nh, c|c vng nh ~ cp ph|t cho c|c nt khng gii
phng v li cho memory heap, nn s l~ng ph vng nh. Do , ta s dng gii thut
sau:
void Clearlist(NODEPTR &First)
{
NODEPTR p;
while(First != NULL)
{
p = First;
First = First->next;
free(p);
}
}
II.4. Duyt danh s|ch:
Thng thng ta hay duyt danh s|ch lin kt thc hin mt cng vic g ,
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
5
9

nh lit k d liu trong danh s|ch hay m s nt trong danh s|ch...
void Traverse(NODEPTR First)
{ NODEPTR p;
int stt = 0;
p = First;
if(p == NULL)
printf("\n (Khong co phan tu trong danh sach)");
while(p != NULL)
{
printf("\n %5d%8d", stt++, p->info);
p = p->next;
}
}
II.5. Sp xp (Selection_Sort): sp xp danh s|ch lin kt theo th t info tng
dn.
- Ni dung: Ta so s|nh tt c c|c phn t ca danh s|ch chn ra mt phn t nh
nht a v u danh s|ch; sau , tip tc chn phn t nh nht trong c|c phn t cn
li a v phn t th hai trong danh s|ch. Qu| trnh n{y lp li cho n khi chn ra
c phn t nh th (n-1).
- Gii thut:
void Selection_Sort(NODEPTR &First)
{ NODEPTR p, q, pmin;
int min;
for(p = First; p->next != NULL; p = p->next)
{ min = p->info;
pmin = p;
for(q = p->next; q != NULL; q = q->next)
if(min > q->info)
{
min = q->info;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->info = p->info;
p->info = min;
}
}
III. CC PHP TON TRN DANH SCH LIN KT C TH T:
Danh s|ch lin kt c th t l{ mt danh s|ch lin kt ~ c sp xp theo mt
th t nht nh (tng hay gim) trn mt th{nh phn n{o ca ni dung. }y, ta gi
s danh s|ch lin kt First c th t tng theo th{nh phn info.
III.1. Php thm vo :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
0

Thm v{o danh s|ch lin kt c th t mt phn t c ni dung l{ x sao cho sau khi
thm v{o vn m bo tnh c th t ca danh s|ch.
NULL
First

t s
x
p

Hnh 4.6 Thm nt c ni dung x vo danh sch lin kt c th t
* Gii thut:
- To phn t mi, g|n gi| tr x cho n
New_node (p) ;
p->info = x ;
- Tm v tr thch hp a phn t mi v{o, ngha l{ tm hai v tr t v{ s sao cho:
t^.info <= x <= s^.info
for(s = First; s != NULL && s->info < x; t=s, s = s->next);
- G|n lin kt thch hp sao cho p nm gia hai phn t c a ch t v{ s:
if(s == First) // them nut vao dau danh sach lien ket
{
p->next = First;
First = p;
}
else // them nut p vao truoc nut s
{
p->next= s;
t->next= p;
}
* Chng trnh:
void Insert_Order(NODEPTR &First, int x)
{
NODEPTR p, t, s; // q la nut truoc, p la nut sau
p=New_node();
p->info=x;
for(s = First; s != NULL && s->info < x ; t=s, s = s->next);
if(s == First) // them nut vao dau danh sach lien ket
{
p->next = First;
First = p;
}
else // them nut p vao truoc nut s
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
1

{
p->next= s;
t->next= p;
}
}
III.2. Php trn :
Cho hai danh s|ch lin kt First1, First2 ~ c th t. H~y trn hai danh s|ch n{y li
th{nh mt danh s|ch lin kt mi First3 sao cho n cng c th t.
NULL
First1

NULL

First2
1 3
5
10 9 7
2 8

Hnh 4.7 Trn hai danh sch lin kt c th t
a. Gii thut: Gi p1, p2, p3 l{ 3 bin con tr duyt 3 danh s|ch First1, First2,
First3
- To gi nt u tin trong danh s|ch lin kt First3 hnh th{nh mt phn t
cho p3 ch n.
- Duyt First1 v{ First2:
Nu p1->info < p2->info :
a phn t p1 v{o sau phn t p3
Cho p1 ch n phn t k trong danh s|ch First1
Nu p2->info < p1->info :
a phn t p2 v{o sau phn t p3
Cho p2 ch n phn t k trong danh s|ch First2
Qu| trnh duyt s dng li khi 1 trong 2 danh s|ch ~ duyt xong
- a nt phn cn li ca danh s|ch cha duyt xong v{o danh s|ch lin kt
First3.
- Xa phn t gi u danh s|ch First3 ~ to trn.
NODEPTR Merge(NODEPTR First1, NODEPTR First2)
{ NODEPTR p1, p2, p3;
First3=New_node();
p1=First1; p2 = First2; p3=First3;
while (p1 !=NULL && p2 !=NULL)
if (p1->info < p2->info)
{ p3->next = p1;
p3=p1;
p1=p1->next ;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
2

else
{ p3->next = p2;
p3=p2;
p2=p2->next ;
}
if (p1==NULL)
p3->next=p2;
else
p3->next=p1;
p3 = First3;
First3=p3->next;
free(p3);
return First3;
}
V d:
Vit chng trnh to mt menu qun l danh s|ch sinh vin gm c|c cng vic
sau:
1. To danh s|ch sinh vin: Qu| trnh nhp danh s|ch s dng li khi ta nhp m~
s l{ 0.
2. Thm sinh vin v{o danh s|ch: Thm 1 sinh vin v{o danh s|ch, v tr sinh vin
thm vo do ta chn
3. Xem danh s|ch sinh vin: Lit k danh s|ch sinh vin trn m{n hnh
4. Hiu chnh sinh vin: nhp v{o v tr sinh vin cn hiu chnh, sau chng
trnh cho php ta hiu chnh li m~ s, h, tn ca sinh vin.
5. Xa sinh vin trong danh sch: xa sinh vin theo v tr.
6. Tm kim sinh vin theo m~ s: nhp v{o m~ s sinh vin, sau in ra v tr ca
sinh vin trong danh sch.
7. Sp xp danh s|ch sinh vin theo m~ s tng dn
8. Thm sinh vin v{o danh s|ch ~ c th t tng dn theo m~ s sao cho sau
khi thm th danh s|ch vn cn tng dn theo m~ s.
9. Xa to{n b danh s|ch sinh vin.
Bit rng:
- Mi sinh vin gm c|c thng tin: m~ s (int), h, tn
- Danh s|ch sinh vin c t chc theo danh s|ch lin kt n.
Chng trnh:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#include <ctype.h>
#define TRUE 1
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
3

#define FALSE 0
struct sinhvien
{
int mssv;
char ho[30];
char ten[10];
};
struct node
{
sinhvien sv;
struct node *next;
};
typedef node *NODEPTR;
NODEPTR First;
sinhvien sv;
NODEPTR p;
// Phep toan New_node: cap phat mot nut cho danh sach lien ket
NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return(p);
}
/* Tac vu nodepointer: xac dinh con tro cua nut i trong danh sach lien ket
(i = 2, ...) */
NODEPTR nodepointer(NODEPTR First, int i)
{
NODEPTR p;
int vitri=1;
p = First;
while(p != NULL && vitri < i)
{
p = p->next;
vitri++;
}
return(p);
}
// Tac vu position: xac dinh vi tri cua nut p trong danh sach lien ket
int position(NODEPTR First, NODEPTR p)
{
int vitri;
NODEPTR q;
q = First;
vitri = 1;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
4

while(q != NULL && q != p)
{
q = q->next;
vitri++;
}
if(q == NULL)
return(-1);
return(vitri);
}
// Phep toan initialize: khoi dong danh sach lien ket
void initialize(NODEPTR &First)
{
First = NULL;
}
// Tac vu Empty: kiem tra danh sach lien ket co bi rong khong
int Empty(NODEPTR First)
{
return(First == NULL ? TRUE : FALSE);
}
// Phep toan Insert_first: them nut moi vao dau danh sach lien ket
void Insert_first(NODEPTR &First, sinhvien x)
{
NODEPTR p;
p = New_node();
p->sv = x;
p->next = First;
First = p;
}
// Phep toan Insert_after: them nut moi sau nut co dia chi p
void Insert_after(NODEPTR p, sinhvien x)
{
NODEPTR q;
if(p == NULL)
printf("khong them sinh vien vao danh sach duoc");
else
{
q = New_node();
q->sv = x;
q->next = p->next;
p->next = q;
}
}
// Phep toan Delete_first: xoa nut o dau danh sach lien ket
void Delete_first(NODEPTR &First)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
5

{
NODEPTR p;
if(Empty(First))
printf("Khong co sinh vien trong danh sach");
else
{
p = First; // nut can xoa la nut dau
First = p->next;
free(p);
}
}
// Tac vu Delete_after: xoa nut sau nut p
void Delete_after(NODEPTR p)
{
NODEPTR q;
// neu p la NULL hoac p chi nut cuoi
if((p == NULL) || (p->next == NULL))
printf("khong xoa sinh vien nay duoc");
else
{
q = p->next; // q chi nut can xoa
p->next = q->next;
free(q);
}
}
/* Phep toan Insert_Order: Phep toan nay chi su dung khi them nut vao danh
sach lien ket da co thu tu */
void Insert_Order(NODEPTR &First, sinhvien x)
{
NODEPTR p, q; // q la nut truoc, p la nut sau
q = NULL;
for(p = First; p != NULL && p->sv.mssv< x.mssv; p = p->next)
q = p;
if(q == NULL) // them nut vao dau danh sach lien ket
Insert_first(First, x);
else // them nut vao sau nut q
Insert_after(q, x);
}
// Phep toan clearlist: xoa tat ca cac nut trong danh sach lien ket
void clearlist(NODEPTR &First)
{
NODEPTR p, q; // q la nut truoc, p la nut sau
p = First;
while(First != NULL)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
6

{
p = First;
First = First->next;
free(p);
}
}
// Phep toan traverse: duyet danh sach lien ket
void traverse(NODEPTR First)
{
NODEPTR p;
int stt = 0;
p = First;
if(p == NULL)
printf("\n (Khong co sinh vien trong danh sach)");
while(p != NULL)
{
printf("\n %5d %8d %-30s %-10s", ++stt, p->sv.mssv, p->sv.ho,p->sv.ten);
p = p->next;
}
}

/* Tac vu search_info: tim kiem theo phuong phap tim kiem tuyen tinh, neu
khong tim thay ham nay tra ve NULL, neu tim thay ham nay tra ve con tro chi
nut tim thay */
NODEPTR search_info(NODEPTR First, int x)
{
NODEPTR p;
p = First;
while(p != NULL && p->sv.mssv != x )
p = p->next;
return(p);
}
// Tac vu selectionsort: sap xep danh sach lien ket theo MSSV tang dan
void selectionsort(NODEPTR &First)
{
NODEPTR p, q, pmin;
sinhvien min;
for(p = First; p->next != NULL; p = p->next)
{
min = p->sv;
pmin = p;
for(q = p->next; q != NULL; q = q->next)
if(min.mssv > q->sv.mssv)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
7

min = q->sv;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->sv = p->sv;
p->sv = min;
}
}
char menu ()
{ char chucnang;
do
{ clrscr();
printf("\n\n\t\tCHUONG TRINH QUAN LY DANH SACH SINH VIEN");
printf("\n\nCac chuc nang cua chuong trinh:\n");
printf(" 1: Tao danh sach sinh vien\n");
printf(" 2: Them sinh vien vao danh sach\n");
printf(" 3: Xem danh sach sinh vien\n");
printf(" 4: Hieu chinh sinh vien\n");
printf(" 5: Xoa sinh vien trong danh sach\n");
printf(" 6: Tim kiem sinh vien theo MSSV\n");
printf(" 7: Sap xep danh sach theo MSSV\n");
printf(" 8: Them sinh vien vao danh sach da co thu tu\n");
printf(" 9: Xoa toan bo danh sach\n");
printf(" 0: Ket thuc chuong trinh\n");
printf("Chuc nang ban chon: ");
chucnang = getche();
} while(chucnang < '0' || chucnang >'9') ;
return chucnang;
}
void Create_list(NODEPTR &First)
{ NODEPTR Last,p ;
sinhvien sv;

char maso [5],c;
clearlist(First);
printf("Ma so sinh vien: ");
gets(maso);
sv.mssv = atoi(maso);
while (sv.mssv !=0)
{
printf("Ho sinh vien: ");
gets(sv.ho);
printf("Ten sinh vien: ");
gets(sv.ten);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
8

p=New_node();
p->sv=sv;
if (First==NULL)
First=p;
else
Last->next = p;
Last=p;
p->next=NULL;
printf("Ma so sinh vien moi: ");
gets(maso);
sv.mssv = atoi(maso);
}
}
// chuong trinh chinh
void main()
{
int vitri;
char chucnang, c, maso [5], c_vitri[5];
// khoi dong danh sach lien ket
initialize(First);
do
{
chucnang = menu();
flushall();
switch(chucnang)
{
case '1':
{
Create_list(First);
break;
}
case '2':
{
printf("\nVi tri them (1, 2, ...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri-1);//p chi nut truoc nut can them
if (vitri <=0 || p==NULL)
{
printf("Vi tri khong hop le");
getche();
}
else
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
6
9

{
printf("Ma so sinh vien: ");
gets(maso);
sv.mssv = atoi(maso);
printf("Ho sinh vien: ");
gets(sv.ho);
printf("Ten sinh vien: ");
gets(sv.ten);
if (vitri == 1)
Insert_first(First, sv);
else
Insert_after(p, sv);
}
break;
}
case '3':
{
printf("\nDanh sach sinh vien: ");
printf("\n STT MSSV HO TEN");
traverse(First);
getche();
break;
}
case '4':
{
printf("\nVi tri hieu chinh (1, 2, ...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri); // p chi nut can hieu chinh
if(p == NULL)
{
printf("Vi tri khong phu hop");
getche();
}
else
{
printf("\nSTT:%d MSSV:%d HO:%s TEN:%s",
vitri,p->sv.mssv, p->sv.ho, p->sv.ten);
printf("\nMa so sv moi: ");
gets(maso);
sv.mssv = atoi(maso);
printf("Ho sv moi: ");
gets(sv.ho);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
0

printf("Ten sv moi: ");
gets(sv.ten);
p->sv = sv;
}
break;
}
case '5':
{
printf("\nVi tri xoa ( 1, 2, ...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri-1);//p chi nut truoc nut can xoa
if (vitri <=0 || p==NULL)
{
printf("Vi tri khong hop le");
getche();
}
else
if(vitri == 1)
Delete_first(First);
else
Delete_after(p);
break;
}
case '6':
{
printf("\nMa so sinh vien can tim: ");
gets(maso);
sv.mssv = atoi(maso);
p = search_info(First, sv.mssv);
if(p == NULL)
printf("Khong co sinh vien co MSSV %d trong danh sach",
sv.mssv);
else
printf("Tim thay o vi tri %d trong danh sach", position(First, p));
getche();
break;
}
case '7':
{
printf("\n Ban co chac khong? (c/k): ");
c = toupper(getche());
if( c == 'C')
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
1

selectionsort(First);
break;
}
case '8':
{
printf("\n Ban nho sap xep danh sach truoc. Nhan phim bat ky ...");
getche();
printf("\nMa so sinh vien: ");
gets(maso);
sv.mssv = atoi(maso);
printf("Ho sinh vien: ");
gets(sv.ho);
printf("Ten sinh vien: ");
gets(sv.ten);
Insert_Order(First, sv);
break;
}
case '9':
{
printf("\n Ban co chac khong (c/k): ");
c = getche();
if(c == 'c' || c == 'C')
clearlist(First);
break;
}
}
} while(chucnang != '0');

// xoa tat ca cac nut tren danh sach lien ket
clearlist(First);
}
IV. DANH SCH LIN KT VNG:
IV.1. Kh|i nim :
Danh s|ch lin kt vng l{ danh s|ch lin kt m{ trng next ca phn t cui s
ch ti phn t u ca danh s|ch.

Hnh 4.8 Danh sch lin kt vng
Qui c: n gin gii thut, ta qui c dng con tr Last qun l danh s|ch
lin kt vng, con tr n{y s ch ti phn t cui trong danh s|ch lin kt vng.
info

next
Last
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
2

Nh vy:
+ Nu danh s|ch lin kt vng rng Last = NULL
+ Nu danh s|ch lin kt vng ch c mt phn t (Last ==Last->next)
- Khai b|o: Ta khai b|o bin Last qun l danh s|ch lin kt vng vi th{nh phn
ni dung l{ s nguyn nh sau:
struct node
{ int info ;
struct node *next ;
};
typedef struct node *NODEPTR;
NODEPTR Last;
IV.2. C|c php to|n trn danh s|ch lin kt vng:
IV.2.1.To danh sch:
a. Khi to danh s|ch (Initialize): dng khi ng mt danh s|ch lin kt, cho
chng trnh hiu l{ hin ti danh s|ch lin kt cha c phn t.
void Initialize(NODEPTR &Last)
{
Last = NULL;
}
b. Cp ph|t vng nh (New_Node): cp ph|t mt nt cho danh s|ch lin kt vng.
H{m New_Node n{y tr v a ch ca nt va cp ph|t.
NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
}
c. Thm v{o u danh s|ch (Ins_first): thm mt nt c ni dung x v{o u danh
s|ch lin kt vng.
void Ins_first(NODEPTR &Last, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
if (Empty(Last))
Last=p;
else
p->next = Last->next;
Last->next = p;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
3

d. Thm v{o cui danh s|ch (Ins_last): thm mt nt c ni dung x v{o cui danh
s|ch lin kt vng.
void Ins_last(NODEPTR &Last, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
if (Empty(Last))
p->next=p;
else
{
p->next = Last->next;
Last->next = p;
}
Last = p;
}
e. Thm nt mi v{o sau nt c a ch p (Ins_after): thm mt nt c ni dung
x v{o sau nt c a ch p trong danh s|ch lin kt vng.
void Ins_after(NODEPTR Last, NODEPTR p, int x)
{
NODEPTR q;
if(p == NULL)
printf("Nut hien tai khong co, nen khong the them");
else
{
if (p==Last)
Ins_last(Last,x);
else
{ q = New_node();
q->info = x;
q->next = p->next;
p->next = q;
}
}
}
IV.2.2. Duyt danh sch:
Thng thng ta hay duyt danh s|ch lin kt thc hin mt cng vic g ,
nh lit k d liu trong danh s|ch hay m s nt trong danh s|ch...
void Traverse(NODEPTR Last)
{
NODEPTR p;
p = Last->next; // p chi toi phan tu dau trong dslk vong
if(Last == NULL)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
4

printf("\n Danh sach rong ");
else
{ printf("\n");
while(p != Last)
{
printf("%8d", p->info);
p = p->next;
}
printf("%8d", p->info);
}
}
IV.2.3. Php loi b:
a. Gii phng vng nh (free): H{m n{y dng hy nt ~ cp ph|t, v{ tr vng
nh v li cho memory heap.
free( p) ; vi p l{ bin con tr
b. Kim tra danh s|ch lin kt rng hay khng (Empty): h{m Empty tr v
TRUE nu danh s|ch lin kt vng rng, v{ ngc li.
int Empty(NODEPTR Last)
{
return(Last == NULL ? TRUE : FALSE);
}
c. Xa phn t u ca danh s|ch (Del_first): mun xa 1 phn t khi danh
s|ch lin kt th ta phi kim tra xem danh s|ch c rng hay khng. Nu danh s|ch c
phn t th mi xa c.
void Del_first(NODEPTR &Last)
{
NODEPTR p;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{
p = Last->next; // nut can xoa la nut dau
if (p==Last) // danh sach chi co 1 nut
Last=NULL;
else
Last->next = p->next;
free(p);
}
}
d. Xa phn t cui ca danh s|ch (Del_last): mun xa 1 phn t khi danh
s|ch lin kt th ta phi kim tra xem danh s|ch c rng hay khng. Nu danh s|ch c
phn t th mi xa c.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
5

void Del_last(NODEPTR &Last)
{
NODEPTR p;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{
p = Last; // nut can xoa la nut cuoi
if (Last->next==Last) // danh sach chi co 1 nut
Last=NULL;
else
{
for (NODEPTR q=Last->next;q->next !=Last; q=q->next);
// q dung ngay truoc Last
q->next = Last->next;
Last=q;
}
free(p);
}
}
e. Xa phn t ng sau nt c a ch p (Del_after): xa nt sau nt p. Php
to|n n{y khng xa c khi danh s|ch ~ rng hoc danh s|ch ch c 1 nt
void Del_after(NODEPTR &Last, NODEPTR p)
{
NODEPTR q;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{ // neu p la NULL hoac danh sach chi co 1 nut
if((p == NULL) || (Last->next == Last))
printf("khong the xoa trong danh sach lien ket vong duoc");
else
{
q=p->next;
if (p->next == Last)
{
p->next=Last->next;
Last=p;
}
else
p->next=q->next;
free(q);
}
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
6

}
f. Xa to{n b danh s|ch (Clearlist): ta c th s dng lnh Last=NULL xa
to{n b danh s|ch, nhng trong b nh, c|c vng nh ~ cp ph|t cho c|c nt khng gii
phng v li cho memory heap, nn s l~ng ph vng nh. Do , ta s dng gii thut
sau:
void clearlist(NODEPTR &Last)
{
while(Last != NULL)
Del_first(Last);
}
IV.2.4. Tm kim (Srch_info) :
Tm nt u tin trong danh s|ch lin kt vng c info bng vi x.
H{m Srch_info nu tm thy x trong danh s|ch th tr v a ch ca nt trong
danh s|ch, nu khng c th tr v tr NULL.
NODEPTR Srch_info(NODEPTR Last, int x)
{
NODEPTR p;
if (Empty(Last))
return (NULL);
else
{
p = Last->next; // p chi toi phan tu dau cua dslk vong
if (p->info==x)
return (p);
else
{ p=p->next;
while(p != Last->next && p->info != x )
p = p->next;
return (p->info==x ? p : NULL);
}
}
}
IV.2.5. Sp xp (Selection_Sort):
Sp xp danh s|ch lin kt vng theo th t info tng dn theo phng ph|p
Selection sort.
- Ni dung: Ta so s|nh tt c c|c phn t ca danh s|ch chn ra mt phn t nh
nht a v u danh s|ch; sau , tip tc chn phn t nh nht trong c|c phn t cn
li a v phn t th hai trong danh s|ch. Qu| trnh n{y lp li cho n khi chn ra
c phn t nh th (n-1).
- Gii thut:
void selectionsort(NODEPTR &Last)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
7

NODEPTR p, q, pmin;
int min;
for(p = Last->next; p->next != Last->next; p = p->next)
{
min = p->info;
pmin = p;
for(q = p->next; q != Last->next; q = q->next)
if(min > q->info)
{
min = q->info;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->info = p->info;
p->info = min;
}
}
V d: Vit chng trnh thc hin c|c cng vic sau trn mt danh s|ch c|c s
nguyn vi cu trc d liu l{ danh s|ch lin kt vng :
1. To danh s|ch s
2. Thm phn t v{o u danh s|ch
3. Thm phn t v{o cui danh s|ch
4. Thm phn t v{o sau phn t c gi| tr x
5. Xa phn t u trong danh s|ch
6. Xa phn t cui trong danh s|ch
7. Lit k danh s|ch
8. Sp xp danh s|ch theo th t tng
9. Xa ton b danh s|ch
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
struct node
{
int info;
struct node *next;
};
typedef struct node *NODEPTR;
NODEPTR Last;
// Phep toan New_node: cap phat mot nut cho danh sach lien ket
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
8

NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return(p);
}
// Phep toan initialize: khoi dong danh sach lien ket
void Initialize(NODEPTR &Last)
{
Last = NULL;
}
// Tac vu Empty: kiem tra danh sach lien ket co bi rong khong
int Empty(NODEPTR Last)
{
return(Last == NULL ? TRUE : FALSE);
}
// Phep toan Ins_first: them nut moi vao dau danh sach lien ket vong
void Ins_first(NODEPTR &Last, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
if (Empty(Last))
Last=p;
else
p->next = Last->next;
Last->next = p;
}
// Phep toan Ins_last: them nut moi vao cuoi danh sach lien ket vong
void Ins_last(NODEPTR &Last, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
if (Empty(Last))
p->next=p;
else
{
p->next = Last->next;
Last->next = p;
}
Last = p;
}
// Phep toan Ins_after: them nut moi sau nut co dia chi p
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
7
9

void Ins_after(NODEPTR Last, NODEPTR p, int x)
{
NODEPTR q;
if(p == NULL)
printf("Nut hien tai khong co, nen khong the them");
else
{
if (p==Last)
Ins_last(Last,x);
else
{ q = New_node();
q->info = x;
q->next = p->next;
p->next = q;
}
}
}
// Phep toan Del_first: xoa nut o dau danh sach lien ket
void Del_first(NODEPTR &Last)
{
NODEPTR p;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{
p = Last->next; // nut can xoa la nut dau
if (p==Last) // danh sach chi co 1 nut
Last=NULL;
else
Last->next = p->next;
free(p);
}
}
// Phep toan Del_last: xoa nut o cuoi danh sach lien ket
void Del_last(NODEPTR &Last)
{
NODEPTR p;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{
p = Last; // nut can xoa la nut cuoi
if (Last->next==Last) // danh sach chi co 1 nut
Last=NULL;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
0

else
{
for (NODEPTR q=Last->next;q->next !=Last; q=q->next);
// q dung ngay truoc Last
q->next = Last->next;
Last=q;
}
free(p);
}
}
// Tac vu Del_after: xoa nut sau nut p. Phep toan nay khong xoa duoc
// khi da rong hoac ds chi co 1 nut
void Del_after(NODEPTR &Last, NODEPTR p)
{
NODEPTR q;
if(Empty(Last))
printf("Khong co nut trong danh sach lien ket vong, nen khong the xoa");
else
{ // neu p la NULL hoac danh sach chi co 1 nut
if((p == NULL) || (Last->next == Last))
printf("khong the xoa trong danh sach lien ket vong duoc");
else
{
q=p->next;
if (p->next == Last)
{
p->next=Last->next;
Last=p;
}
else
p->next=q->next;
free(q);
}
}
}
// Phep toan clearlist: xoa tat ca cac nut trong danh sach lien ket vong
void clearlist(NODEPTR &Last)
{
while(Last != NULL)
Del_first(Last);
}
// Phep toan traverse: duyet danh sach lien ket vong
void traverse (NODEPTR Last)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
1

NODEPTR p;
p = Last->next; // p chi toi phan tu dau trong dslk vong
if(Last == NULL)
printf("\n Danh sach rong ");
else
{ printf("\n");
while(p != Last)
{
printf("%8d", p->info);
p = p->next;
}
printf("%8d", p->info);
}
}
/* Php ton Srch_info: tim kiem theo phuong phap tim kiem tuyen tinh, neu
khong tim thay ham nay tra ve NULL, neu tim thay ham nay tra ve con tro chi
nut tim thay */
NODEPTR Srch_info(NODEPTR Last, int x)
{
NODEPTR p;
if (Empty(Last))
return (NULL);
else
{
p = Last->next; // p chi toi phan tu dau cua dslk vong
if (p->info==x)
return (p);
else
{ p=p->next;
while(p != Last->next && p->info != x )
p = p->next;
return (p->info==x ? p : NULL);
}
}
}
// Tac vu selectionsort: sap xep danh sach lien ket vong theo info tang dan
void selectionsort(NODEPTR &Last)
{
NODEPTR p, q, pmin;
int min;
for(p = Last->next; p->next != Last->next; p = p->next)
{
min = p->info;
pmin = p;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
2

for(q = p->next; q != Last->next; q = q->next)
if(min > q->info)
{
min = q->info;
pmin = q;
}
// hoan doi truong info cua hai nut p va pmin
pmin->info = p->info;
p->info = min;
}
}
void Create_list(NODEPTR &Last)
{
int nd;
clearlist(Last);
printf("Nhap so (ket thuc bang 0: ");
scanf("%d", &nd);
while (nd !=0)
{
Ins_last(Last, nd);
printf("Nhap so ke : ");
scanf("%d", &nd);
}
}
char menu ()
{ char chucnang;
do
{ clrscr();
printf("\n\n\t\tCHUONG TRINH QUAN LY DANH SACH LIEN KET VONG");
printf("\n\nCac chuc nang cua chuong trinh:\n");
printf(" 1: Tao danh sach \n");
printf(" 2: Them phan tu vao dau danh sach\n");
printf(" 3: Them phan tu vao cuoi danh sach\n");
printf(" 4: Them phan tu vao sau phan tu co gia tri x\n");
printf(" 5: Xoa phan tu dau trong danh sach \n");
printf(" 6: Xoa phan tu cuoi trong danh sach \n");
printf(" 7: Liet ke danh sach \n");
printf(" 8: Sap xep danh sach theo thu tu tang\n");
printf(" 9: Xoa toan bo danh sach\n");
printf(" 0: Ket thuc chuong trinh\n");
printf("Chuc nang ban chon: ");
chucnang = getche();
} while(chucnang < '0' || chucnang >'9') ;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
3

printf("\n");
return chucnang;
}
// chuong trinh chinh
void main()
{
int x, info;
char chucnang, c;
NODEPTR p;
// khoi dong danh sach lien ket
Initialize(Last);
do
{
chucnang = menu();
switch(chucnang)
{
case '1':
{
Create_list(Last);
break;
}
case '2':
{
printf("\nNoi dung muon them: ");
scanf("%d",&x);
Ins_first(Last,x);
break;
}
case '3':
{
printf("\nNoi dung muon them: ");
scanf("%d",&x);
Ins_last(Last,x);
break;
}
case '4':
{
printf("\nNoi dung phan tu muon them: ");
scanf("%d",&x);
printf("\nBan muon them no vao sau phan tu co info = ");
scanf("%d",&info);
p=Srch_info(Last,info);
if (p==NULL)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
4

printf("Khong co phan tu voi x=%d", info);
getch();
}
else
if (p==Last)
Ins_last(Last,x);
else
Ins_after(Last,p,x);
break;
}
case '5':
Del_first(Last);
break;
case '6':
Del_last(Last);
break;
case '7':
{
Traverse(Last);
getche();
break;
}
case '8':
{
printf("\n Ban co chac khong? (c/k): ");
c = toupper(getche());
if( c == 'C')
selectionsort(Last);
break;
}
case '9':
{
printf("\n Ban co chac khong (c/k): ");
c = getche();
if(c == 'c' || c == 'C')
clearlist(Last);
break;
}
}
} while(chucnang != '0');
// xoa tat ca cac nut tren danh sach lien ket
clearlist(Last);
}
V. DANH SCH LIN KT KP (Doubly Linked List) :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
5

V.1. Kh|i nim :
Danh s|ch lin kt kp l{ mt danh s|ch lin kt m{ mi phn t ca n c 2 vng
lin kt, lin kt thun dng ch n phn t ng ngay sau n (right), lin kt nghch
dng ch n phn t ng ngay trc n (left).
NULL
First

NULL

Hnh 4.9 Danh sch lin kt kp
Lu :
- Nt cui ca danh s|ch lin kt kp c trng right l{ NULL, v{ nt u ca danh
s|ch lin kt kp c trng left l{ NULL.
- Chng ta c th duyt danh s|ch lin kt kp theo hai chiu duyt xui v{ duyt
ngc.
* Khai bo: Ta khai b|o bin First qun l danh s|ch lin kt kp vi th{nh phn ni
dung l{ s nguyn nh sau:
struct node
{ int info ;
struct node *left, *right ;
};
typedef struct node *NODEPTR;
NODEPTR First. Last;
* Khi to :
First = NULL ;
- Bin First : con tr ch n phn t u danh s|ch lin kt kp
V.2. C|c php to|n trn danh s|ch lin kt kp:
V.2.1.To danh sch:
a. Khi to danh s|ch (Initialize): dng khi ng mt danh s|ch lin kt,
cho chng trnh hiu l{ hin ti danh s|ch lin kt cha c phn t.
void Initialize(NODEPTR &First)
{
First = NULL;
}
b. Cp ph|t vng nh (New_Node): cp ph|t mt nt cho danh s|ch lin kt kp.
H{m New_Node n{y tr v a ch ca nt va cp ph|t.
NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return (p);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
6

}
c. Thm v{o u danh s|ch (Insert_first): thm mt nt c ni dung x v{o u
danh s|ch lin kt kp.
void Insert_first(NODEPTR &First, int x)
{
NODEPTR p;
p = New_node();
p->info = x;
if(First == NULL) // truong hop danh sach rong
p->right = NULL;
else
{
// tao lien ket giua p va First
p->right = First;
First->left = p;
}
First = p;
p->left = NULL;
}
d. Thm nt mi v{o sau nt c a ch p (Insert_right): thm mt nt c ni
dung x v{o sau nt c a ch p trong danh s|ch lin kt kp. Php to|n n{y cng c
dng thm mt nt v{o cui danh s|ch.
void Insert_right(NODEPTR p, int x)
{
NODEPTR q, r; // q la nut can them vao, p la nut truoc, r la nut sau
if(p == NULL)
printf("Nut p khong hien huu, khong them nut duoc\n");
else
{
q = New_node();
q->info = x;
r = p->right;
// tao hai lien ket giua r va q
r->left = q;
q->right = r;
// tao hai lien ket giua p va q
q->left = p;
p->right = q;
}
}
e. Thm nt mi v{o trc nt c a ch p (Insert_left): thm mt nt c ni
dung x v{o trc nt c a ch p trong danh s|ch lin kt kp.
void Insert_left(NODEPTR &First, NODEPTR p, int x)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
7

{
NODEPTR q, r; // q la nut can them vao, p la nut sau, r la nut truoc
if(p == NULL)
printf("Nut p khong hien huu, khong them nut duoc\n");
else
{
if(p == First) // them nut vao dau danh sach
Insert_first(First, x);
else
{
q = New_node();
q->info = x;
r = p->left;
// tao hai lien ket giua r va q
r->right = q;
q->left = r;
// tao hai lien ket giua p va q
q->right = p;
p->left = q;
}
}
}
V.2.2. Duyt danh sch:
Thng thng ta hay duyt danh s|ch lin kt thc hin mt cng vic g , nh
lit k d liu trong danh s|ch hay m s nt trong danh s|ch...
a. Duyt xui: Duyt danh s|ch lin kt kp t nt u cho ti nt cui danh s|ch.
void Right_traverse(NODEPTR First)
{
NODEPTR p;
if(empty(First))
printf("\n (khong co doan nao)");
else
{
p = First; // p chi nut dau
while(p != NULL)
{
printf("\n%8d, p->info);
p = p->right;
}
}
}
b. Duyt ngc: Duyt danh s|ch lin kt kp t nt cui cho ti nt u danh
sch.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
8

void Left_traverse(NODEPTR First)
{
NODEPTR p;
if(empty(First))
printf("\n (khong co doan nao)");
else
{
for (p=First; p->right!=NULL; p=p->right); // p chi toi nut cuoi
while(p != NULL)
{
printf("\n%8d, p->info
p = p->left;
}
}
}
V.2.3. Php loi b:
a. Gii phng vng nh(free): H{m n{y dng hy nt ~ cp ph|t, v{ tr vng
nh v li cho memory heap.
free( p) ; vi p l{ bin con tr
b. Kim tra danh s|ch lin kt rng hay khng (Empty): h{m Empty tr v
TRUE nu danh s|ch lin kt vng rng, v{ ngc li.
int Empty(NODEPTR First)
{
return(First == NULL ? TRUE : FALSE);
}
c. Xa phn t u ca danh s|ch (Delete_first): mun xa 1 phn t khi danh
s|ch lin kt th ta phi kim tra xem danh s|ch c rng hay khng; nu danh s|ch c
phn t th mi xa c.
void Delete_first(NODEPTR &First)
{
NODEPTR p;
if(empty(First)) // truong hop danh sach rong
printf("Danh sach rong, khong xoa nut duoc");
else
{
p = First; // p la nut can xoa
if(First->right == NULL) // truong hop danh sach co mot nut
First = NULL;
else
{
First = p->right;
First->left = NULL;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
8
9

free(p);
}
}
d. Xa phn t c a ch p (Delete_node):
void Delete_node(NODEPTR &First, NODEPTR p)
{
NODEPTR q, r;
if(p == NULL)
printf("Nut p khong hien huu, khong xoa nut duoc\n");
else
{
if(First == NULL) // truong hop danh sach rong
printf("Danh sach rong, khong xoa nut duoc");
else
{
if(p == First) // truong hop xoa nut dau
Delete_first(First);
else
{
q = p->left; // q la nut truoc
r = p->right; // r la nut sau
// tao hai lien ket giua q va r
r->left = q;
q->right = r;
free(p);
}
}
}
}
e. Xa to{n b danh s|ch (Clearlist):
void clearlist(NODEPTR &First)
{
while(First != NULL)
Delete_first(Last);
}
V.2.4. Tm kim (Search_info):
Tm nt u tin trong danh s|ch lin kt kp c info bng vi x.
H{m Search_info nu tm thy x trong danh s|ch th tr v a ch ca nt trong
danh s|ch, nu khng c th tr v tr NULL.
NODEPTR Search_info(NODEPTR First, int x)
{
NODEPTR p;
p = First;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
0

while(p->info != x && p != NULL)
p = p->right;
return(p);
}
V d:
Vit chng trnh qun l v{ iu h{nh tuyn xe la TP HCM - HA NOI bng danh
s|ch lin kt kp; mi nt ca danh s|ch l{ mt on ng c ga trc, ga sau, chiu d{i
v{ thi gian xe la chy trn on ng .
Chng trnh c c|c chc nng sau:
1. Thm mt on ng
2. Xa mt on ng
3. Xem to{n tuyn ng theo lin kt xui
4. Xem to{n tuyn ng theo lin kt ngc
5. Xem thng tin ca on ng th i
6. Hiu chnh thng tin ca on ng th i
7. B|o l trnh: nhp ni i v{ ni n, chng trnh s cho bit c|c ga trung gian
phi i qua, tng chiu d{i v{ tng thi gian ca l trnh.
- Chng trnh:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <alloc.h>
#include <dos.h>
#include <ctype.h>
#define TRUE 1
#define FALSE 0
// Khai bao cau truc cua mot doan duong tren tuyen duong
typedef struct doan
{
char gatruoc[12];
char gasau[12];
int chieudai; // km
int thoigian; // thoi gian xe lua chay tren doan, tinh theo phut
};
// Khai bao cau truc cua mot nut
struct node
{
doan info;
struct node *left, *right;
};
typedef struct node *NODEPTR;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
1

// Tac vu New_node: cap phat mot nut cho danh sach lien ket kep
NODEPTR New_node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct node));
return(p);
}
// Tac vu initialize: khoi dong danh sach lien ket kep
void Initialize(NODEPTR &First)
{
First = NULL;
}
// Tac vu empty: kiem tra danh sach lien ket kep co bi rong khong
int empty(NODEPTR First)
{
return((First == NULL) ? TRUE : FALSE);
}
// Tac vu Insert_first: them nut vao dau danh sach lien ket
void Insert_first(NODEPTR &First, doan x)
{
NODEPTR p;
p = New_node();
p->info = x;
if(First == NULL) // truong hop danh sach rong
p->right = NULL;
else
{
// tao lien ket giua p va First
p->right = First;
First->left = p;
}
First = p;
p->left = NULL;
}
/ Tac vu Insert_right: them nut moi sau nut p
void Insert_right(NODEPTR p, doan x)
{
NODEPTR q, r; // q la nut can them vao, p la nut truoc, r la nut sau
if(p == NULL)
printf("Nut p khong hien huu, khong them nut duoc\n");
else
{
q = New_node();
q->info = x;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
2

r = p->right;
// tao hai lien ket giua r va q
r->left = q;
q->right = r;
// tao hai lien ket giua p va q
q->left = p;
p->right = q;
}
}
// Tac vu Insert_left: them nut moi truoc nut p
void Insert_left(NODEPTR &First, NODEPTR p, doan x)
{
NODEPTR q, r; // q la nut can them vao, p la nut sau, r la nut truoc
if(p == NULL)
printf("Nut p khong hien huu, khong them nut duoc\n");
else
{
if(p == First) // them nut vao dau danh sach
Insert_first(First, x);
else
{
q = New_node();
q->info = x;
r = p->left;
// tao hai lien ket giua r va q
r->right = q;
q->left = r;
// tao hai lien ket giua p va q
q->right = p;
p->left = q;
}
}
}
// Tac vu Delete_first: xoa nut o dau danh sach lien ket
void Delete_first(NODEPTR &First)
{
NODEPTR p;
if(empty(First)) // truong hop danh sach rong
printf("Danh sach rong, khong xoa nut duoc");
else
{
p = First; // p la nut can xoa
if(First->right == NULL) // truong hop danh sach co mot nut
First = NULL;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
3

else
{
First = p->right;
First->left = NULL;
}
free(p);
}
}
// Tac vu Delete_node: xoa nut co con tro la p
void Delete_node(NODEPTR &First, NODEPTR p)
{
NODEPTR q, r;
if(p == NULL)
printf("Nut p khong hien huu, khong xoa nut duoc\n");
else
{
if(First == NULL) // truong hop danh sach rong
printf("Danh sach rong, khong xoa nut duoc");
else
{
if(p == First) // truong hop xoa nut dau
Delete_first(First);
else
{
q = p->left; // q la nut truoc
r = p->right; // r la nut sau
// tao hai lien ket giua q va r
r->left = q;
q->right = r;
free(p);
}
}
}
}
// Tac vu Right_traverse: duyet danh sach tu trai sang phai (duyet xuoi)
void Right_traverse(NODEPTR First)
{
NODEPTR p;
int stt;
if(empty(First))
printf("\n (khong co doan nao)");
else
{
p = First; // p chi nut dau
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
4

stt = 1;
while(p != NULL)
{
printf("\n%5d%12s%12s%7d%7d", stt++, p->info.gatruoc,
p->info.gasau, p->info.chieudai, p->info.thoigian);
p = p->right;
}
}
}
// Tac vu Left_traverse: duyet danh sach tu phai sang trai (duyet nguoc)
void Left_traverse(NODEPTR First)
{
NODEPTR p;
int stt;
if(empty(First))
printf("\n (khong co doan nao)");
else
{
for (p=First; p->right!=NULL; p=p->right); // p chi toi nut cuoi
stt = 1;
while(p != NULL)
{
printf("\n%5d%12s%12s%7d%7d", stt++, p->info.gasau,
p->info.gatruoc, p->info.chieudai, p->info.thoigian);
p = p->left;
}
}
}
// Tac vu Search_info1: tim ga truoc cua mot doan
NODEPTR Search_info1(NODEPTR First, char x[])
{
NODEPTR p;
p = First;
while(strcmp(p->info.gatruoc, x) != 0 && p != NULL)
p = p->right;
return(p);
}
// Tac vu Search_info2: tim ga sau cua mot doan
NODEPTR Search_info2(NODEPTR First, char x[])
{
NODEPTR p;
p = First;
while(strcmp(p->info.gasau, x) != 0 && p != NULL)
p = p->right;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
5

return(p);
}
// Tac vu clearlist: xoa toan bo danh sach lien ket kep
void clearlist(NODEPTR &First)
{
while(First != NULL)
Delete_first(First);
}
int position(NODEPTR First, NODEPTR p)
{
int vitri;
NODEPTR q;
q = First;
vitri = 0;
while(q != NULL && q != p)
{
q = q->right;
vitri++;
}
if(q == NULL)
return(-1);
return(vitri);
}
void baolotrinh(NODEPTR &First, char noidi[], char noiden[], char c)
{
NODEPTR p1, p2;
int kc, tg;
if(c == 'X')
{
p1 = Search_info1(First, noidi);
if(p1 == NULL)
{
printf("Khong co noi di");
return;
}
if(strcmp(noidi, noiden) == 0)
{
printf("Noi di trung noi den");
return;
}
p2 = Search_info2(First, noiden);
if(p2 == NULL)
{
printf("Khong co noi den");
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
6

return;
}
if(position(First, p1) <= position(First, p2))
{
kc = tg = 0;
while(p1 != p2)
{
kc = kc + p1->info.chieudai;
tg = tg + p1->info.thoigian;
printf("\n%s -> %s : %d km %d phut", p1->info.gatruoc,
p1->info.gasau, p1->info.chieudai, p1->info.thoigian);
p1 = p1->right;
}
kc = kc + p1->info.chieudai;
tg = tg + p1->info.thoigian;
printf("\n%s -> %s : %d km %d phut", p1->info.gatruoc,
p1->info.gasau, p1->info.chieudai, p1->info.thoigian);
printf("\nTong chieu dai lo trinh: %d km. Tong thoi gian van chuyen %d
phut", kc, tg);
}
else
printf("Khong di xuoi duoc");
return;
}

if(c == 'N')
{
p1 = Search_info2(First, noidi);
if(p1 == NULL)
{
printf("Khong co noi di");
return;
}
if(strcmp(noidi, noiden) == 0)
{
printf("Noi di trung noi den");
return;
}
p2 = Search_info1(First, noiden);
if(p2 == NULL)
{
printf("Khong co noi den");
return;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
7

if(position(First, p1) >= position(First, p2))
{
kc = tg = 0;
while(p1 != p2)
{
kc = kc + p1->info.chieudai;
tg = tg + p1->info.thoigian;
printf("\n%s -> %s : %d km %d phut", p1->info.gasau,
p1->info.gatruoc, p1->info.chieudai, p1->info.thoigian);
p1 = p1->left;
}
kc = kc + p1->info.chieudai;
tg = tg + p1->info.thoigian;
printf("\n%s -> %s : %d km %d phut", p1->info.gasau,
p1->info.gatruoc, p1->info.chieudai, p1->info.thoigian);
printf("\nTong chieu dai lo trinh: %d km. Tong thoi gian van
chuyen %d phut", kc, tg);
}
else
printf("Khong di nguoc duoc");
return;
}
}
/* Tac vu nodepointer: xac dinh con tro chi nut thu i (i=0,1,2,...) trong
danh sach lien ket kep */
NODEPTR nodepointer(NODEPTR First, int i)
{
NODEPTR p;
int vitri;
p = First; // p chi nut dau dslk vong
vitri = 1;
while(p != NULL && vitri < i)
{
p = p->right;
vitri++;
}
return(p);
}
char menu ()
{ char chucnang;
do
{ clrscr();
// menu chinh cua chuong trinh
printf("\n\nCHUONG TRINH QUAN LY VA DIEU HANH
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
8

TUYEN XE LUA TPHCM - HANOI\n");
printf(" 1: Them mot doan\n");
printf(" 2: Xoa mot doan\n");
printf(" 3: Xem lo trinh 1 (duyet xuoi)\n");
printf(" 4: Xem lo trinh 2 (duyet nguoc)\n");
printf(" 5: Xem thong tin cua doan thu i\n");
printf(" 6: Hieu chinh thong tin ve doan thu i\n");
printf(" 7: Bao lo trinh\n");
printf(" 0: Ket thuc chuong trinh\n");
printf("Chuc nang ban chon: ");
chucnang = getche();
} while(chucnang < '0' || chucnang >'7') ;
return chucnang;
}
// chuong trinh chinh
void main()
{
NODEPTR First, p, p1;
doan ga;
int vitri;
char c, chucnang;
char noidi[12], noiden[12];
char c_vitri[3], c_chieudai[10], c_thoigian[10];
clrscr();
// khoi dong danh sach lien ket kep
Initialize(First);
do
{
chucnang=menu();
switch(chucnang)
{
case '1':
{
printf("\nVi tri them (1, 2, ...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri-1);//p chi nut truoc nut can them
if (vitri <=0 || (p==NULL && First !=NULL))
{
printf("Vi tri khong hop le");
getche();
}
else
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
9
9

printf("Ten ga truoc: ");
gets(ga.gatruoc);
printf("Ten ga sau: ");
gets(ga.gasau);
printf("Chieu dai (km): ");
gets(c_chieudai);
ga.chieudai = atoi(c_chieudai);
printf("Thoi gian (phut): ");
gets(c_thoigian);
ga.thoigian = atoi(c_thoigian);
if(vitri == 1 || First ==NULL)
Insert_first(First, ga);
else
Insert_right(p, ga);
}
break;
}
case '2':
{
printf("\nVi tri muon xoa(1,2,...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri);
if(p == NULL)
printf("Vi tri khong hop le");
else
{
if(vitri == 1)
Delete_first(First);
else
Delete_node(First, p);
printf("Da xoa xong ");
}
delay(2000);
break;
}
case '3':
{
printf("\nXem lo trinh 1 (duyet xuoi): ");
printf("\n STT TU DEN CD TG");
Right_traverse(First);
getche();
break;
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
0

case '4':
{
printf("\nXem lo trinh 2 (duyet nguoc): ");
printf("\n STT TU DEN CD TG");
Left_traverse(First);
getche();
break;
}
case '5':
{
printf("\nVi tri doan muon xem thong tin(1,2,...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri);
if(p == NULL)
printf("Vi tri khong hop le");
else
printf("\nDoan:%d Tu:%s Den:%s Chieu dai:%d km
Thoi gian:%d phut", vitri, p->info.gatruoc,
p->info.gasau, p->info.chieudai, p->info.thoigian);
getche();
break;
}
case '6':
{
printf("\nVi tri doan muon hieu chinh(1,2,...): ");
gets(c_vitri);
vitri = atoi(c_vitri);
p = nodepointer(First, vitri);
if(p == NULL)
printf("Vi tri khong hop le");
else
{
printf("\nDoan:%d Tu:%s Den:%s Chieu dai:%d km
Thoi gian:%d phut\n", vitri, p->info.gatruoc,
p->info.gasau, p->info.chieudai, p->info.thoigian);
printf("Ten ga truoc: ");
gets(ga.gatruoc);
printf("Ten ga sau: ");
gets(ga.gasau);
printf("Chieu dai (km): ");
gets(c_chieudai);
ga.chieudai = atoi(c_chieudai);
printf("Thoi gian (phut): ");
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
1

gets(c_thoigian);
ga.thoigian = atoi(c_thoigian);
p->info = ga;
}
break;
}
case '7':
{
printf("\nBan di xuoi hay nguoc (x/n): ");
c = toupper(getch());
printf("\nCho biet noi di: ");
gets(noidi);
printf("\nCho biet noi den: ");
gets(noiden);
baolotrinh(First, noidi, noiden, c);
getch();
break;
}
}
} while(chucnang != '0');
// Xoa toan bo cac nut tren danh sach lien ket kep
clearlist(First);
}
VI. STACK & QUEUE TRN DANH SCH LIN KT:
VI.1 Stack:
VI.1.1. Khi nim:
Nh ta ~ bit, Stack l{ mt danh s|ch m{ vic thm v{o v{ loi b mt phn t ch
din ra cng mt u ca danh s|ch, tc l{ theo c ch LIFO (Last In First Out). Trong
chng 3, ta ~ kho s|t Stack vi cu trc d liu l{ danh s|ch tuyn tnh, vic thm v{o
v loi b din ra cui danh s|ch. Vi danh s|ch tuyn tnh l{m Stack th Stack c im
hn ch v s lng phn t phi khai b|o trc. khc phc nhc im n{y, ta s
x}y dng Stack vi cu trc d liu l{ danh s|ch lin kt n. Vic thm v{o v{ loi b s
din ra u danh s|ch.
- Khai bo: Ta khai b|o bin sp (Stack Pointer) l{ con tr ch n mt danh s|ch l{
Stack, mi phn t trong Stack l{ 1 s nguyn nh sau:
struct node
{ int info ;
struct node *next ;
};
typedef struct node *Stack;
Stack sp;
- Khi to Stack : sp = NULL;
Lu :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
2

- Vi Stack l{ danh s|ch lin kt, ta ch thc hin c|c php to|n u danh s|ch
lin kt.
- Khng c trng hp Stack y ; Stack rng khi Sp = NULL ;
VI.1.2. Cc php ton trn Stack:
i vi Stack, c hai php to|n ch yu l{ thm v{o (Push) v{ loi b (Pop)
a. Php thm vo (push) : Thm mt phn t c gi| tr x v{o u Stack.
void push(Stack &sp, int x)
{
Stack p;
p = (Stack)malloc(sizeof(struct node));
p->info = x;
p->next = sp;
sp = p;
}
b. Php loi b (pop): Xa phn t khi Stack v{ tr cho chng trnh gi gi| tr
ca phn t va xa.
int pop(Stack &sp)
{
Stack p;
int x;
if(sp==NULL)
printf("\nStack rong");
else
{
p = sp; // nut can xoa la nut dau
x =sp->info;
sp = p->next;
free(p);
return x;
}
}
VI.2. Queue:
VI.2.1.Khi nim:
Queue l{ mt danh s|ch hn ch m{ vic thm v{o c thc hin u danh s|ch,
v{ vic loi b c thc hin u cn li ca danh s|ch (FIFO - First In First Out).
Queue cha c|c phn t c cng kiu d liu. chng n{y, ta ch t chc queue theo
danh s|ch lin kt.
- V tr loi b phn t c gi l{ Front
- V tr thm v{o c gi l{ Rear
Queue c hai php ton chnh:
- Insert_queue : thm mt phn t v{o h{ng i; Trong trng hp n{y ta khng
cn quan t}m h{ng i b tr{n hay b y.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
3

- Delete_queue: loi b phn t khi Queue v{ tr v gi| tr ca phn t va xa;
trc khi xa, ta phi kim tra Queue c kh|c rng hay khng.
Lu :
- Php to|n Insert_queue thc hin cui h{ng i, cn php to|n Delete_queue
thc hin u h{ng i.
- Khai b|o: Ta khai b|o bin q c kiu cu trc Queue gm 2 th{nh phn front, rear
l{ con tr ch u v{ cui h{ng i. Mi phn t ca h{ng i l{ mt nt cha mt s
nguyn.
struct node
{
int info;
struct node *next;
};
typedef node *Hangdoi;
struct Queue
{
Hangdoi Front, Rear;
};
struct Queue q;
- Khi to h{ng i: q.Front = NULL;
VI.2.2. Cc php ton trn Queue:
a. Php thm vo : Thm v{o cui danh s|ch lin kt nn s thay i gi| tr ca
Rear
void Insert_queue(Queue &q, int x)
{
Hangdoi p;
p = (Hangdoi)malloc(sizeof(struct node));
p->info = x;
if (q.Front==NULL)
q.Front=p;
else q.Rear->next=p;
q.Rear=p;
p->next=NULL;
}
b. Php loi b : Loi b phn t u danh s|ch lin kt, do thay i gi| tr ca
Front
int Delete_queue(Queue &q)
{
Hangdoi p;
int x;
if(q.Front==NULL)
printf("\nHang doi rong");
else
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
4

{
p = q.Front; // nut can xoa la nut dau
x = p->info;
q.Front = p->next;
free(p);
return x;
}
}
V d: Vit chng trnh i s khng }m h decimal ra s h nh ph}n, vi Stack
v{ Queue l{ danh s|ch lin kt n.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
struct node
{
int info;
struct node *next;
};
typedef node *Stack;
Stack sp;
struct node_
{
int info;
struct node_ *next;
};
typedef node_ *Hangdoi;
struct Queue
{
Hangdoi Front, Rear;
};
struct Queue q;
void push(Stack &sp, int x)
{
Stack p;
p = (Stack)malloc(sizeof(struct node));
p->info = x;
p->next = sp;
sp = p;
}
int pop(Stack &sp)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
5

{
Stack p;
int x;
if(sp==NULL)
{
printf("\nStack rong");
getche();
exit(1);
}
else
{
p = sp; // nut can xoa la nut dau
x =sp->info;
sp = p->next;
free(p);
return x;
}
}
void Insert_queue(Queue &q, int x)
{
Hangdoi p;
p = (Hangdoi)malloc(sizeof(struct node));
p->info = x;
if (q.Front==NULL)
q.Front=p;
else q.Rear->next=p;
q.Rear=p;
p->next=NULL;
}
int Delete_queue(Queue &q)
{
Hangdoi p;
int x;
if(q.Front==NULL)
{
printf("\nHang doi rong");
getche();
exit(1);
}
else
{
p = q.Front; // nut can xoa la nut dau
x = p->info;
q.Front = p->next;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
6

free(p);
return x;
}
}
void main()
{
int sodu;
float so;
char c;
clrscr();
do
{
sp =NULL; // khoi dong stack
q.Front =NULL ; // khoi dong hang doi
printf("\n\nNhap vao mot so thuc khong am: ");
scanf("%e", &so);
double positive;
double r, le, nguyen;
le = modf(so,&nguyen);
do
{
sodu = (int) nguyen % 2;
push(sp, sodu); // push so du vao stack
nguyen = int(nguyen / 2);
} while (nguyen != 0);
printf("So da doi la: ");
while(sp!=NULL)
printf("%d", pop(sp)); // pop so du ra khoi stack
// Doi phan le ra so nhi phan
if (le!=0)
{
printf(".");
int i=0;
do
{ r =le*2;
le = modf(r,&positive);
Insert_queue(q, positive);
i++ ;
} while (i <8 && r!=1);
while (q.Front!=NULL)
{
printf("%d", Delete_queue(q));
}
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
7

printf("\n\nBan co muon tiep tuc khong? (c/k): ");
c = getche();
} while(c == 'c' || c == 'C');
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
8

BI TP:
1. Vit chng trnh to mt menu thc hin c|c cng vic sau:
a. Nhp danh s|ch lin kt theo gii thut thm v cui danh s|ch, mi phn t
gm c c|c thng tin sau: mssv (int), v{ hoten (char hoten[30]).
b. Lit k danh s|ch ra m{n hnh
c. Cho bit tng s nt trong danh s|ch lin kt, t tn h{m l{ Reccount
(int Reccount (NODEPTR First))
d. Thm 1 phn t c ni dung info (mssv, hoten) v{o sau phn t c th t th i
trong danh sch.
Ghi ch: - Th t theo qui c bt u l{ 1
- Nu (i = 0) thm v{o u danh s|ch
- Nu i > Reccount(First) th thm v{o cui danh s|ch.
e. In ra h tn ca sinh vin c m~ do ta nhp v{o.
f. Loi b nt c m~ do ta nhp v{o, trc khi xa hi li "Bn tht s mun xa
(Y/N) ? "
g. Sp xp li danh s|ch theo th t m~ s gim dn.
h. Ghi to{n b danh s|ch v{o file tn 'DSSV.DAT'
i. Np danh s|ch t file 'DSSV.DAT' v{o danh s|ch lin kt. Nu trong danh s|ch
lin kt ~ c nt th xa tt c d liu hin c trong danh s|ch lin kt trc
khi a d liu t file v{o.
2. Vit chng trnh to mt danh s|ch lin kt theo gii thut thm v{o u
danh sch, mi nt cha mt s nguyn.
3. Vit h{m tn Delete_Node xa nt c a ch p.
Vit mt h{m loi b tt c c|c nt c ni dung x trong danh s|ch lin kt First.
4. Vit h{m Copy_List trn danh s|ch lin kt to ra mt danh s|ch lin kt
mi ging danh s|ch lin kt c.
5. Ghp mt danh s|ch lin kt c a ch u l{ First2 v{o mt danh s|ch lin kt
c a ch u l{ First1 ngay sau phn t th i trong danh s|ch lin kt First1.
6. Vit h{m lc danh s|ch lin kt tr|nh trng hp c|c nt trong danh sch
lin kt b trng info.
7. o ngc vng lin kt ca mt danh s|ch lin kt sao cho:
- First s ch n phn t cui
- Phn t u c lin kt l{ NULL.
8. Vit h{m Left_Traverse (NODEPTR First) duyt ngc danh s|ch lin kt.
9. Vit gii thut t|ch mt danh s|ch lin kt th{nh hai danh s|ch lin kt, trong
mt danh s|ch lin kt cha c|c phn t c s th t l v{ mt danh s|ch
lin kt cha c|c phn t c s th t chn trong danh s|ch lin kt c.
10. To mt danh s|ch lin kt cha tn hc vin, im trung bnh, hng ca hc
vin (vi iu kin ch nhp tn v{ im trung bnh). Qu| trnh nhp s dng
li khi tn nhp v{o l{ rng.
Xp hng cho c|c hc vin. In ra danh s|ch hc vin th t hng tng dn (Ghi
ch : Cng im trung bnh th cng hng).
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
0
9

11. Nhp hai a thc theo danh s|ch lin kt. In ra tch ca hai a thc n{y.
V d: a thc First1 : 2x
5
+4x
2
-1
a thc First2 : 10x
7
-3x
4
+x
2

Kt qu in ra : 20x
12
+ 34x
9
- 8x
7
- 12x
6
+ 7x
4
- x
2

(Ghi ch : Khng nhp v{ in ra c|c s hng c h s bng 0)
12. Vit gii thut thm phn t c ni dung x v{o danh s|ch lin kt c th t tng
dn sao cho sau khi thm danh s|ch lin kt vn c th t tng.
13. Loi b phn t c ni dung l{ x trong danh s|ch lin kt c th t tng dn.
14. Cho 2 danh s|ch lin kt First1, First2 c th t tng dn theo info. Vit gii
thut Merge trn 2 danh s|ch lin kt n{y li sao cho danh s|ch lin kt sau
khi trn cng c th t tng dn.

LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
0

CHNG V
CY (TREE)
C}y l{ mt cu trc d liu rt thng dng v{ quan trng trong nhiu phm vi kh|c
nhau ca k thut m|y tnh.
V d : T chc c|c quan h h h{ng trong mt gia ph, mc lc ca mt cun s|ch,
x}y dng cu trc v c ph|p trong c|c trnh bin dch.
Trong chng trnh n{y, chng ta kho s|t c|c kh|i nim c bn v c}y, c|c php
to|n trn c}y nh ph}n, cng nh c|c php to|n trn c}y nh ph}n c}n bng ( AVL tree)
v{ ng dng ca hai loi c}y nh ph}n tm kim (BST), c}y nh ph}n c}n bng ( AVL tree).
I. NH NGHA V KHI NIM:
I.1. Mt s kh|i nim c bn:
1. Cy: C}y l{ tp hp c|c phn t gi l{ nt, mt nt (tng t nh mt phn t
ca danh s|ch) c th c kiu bt k. C|c nt c biu din bi 1 k t ch, mt chui,
mt s ghi trong mt vng trn.
Mt s nh ngha theo quy
Mt nt n cng chnh l{ mt c}y.
C|c nt c gi l{ cng mt c}y khi c ng i gia c|c nt n{y.
Mt c}y s bao gm mt nt gc (Root) v{ m c}y con, trong mi c}y con li c
mt nt gc v{ m1 c}y con nh hn v.v.
Mt c}y khng c mt nt n{o c gi l{ c}y rng.
V d 1 :

Hnh 5.1. Cy vi nt gc l A
- A l{ nt gc vi 3 c}y con ln lt c
3 nt gc ring l{ B, C, D
- Nt cha (ancestor)
Nt con (descendent)
A l{ nt cha ca B, C, D
G, H l{ nt con ca C
G, H khng quan h cha con vi A

V d 2 : Vi cng mt mn hc T, ta c th biu din dng c}y nh sau :
A
B C
G H E
J
D
F
K I
1
2
3
4
Nu t goc
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
1


Hnh 5.2 Cy biu din cng mn hc

CHNG I
I.1
I.2
CHNG II
II.1
II.1.1
II.1.2
II.2
II.3
CHNG III
2. Nt cha (Ancestor) : Nt ng trn ca mt nt c gi l{ nt cha
C l{ nt cha ca G, H
Nt con (descendent) : Nt ng sau mt nt kh|c c gi l{ nt con ca nt .
Nt I, J, K l{ nt con ca nt E
3. Bc (degree) :
- Bc ca nt l{ s c}y con ca nt .
C c bc l{ 2, E c bc l{ 3 (Hnh 5.1)
- Bc ca c}y l{ bc ln nht ca c|c nt trong c}y.
C}y trong hnh 5.1 c bc l{ 3.
C}y bc n c gi l{ c}y n ph}n nh c}y nh ph}n, c}y tam ph}n....
4. Nt l v nt trung gian :
- Nt l l nt c bc bng 0 (tc l{ khng c c}y con n{o) :
- Nt trung gian: l{ mt nt c bc kh|c 0 v{ khng phi l{ nt gc.
V d: Trong hnh 5.1, B, G, H, I, J, K, F l nt l
C, D, E l nt trung gian.
5. Mc ca nt (level) : Nt gc c mc l{ 1
Mc ca nt con = mc ca nt cha + 1
V d: trong hnh 5.1,
A c mc l{ 1
B, C, D c mc l{ 2
G, H, E, F c mc l{ 3
I, J, K c mc l{ 4
6. Chiu cao ca c}y (height) : l{ mc ln nht ca c|c nt l| trong c}y.
T
CHNG I CHNG I I CHNG I I I
I .1 I .2 I I .1 I I .3 I I .2
I I .1.1 I I .1.2
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
2

V d: C}y trong hnh 5.1 c chiu cao l{ 4
7. Th t ca c|c nt (order of nodes) : Nu c}y c gi l{ c th t th phi
m bo v tr ca c|c nt con t tr|i qua phi, tc l{ nu thay i v tr ca mt nt con
bt k th ta ~ c mt c}y mi.
V d :

Hnh 5.3: Sau khi i v tr ca 2 nt B, C ta c cy mi.
8. Chiu d{i ng i (Path length) :
- Chiu d{i ng i ca nt x: l{ s c|c cnh i t nt gc n nt x.
V d: Trong hnh 5.1:
Nt gc A c chiu d{i ng i l 1
Nt B, C, D c chiu d{i ng i l{ 2
Tng qu|t: mt nt ti mc i c chiu d{i ng i l{ i
- Chiu d{i ng i ca c}y: l{ tng ca c|c chiu d{i ng i ca tt c c|c
nt trong cy.
V d: Chiu d{i ng i ca c}y trong hnh 5.1 l{ 31.
Chiu d{i ng i trung bnh ca c}y:

n / ) i .
n
(
P
i
i i

=

trong ni l{ s c|c nt mc i v{ n l{ tng s c|c nt trong c}y.
I.2. C|ch biu din c}y:
biu din 1 c}y, ta c nhiu c|ch nh biu din bng th, bng gin , bng
ch s.. Nhng thng thng, ta hay dng dng th biu din 1 c}y nh hnh 5.1
I.3. Biu din th t c|c nt trong c}y :
Mt c}y thng t chc c|c nt theo mt th t nht nh cn c v{o mt ni dung
gi l{ kha ca c|c nt. C th t chc c}y c kha tng dn theo mc t tr|i qua phi
nh v d sau :
B
A
C
C
A
B
Khac vi
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
3



ROOT
123456789
Nh vy khi duyt li c}y theo mc
tng dn v{ t tr|i qua phi ta s li
c c th t c|c nt nh trn.
Hnh 5.4. Cy c th t tng dn theo mc t tri qua phi
II. CY NH PHN (BINARY TREE)
II.1. nh ngha :
1. C}y nh ph}n : L{ c}y c bc bng 2, tc l{ s nt con ti a ca mt nt bt k
trong cy l 2.
C}y nh ph}n c th l{ mt c}y rng (khng c nt n{o) hoc c}y ch c mt nt,
hoc c}y ch c c|c nt con bn tr|i (Left Child) hoc nt con bn phi (Right Child) hoc
c hai.
V d: Hnh 5.4 l cy nh ph}n.
2. C|c c}y nh ph}n c bit:
- C}y nh ph}n ng: Mt c}y nh ph}n c gi l{ c}y nh ph}n ng nu nt gc
v{ tt c c|c nt trung gian u c 2 nt con.

Hnh 5.5. Cy nh phn ng
Ghi ch: nu c}y nh ph}n ng c n nt l| th c}y n{y s c tt c 2n-1 nt.
- C}y nh ph}n y: Mt c}y nh ph}n gi l{ c}y nh ph}n y vi chiu cao d th:
N phi l{ c}y nh ph}n ng v{
Tt c c|c nt l| u c mc l{ d.
Hnh 5.5 khng phi l{ c}y nh ph}n y.
2
1
3
5 4
7 6 9 8
Root
B
A
C
X F
H I
D E
G Y
B
A
C
X F
H I
D E
G Y
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
4


Hnh 5.6. Cy nh phn y.
Ghi ch: Cy nh ph}n y l{ c}y nh ph}n c s nt ti a mi mc.
- C}y nh ph}n tm kim (Binary Search Tree - BST): Mt c}y nh ph}n gi l{ c}y nh
ph}n tm kim nu v{ ch nu i vi mi nt ca c}y th kha ca mt nt bt k phi
ln hn kha ca tt c c|c nt trong c}y con bn tr|i ca n v{ phi nh hn kha ca
tt c c|c nt trong c}y con bn phi ca n.
V d:

Hnh 5.7 Cy nh phn tm kim (BST)
- C}y nh ph}n c}n bng (AVL): Mt c}y nh ph}n c gi l{ c}y nh ph}n c}n bng
nu v{ ch nu i vi mi nt ca c}y th chiu cao ca c}y con bn tr|i v{ chiu cao ca
c}y con bn phi hn km nhau nhiu nht l{ 1. (Theo Adelson - Velski v Landis).

Hnh 5.8. Cy nh phn cn bng
B
A
C
F G
N O
D E
J K L M H I
B
A
C
F G
N O
D E
J K L M H I
7
8
9
3
2
1
11
12 10 5
6 4
B
A
C
E F
I J
D
G H
B
A
C
E F
I J
D
G H
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
5

- C}y nh ph}n c}n bng ho{n to{n: Mt c}y nh ph}n c gi l{ c}y nh ph}n c}n
bng ho{n to{n nu v{ ch nu i vi mi nt ca c}y th s nt ca c}y con bn tr|i v{
s nt ca c}y con bn phi hn km nhau nhiu nht l{ 1.

Hnh 5.9. Cy nh phn cn bng hon ton
3. C|c php duyt c}y (Traverse) : L{ qu| trnh i qua c|c nt ng mt ln. Khi
duyt c}y, ta thng dng c|c c|ch duyt c bn sau :
- Preorder - Tin t (NLR) duyt qua nt gc trc, sau i qua c}y con bn tr|i
li |p dng Preorder cho c}y con bn tr|i. Cui cng qua c}y con bn phi, |p dng
Preorder cho c}y con bn phi.
V d: Theo c}y nh ph}n 5.4, ta c:
ROOT 1 2 3 4 6 7 5 8 9
- Inorder - Trung t (LNR) : qua c}y con bn tr|i duyt trc (theo th t LNR),
sau thm nt gc, cui cng qua c}y con bn phi (theo th t LNR)
V d: Theo c}y nh phn 5.4, ta c:
ROOT 2 1 6 4 7 3 8 5 9
- Postorder - Hu t (LRN) : qua c}y con bn tr|i duyt trc (theo th t LRN),
sau qua c}y con bn phi (theo th t LRN), cui cng thm nt gc.
V d: Theo c}y nh ph}n 5.4, ta c:
ROOT 2 6 7 4 8 9 5 3 1
Ghi ch : i vi c}y ta c th t chc th t theo kha l{ mt ni dung ca nt
hoc ta t thm 1 field gi l{ kha ca nt.
II.2. Cc php to|n trn c}y nh ph}n:
- Khai bo: t chc d liu theo c}y nh ph}n, ta c th dng mt ni dung ca
d liu l{m kha sp xp v{ t chc c}y theo nhiu c|ch kh|c nhau. Nhng thng
thng thun tin cho vic tm kim v{ thc hin c|c php to|n kh|c trn c}y, ngi
ta to thm mt kha ring trong c|c phn t v{ to ra c}y nh ph}n tm kim.
khai b|o bin tree qun l mt c}y nh ph}n, vi ni dung info cha s nguyn,
ta khai b|o nh sau:
struct nodetype
{
int key;
int info;
struct nodetype *left;
B
A
C
E F
I
E D
H H
B
A
C
E F
I
E D
H H
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
6

struct nodetype *right;
};
typedef struct nodetype *NODEPTR;
NODEPTR tree;
II.2.1. To cy :
a. Khi to c}y (Initialize): dng khi to c}y nh ph}n, cho chng trnh hiu
l{ hin ti c}y nh ph}n rng.
void Initialize(NODEPTR &root)
{
root = NULL;
}
Li gi h{m: Initialize(tree);
b. Cp ph|t vng nh (New_Node): cp ph|t mt nt cho c}y nh ph}n. H{m
New_Node n{y tr v a ch ca nt va cp ph|t.
NODEPTR New_Node(void)
{
NODEPTR p;
p = (NODEPTR)malloc(sizeof(struct nodetype));
return(p);
}
Li gi h{m: p= New_Node();
c. To c}y BST (Create_Tree): Trong gii thut to c}y BST, ta c dng h{m
Insert_node.
Hm Insert_node: Dng phng ph|p qui thm nt c kha x, ni dung a v{o
c}y c nt gc root. C}y nh ph}n to c qua gii thut Create_Tree l{ c}y nh ph}n
tm kim (BST).
void Insert_node(NODEPTR &p, int x, int a)
{
if(p == NULL) // nt p hin ti s l{ nt l|
{
p = New_node();
p->key = x;
p->info = a;
p->left = NULL;
p->right = NULL;
}
else
if(x < p->key )
Insert_node(p->left, x, a);
else if(x > p->key )
Insert_node(p->right, x, a);
}
void Create_Tree(NODEPTR &root)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
7

{
int khoa, noidung;
do
{ printf("Nhap khoa :");
cin >> khoa;
if (khoa !=0)
{
printf("Nhap noi dung :");
cin >> noidung;
Insert_node(root,khoa,noidung);
}
} while (khoa!=0); // kha bng 0 th dng nhp
}
Ghi ch : to c}y nh ph}n do bin tree qun l, ta gi:
Create_Tree(&tree);
II.2.2. Cp nht cy :
a. Gii phng vng nh (Free_Node): gii phng vng nh m{ p ang tr n.
free(p);
b. Kim tra c}y nh ph}n rng hay khng (Empty): h{m Empty tr v TRUE nu
c}y nh ph}n rng, v{ ngc li.
int Empty(NODEPTR root)
return(root == NULL ? TRUE : FALSE);
}
Li gi h{m : Empty(tree)
c. Hy b mt nt trong c}y nh ph}n BST (Remove):
Xa nt c kha l{ x trong c}y nh ph}n tm kim sao cho sau khi xa th c}y nh
ph}n vn l{ c}y nh ph}n tm kim. Ta c 3 trng hp :
- Trng hp 1: nt p cn xa l{ nt l|. Vic xa nt p ch n gin l{ hy nt p


- Trng hp 2: Nt p cn xa c 1 c}y con, th ta cho rp ch ti nt p. Sau , ta to
lin kt t nt cha ca p ti nt con ca rp, cui cng hy nt p.
p1
p
p1
p1
p
p1
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
8


Hnh 5.10. Xa nt p trong trng hp nt ny c 1 cy con bn tri.

Hnh 5.11. Xa nt p trong trng hp nt ny c 1 cy con bn phi.
- Trng hp 3: Nt p cn xa c 2 c}y con. Ta cho rp ch ti nt p. Do tnh cht nt
cc tr|i ca c}y con bn phi ca p c kha va ln hn kha ca p, nn loi p th ta
s cho r ch ti nt cc tr|i . Sau , ta sao chp ni dung v{ kha ca nt r v{o nt m{
rp ang ch ti. Ta to lin kt thch hp bt nt rp ra khi c}y nh ph}n v{ cui cng
xa nt rp.

Hnh 5.12. Xa nt p trong trng hp nt ny c 2 cy con.
Hm Remove xa nt c kha l x:
NODEPTR rp;
void remove_case_3 ( NODEPTR &r )
{
if (r->left != NULL)
remove_case_3 (r->left);
//den day r la nut cuc trai cua cay con ben phai co nut goc la rp}
else
10
5
3
15
12
20
2 4
p
xoa nut p
10
3 15
12 20 2
4
rp
2
10
5
3
15
4
20
18 25
rp
p
xoa nut p
10
5
3
20
18 25
2 4
10
5 20
15 30
12 18
28
25 35
p
nut trai nhat cua
cay con ben phai
10
5 25
15 30
12 18 28 35
r
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
1
9

{
rp->key = r->key; //Chep noi dung cua r sang rp ";
rp->info =r->info; // de lat nua free(rp)
rp = r;
r = r->right;
}
}
void remove (int x , NODEPTR &p )
{
if (p == NULL) printf ("Khong tm thay");
else
if (x < p->key) remove (x, p->left);
else if (x > p->key)
remove (x, p->right);
else // p^.key = x
{
rp = p;
if (rp->right == NULL) p = rp->left;
// p l nt l hoac la nut chi co cay con ben trai
else if (rp->left == NULL)
p = rp->right; // p l nut co cay con ben phai
else remove_case_3 (rp->right);
free (rp);
}
}
Li gi h{m: Remove(x, tree); // x l{ kha ca nt mun xa
d. Tm kim (Search): Tm nt c kha bng x trn c}y nh ph}n BST c gc l{
root. Nu tm thy x trong c}y th tr v a ch ca nt c tr bng x trong c}y, nu khng
c th tr v tr NULL.
Do c}y nh ph}n l{ BST nn ta c th tm kim nhanh bng phng ph|p tm kim
nh ph}n.
NODEPTR Search(NODEPTR root, int x)
{
NODEPTR p;
p = root;
while(p != NULL && x!=p->key)
if(x < p->key)
p = p->left;
else
p = p->right;
return(p);
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
0

Li gi h{m: p=Search(tree, x);
II.2.3. Cc php duyt cy: C 3 c|ch duyt c bn l{ NLR, LNR, LRN v{ mt c|ch
c bit l{ duyt c}y theo mc. Xt cy sau :

Hnh 5.13 Cy nh phn minh ha cho phn duyt cy.
a. Duyt c}y theo th t NLR (Preorder):
Gii thut qui:
void Preorder (NODEPTR root)
{ if(root != NULL)
{ printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
Gii thut khng qui: i t gc qua ht nh|nh bn tr|i, mi ln qua mt nt
gi li a ch nt con bn phi ca n trong Stack.
Sau khi duyt n nt l| tn cng bn tr|i, ta ln lt quay v duyt c|c nt bn
phi bng c|ch ly a ch ca nt n{y t Stack. Ti mi nt ly ra, ta li duyt sang
nh|nh tr|i ca n v{ ct a ch nt con bn phi v{o Stack. Qu| trnh n{y s dng li khi
ta ~ duyt ht c|c nt ca c}y nh ph}n.
void Pretrav (NODEPTR root)
{
const STACKSIZE = 50;
NODEPTR Stack[STACKSIZE];
int cont,sp;
NODEPTR p=root;
sp=-1; // Khoi tao Stack rong
cont=1;
while (p!=NULL && cont)
{
cout << p->info << " ";
if (p->right != NULL)
7
8
9
3
2
1
11
12 10 5
6 4
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
1

Stack[++sp]= p->right;
if (p->left != NULL)
p=p->left;
else if (sp==-1)
cont =0;
else
p=Stack[sp--];
}
}
b. Duyt c}y theo th t LNR (Inorder):
Gii thut qui:
void Inorder(NODEPTR root)
{ if(root != NULL)
{ Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
Gii thut khng qui:
(i) i t nt gc qua ht nh|nh bn tr|i, mi ln qua mt nt ta gi li a ch ca
nt trong Stack.
(ii) Ly a ch mt nt trong Stack ra, sau duyt sang nh|nh phi ca nt va
ly trong Stack.
(iii) Quay v (i) cho ti khi Stack rng th dng.
void Intrav(NODEPTR root)
{
const STACKSIZE = 50;
NODEPTR Stack[STACKSIZE];
int cont,sp;
NODEPTR p=root;
sp=-1; // Khoi tao Stack rong
cont=1;
do
{
while (p != NULL)
{
Stack[++sp]= p;
p= p->left;
}
if (sp != -1)
{
p=Stack[sp--];
cout << p->info << " ";
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
2

p=p->right;
cont =1;
}
else cont =0;
} while (cont);
}
c. Duyt c}y theo th t LRN (Posorder):
Gii thut qui:
void Posorder(NODEPTR root)
{ if(root != NULL)
{ Posorder(root->left);
Posorder(root->right);
printf("%d ", root->info);
}
}
Gii thut khng qui: So vi hai c|ch duyt trc, c|ch duyt LRN khng
quy s kh hn v ta phi gi c nt cha v{ nt con bn phi v{o Stack. Nt cha c a
v{o Stack trc, nt con bn phi a v{o sau ly ra trc.
C|ch thc hin :
(1) Nu nt c nt con bn tr|i v{ nt con bn phi, ta ct nt n{y v{ nt con bn
phi ca n v{o Stack v{ i qua nt con bn tr|i.
(2) Tip tc bc trn cho n khi ti nt l| tn cng bn tr|i, duyt nt n{y
(3) Ly nt trong Stack ra, nu nt n{y c nt con ta lp li bc 1; nu khng c
v{ l{ nt phi th duyt nt n{y v{ nt cha ca n (trong Stack)
(4) Lp li c|c bc (1), (2) v{ (3) cho n khi Stack rng.
Stack s gm hai th{nh phn v{ c khi to bng mt phn t c a ch = NULL.
void Postrav(NODEPTR root)
{
const STACKSIZE = 50;
struct phantu
{
NODEPTR diachi;
int kieu; //de danh dau la nut cha hay nut con ben phai
}; // kieu = TRUE -> nut con ben phai
// kieu= FALSE -> nut cha
phantu Stack[STACKSIZE];
int typ, sp;
NODEPTR p=root;
sp=0;
typ=TRUE;
Stack[0].diachi=NULL; // Khoi tao Stack
do
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
3

{
while (p != NULL && typ)
{
Stack[++sp].diachi= p;
Stack[sp].kieu= FALSE;
if (p->right != NULL)
{
Stack[++sp].diachi= p->right;
Stack[sp].kieu= TRUE;
}
p= p->left;
}
if (p != NULL)
cout << p->info << " ";
p=Stack[sp].diachi;
typ=Stack[sp--].kieu;
} while (p!=NULL);
}
d. Duyt c}y theo mc: Ngo{i 3 c|ch duyt c bn trn, ta c th duyt c}y theo
mc t mc thp n mc cao, trong tng mc th duyt t tr|i qua phi.
Duyt c}y theo mc :
Root 8 7 9 3 11 2 5 10 12 1 4 6
thc hin php duyt, ta dng mt h{ng gi a ch c|c nt, vi t chc h{ng
l{ mt danh s|ch lin kt.
struct node
{
NODEPTR diachi ;
struct node *next;
};
typedef node *Node_queue;
struct Queue
{
Node_queue Front, Rear;
} q;
void Insert_queue(Queue &q, NODEPTR x)
{
Node_queue p;
p = (Node_queue)malloc(sizeof(struct node));
p->diachi = x;
if (q.Front==NULL)
q.Front=p;
else q.Rear->next=p;
q.Rear=p;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
4

p->next=NULL;
}
NODEPTR Delete_queue(Queue &q)
{
Node_queue p;
NODEPTR x;
if(q.Front==NULL)
{
printf("\nHang doi rong");
getche();
exit(1);
}
else
{
p = q.Front; // nut can xoa la nut dau
x = p->diachi;
q.Front = p->next;
free(p);
return x;
}
}
Gii thut duyt nh sau:
- a nt gc v{o h{ng
- while (h{ng != rng)
+ Ly 1 nt ra khi h{ng
+ X l nt n{y
+ a c|c nt con ca nt n{y v{o h{ng nu c
Do h{ng c t chc theo kiu FIFO, nn ta s lun lun x l nt gc mc thp
trc, v{ do a c 2 nt con v{o h{ng theo th t nt con bn tr|i trc nn khi ly ra
khi h{ng ta s x l c tt c c|c nt trong cng mt mc theo th t t tr|i qua
phi.
* C{i t:
void leveltrav (NODEPTR root)
{
NODEPTR p;
q.Front=NULL;
q.Rear = NULL;
if (root!=NULL)
Insert_queue(q, root);
while (q.Front !=NULL)
{
p=Delete_queue(q);
cout << p->info << " ";
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
5

if (p->left !=NULL)
Insert_queue(q,p->left);
if (p->right !=NULL)
Insert_queue(q,p->right);
}
}
III. CY NH PHN TM KIM CN BNG (AVL):
Chng ta to c}y nh ph}n tm kim mc ch l{ tm kha cho nhanh, tuy nhin
tng tc tm kim th c}y cn phi c}n i v 2 nh|nh theo tng nt trong c}y. Do vy,
ta s tm c|ch t chc li c}y BST sao cho n c}n bng.
III.1. nh ngha:
- Cy nh ph}n tm kim c}n bng (AVL) l{ c}y nh ph}n tm kim m{ ti tt c c|c
nt ca n chiu cao ca c}y con bn tr|i ca n v{ chiu cao ca c}y con bn phi chnh
lch nhau khng qu| mt.

Hnh 5.14. Cy nh phn tm kim cn bng
Lu : Vi c}y AVL, vic thm v{o hay loi b 1 nt trn c}y c th l{m c}y mt c}n
bng, khi ta phi c}n bng li c}y. Tuy nhin vic c}n bng li trn c}y AVL ch xy ra
phm vi cc b bng c|ch xoay tr|i hoc xoay phi mt v{i nh|nh c}y con nn gim
thiu chi ph c}n bng.
- Ch s c}n bng (balance factor) ca mt nt p trn c}y AVL= lh(p) - rh(p)
Trong : lh (p) l{ chiu cao ca c}y con bn tr|i ca p
rh(p) l{ chiu cao ca c}y con bn phi ca p
Ta c c|c trng hp sau:
bf(p) = 0 nu lh(p) = rh(p) nt p c}n bng
bf(p) = 1 nu lh(p) = rh(p) +1 nt p b lch v tr|i
bf(p) = -1 nu lh(p) = rh(p) -1 nt p b lch v phi
10
20
15
30
6
8
12
25 40 18
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
6


Hnh 5.15. Minh ha cc v tr c th thm nt l vo cy AVL, khi thm nt l vo 1 trong
cc v tr B th cy vn cn bng, khi thm nt l vo 1 trong cc v tr U th cy s mt cn
bng. Cc s trn cy l ch s cn bng ca cc nt trc khi thm nt
III.2. Cc php ton trn cy AVL:
* Khai bo: Ta khai b|o c}y AVL vi mi nt c thm trng bf cho bit ch s c}n
bng ca nt .
struct nodetype
{
int key;
int info;
int bf;
struct nodetype *left, *right;
};
typedef struct nodetype *NODEPTR;
III.2.1. Thm nt:
- Ni dung: Thm 1 nt c kha x, ni dung a v{o c}y nh ph}n tm kim c}n bng sao
cho sau khi thm th c}y nh ph}n vn l{ c}y nh ph}n tm kim c}n bng.
- Gii thut:
Thm nt v{o c}y nh bnh thng, ngha l{ nt va thm s l{ nt l|.
Tnh li ch s c}n bng ca c|c nt c b nh hng
Kim tra xem c}y c b mt c}n bng hay khng? Nu c}y b mt c}n bng th ta
c}n bng li cy.
* Trc ht, ta hy xt xem cc trng hp no khi thm nt lm cy b mt
cn bng.
Xem c}y hnh 5.15, ta nhn thy:
- Nu thm nt v{o 1 trong 6 v tr B trn c}y th c}y vn c}n bng.
- Nu thm nt v{o 1 trong c|c v tr U1U12 trn c}y th c}y s mt c}n bng.
+ Thm c|c nt v{o sau bn tr|i ca nt A (bfA = 1) th c}y s b mt c}n
bng v nt A ang b lch tr|i. l{ c|c v tr U1, U2, U3, U4.
-1
1
0
B
0
B
0
1
-1
0
0
U
4
0
U
3
U
2
0
U
1 B
0
B B
0
B
U
8
0
U
7
U
6
0
U
5
U
10
0
U
9
U
12
0
U
11
A
B C
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
7

+ Thm c|c nt v{o sau bn phi ca nt C (bfC = -1) th c}y s b mt c}n
bng v nt C ang b lch phi. l{ c|c v tr U9, U10, U11, U12.
Tm li: Ta c 2 trng hp khi thm nt x vo cy AVL lm cy mt cn bng, l
thm cc nt vo sau bn tri ca nt c bf = 1, v thm cc nt vo sau bn phi ca nt
c bf = -1.
* Cn bng li cy: Gi ya l{ nt trc gn nht b mt c}n bng khi thm nt x v{o c}y
AVL. Do c 2 trng hp b mt c}n bng khi thm nt x l{ tng t nhau nn ta ch xt
trng hp bfya=1 v{ nt l| thm v{o l{ nt sau bn tr|i ca nt ya.

Hnh 5.16. Nhnh cy con nt gc ya trc khi thm nt.
Nhn xt:
- V nt ya c bfya = 1 nn nt ya chc chn c nt con bn tr|i s vi bfs = 0
- V ya l{ nt gn nht c bf l{ 1 nn nt s v{ c|c nt trc kh|c ca nt x (s thm
vo) c bf l 0.
- cao (T1) = cao(T2) = cao(T3)
Trng hp 1a: Nu thm nt mi x v{o v tr nt sau bn tr|i ca s (thuc nh|nh
T1) ta xoay phi quanh nt ya
- Nt s s l{ nt gc mi ca nh|nh c}y n{y vi bfs = 0
- Nt ya l{ nt con bn phi ca s vi bfya = 0.

Hnh 5.17. Xoay phi quanh nt ya cn bng li cy.
Trng hp 1b: Nu thm nt mi x v{o v tr nt sau bn phi ca s (thuc
nh|nh T2) ta xoay 2 ln (xoay kp): xoay tr|i quanh nt s v{ xoay phi quanh nt ya
- Nt p s l{ nt gc mi ca nh|nh c}y n{y vi bfp = 0
- Nt ya l{ nt con bn phi ca p vi bfya = -1
- Nt s l{ nt con bn tr|i ca p vi bfs = 0
1
0
T3
chieu
cao
n
T1
chieu
cao
n
T2
chieu
cao
n
S
ya
0
T1
chieu
sau
n
0
T2
chieu
sau
n
T3
chieu
sau
n
S
ya
x
2
1
T3
chieu
sau
n
T1
chieu
sau
n
T2
chieu
sau
n
S
ya
x
xoay phai
quanh nut ya
(a) (b)
0
T1
chieu
sau
n
0
T2
chieu
sau
n
T3
chieu
sau
n
S
ya
x
0
T1
chieu
sau
n
0
T2
chieu
sau
n
T3
chieu
sau
n
S
ya
x
2
1
T3
chieu
sau
n
T1
chieu
sau
n
T2
chieu
sau
n
S
ya
x
xoay phai
quanh nut ya
xoay phai
quanh nut ya
(a) (b)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
8





Hnh 5.18. Xoay kp (xoay tri quanh nt s, xoay phi quanh nt ya)
cn bng li cy.
Bng sau }y ph}n bit c|c trng hp c}y b mt c}n bng khi thm nt v{ c|c
php xoay c}y tng ng c}n bng li c}y:
Trng hp Trc khi thm
nt x
Sau khi thm
nt x
C|c php xoay c}y v{ ch s
c}n bng mi
2
-1
T3
chieu
sau
n
T1
chieu
sau
n
S
ya
1
T2-1
chieu
sau
n-1
T2-2
chieu
sau
n-1
x
p
Cy AVL sau khi thm nt x
x
T2-1
chieu
sau
n-1
2
0
T1
chieu
sau
n
S
p
T2-2
chieu
sau
n-1
T3
chieu
sau
n
ya
2
xoay trai
quanh nut S
xoay phai
quanh nut ya
x
T2-1
chieu
sau
n-1
0
0
T1
chieu
sau
n
S
p
-1
T2-2
chieu
sau
n-1
T3
chieu
sau
n
ya
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
2
9

1.a bfya = 1
bfs = 0
bfya = 2
bfs = 1
Xoay phi quanh nt ya
bfs=0, bf ya = 0
1.b bfya = 1
bfs = 0
bfya = 2
bfs = -1
Xoay kp
1. Xoay tri quanh nt s
2. Xoay phi quanh nt ya
bfs=0, bf ya = -1
2.a bfya = -1
bfs = 0
bfya = -2
bfs = -1
Xoay tri quanh nt ya
bfs=0, bf ya = 0
2.b bfya = -1
bfs = 0
bfya = -2
bfs = 1
Xoay kp
1. Xoay phi quanh nt s
2. Xoay tri quanh nt ya
bfs=0, bf ya = 1
- Gii thut:
+ Php xoay tri (Rotate_Left): xoay tr|i c}y nh ph}n tm kim c nt gc l{
root, yu cu root phi c nt con bn phi (gi l{ nt p). Sau khi xoay tr|i th nt p tr
th{nh nt gc, nt gc c tr th{nh nt con bn tr|i ca nt gc mi.
Php xoay tr|i tr v con tr ch nt gc mi.
NODEPTR Rotate_Left(NODEPTR root)
{
NODEPTR p;
if(root == NULL)
printf("Khong the xoay trai vi cay bi rong.");
else
if(root->right == NULL)
printf("Khong the xoay trai vi khong co nut con ben phai.");
else
{
p = root->right;
root->right = p->left;
p->left = root;
}
return p;
}
+ Php xoay phi (Rotate_Right): xoay phi c}y nh ph}n tm kim c nt gc l{
root, yu cu root phi c nt con bn tr|i (gi l{ nt p). Sau khi xoay phi th nt p tr
th{nh nt gc, nt gc c tr th{nh nt con bn phi ca nt gc mi.
Php xoay phi tr v con tr ch nt gc mi.
NODEPTR Rotate_Right(NODEPTR root)
{
NODEPTR p;
if(root == NULL)
printf("Khong the xoay phai vi cay bi rong.");
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
0

else
if(root->left == NULL)
printf("Khong the xoay phai vi khong co nut con ben trai.");
else
{
p = root->left;
root->left = p->right;
p->right = root;
}
return p;
}
+ Thm nt (Insert): thm nt c kha x, ni dung a v{o c}y AVL:
- Thm nt theo gii thut thm nt v{o c}y nh ph}n tm kim .
- C}n bng li c}y bng c|ch xoay n hay xoay kp
void Insert(NODEPTR &pavltree, int x, int a)
{
NODEPTR fp, p, q, // fp l{ nt cha ca p, q l{ con ca p
fya, ya, /* ya l{ nt trc gn nht c th mt c}n bng
fya l{ nt cha ca ya */
s; // s l{ nt con ca ya theo hng mt c}n bng
int imbal; /* imbal = 1 nu b lch v nh|nh tr|i
= -1 nu b lch v nh|nh phi */
// Khi ng c|c gi| tr
fp = NULL; p = pavltree;
fya = NULL; ya = p;
// tim nut fp, ya va fya, nut moi them vao la nut la con cua nut fp
while(p != NULL)
{
if (x == p->info) // bi trung noi dung
return;
if (x < p->info)
q = p->left;
else
q = p->right;
if(q != NULL)
if(q->bf != 0) // truong hop chi so can bang cua q la 1 hay -1
{ fya = p;
ya = q;
}
fp = p;
p = q;
}
// Thm nt mi (nut la) la con cua nut fp
q = New_Node(); // cp ph|t vng nh
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
1

q->key =x; q->info = a; q->bf = 0;
q->left = NULL; q->right = NULL;
if(x < fp->info)
fp->left = q;
else
fp->right = q;
/* Hieu chinh chi so can bang cua tat ca cac nut giua ya va q, neu bi lech
ve phia trai thi chi so can bang cua tat ca cac nut giua ya va q deu la
1, neu bi lech ve phia phai thi chi so can bang cua tat ca cac nut giua
ya va q deu la -1 */
if(x < ya->info)
p = ya->left;
else
p = ya->right;
s = p; // s la con nut ya
while(p != q)
{ if(x < p->info)
{ p->bf = 1;
p = p->left;
}
else
{ p->bf = -1;
p = p->right;
}
}
// xac dinh huong lech
if(x < ya->info)
imbal = 1;
else
imbal = -1;
if(ya->bf == 0)
{ ya->bf = imbal;
return;
}
if(ya->bf != imbal)
{ ya->bf = 0;
return;
}
if(s->bf == imbal) // Truong hop xoay don
{ if(imbal == 1) // xoay phai
p = Rotate_Right(ya);
else // xoay trai
p = Rotate_Left(ya);
ya->bf = 0;
s->bf = 0;
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
2

}
else // Truong hop xoay kep
{ if(imbal == 1) // xoay kep trai-phai
{ ya->left = Rotate_Left(s);
p = Rotate_Right(ya);
}
else // xoay kep phai-trai -
{ ya->right = Rotate_Right(s);
p = Rotate_Left(ya);
}
if(p->bf == 0) // truong hop p la nut moi them vao
{ ya->bf = 0;
s->bf = 0;
}
else
if(p->bf == imbal)
{ ya->bf = -imbal;
s->bf = 0;
}
else
{ ya->bf = 0;
s->bf = imbal;
}
p->bf = 0;
}
if(fya == NULL)
pavltree = p;
else
if(ya == fya->right)
fya->right = p;
else
fya->left = p;
}
* to c}y nh ph}n tm kim c}n bng, ta s dng gii thut sau:
void Create_AVLTree(NODEPTR &root)
{ int khoa, noidung;
char so[10];
NODEPTR p;
do
{ printf("Nhap khoa :"); gets(so) ;
khoa = atoi(so);
if (khoa !=0)
{ printf("Nhap noi dung :");
gets(so) ;
noidung = atoi(so);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
3

if (root==NULL)
{ p = New_Node();
p->key = khoa; p->info = noidung; p->bf = 0 ;
p->left = NULL; p->right = NULL;
root =p;
}
else Insert(root,khoa,noidung);
}
} while (khoa!=0); // kha =0 th dng nhp
}
Ghi ch: to c}y nh ph}n do bin tree qun l, ta gi:
Create_AVLTree(tree);
III.2.2. Cp nht cy:
1. Tm kim (Search): Tm nt c kha bng x trn c}y nh ph}n AVL c gc l{
root. Nu tm thy x trong c}y th tr v a ch ca nt c tr bng x trongc}y, nu khng
c th tr v tr NULL.
Do AVL l{ c}y nh ph}n BST nn ta c th tm kim nhanh bng phng ph|p tm
kim nh ph}n, v{ do tnh cht lc n{y c}y c}n bng nn thi gian tm kim s nhanh hn
rt nhiu.
NODEPTR search(NODEPTR root, int x)
{
NODEPTR p;
p = root;
while(p != NULL && x!=p->key)
if(x < p->key)
p = p->left;
else
p = p->right;
return(p);
}
2. Xa nt : Remove (root, x):
- Ni dung: xa nt c kha x trn c}y AVL vi a ch sao u root sao cho sau khi
xa th c}y vn l{ AVL.
- Gii thut:
Nu root == NULL th Thngb|o ("Khng th xa c nt x trn c}y")
Nu root != NULL th
Nu x< root->info th:
+ Gi qui xa nt x nh|nh bn tr|i ca root :
Remove(root->left, x)
+ Gi balance_left c}n bng li c}y nt gc root nu nh|nh c}y con bn tr|i b
gim cao.
Nu x > root->info th:
+ Gi qui xa nt x nh|nh bn phi ca root :
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
4

Remove(root->right, x)
+ Gi balance_right c}n bng li c}y nt gc root nu nh|nh c}y con bn phi
b gim cao.
Nu x==root->info th:
Xa nt root nh php to|n xa trn c}y nh ph}n BST.
- Chng trnh : t c{i t.
III.2.3. Cc php duyt cy:
Do c}y AVL cng l{ c}y nh ph}n nn ta s |p dng li c|c phng ph|p duyt
Preorder, Inorder v Postorder vo cy AVL.
a. Duyt cy theo th t NLR (Preorder):
void Preorder (NODEPTR root)
{
if (root != NULL)
{
printf("%d ", root->info);
Preorder(root->left);
Preorder (root->right);
}
}
b. Duyt cy theo th t LNR (Inorder):
void Inorder(NODEPTR root)
{
if(root != NULL)
{
Inorder(root->left);
printf("%d ", root->info);
Inorder(root->right);
}
}
c. Duyt cy theo th t LRN (Posorder):
void Posorder(NODEPTR root)
{
if(root != NULL)
{
Posorder(root->left);
Posorder(root->right);
printf("%d ", root->info);
}
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
5

BI TP:
1. Vit chng trnh to mt menu thc hin c|c mc sau:
a. To c}y nh ph}n tm kim vi ni dung l{ s nguyn (khng trng nhau).
b. Lit k c}y nh ph}n ra m{n hnh theo th t NLR
c. m tng s nt, s nt l|, v{ s nt trung gian ca c}y.
d. Tnh cao ca cy.
e. Loi b nt c ni dung l{ x trong c}y nh ph}n BST.
f. Thm nt c ni dung x v{o c}y nh ph}n BST sao cho sau khi thm th c}y
vn l{ BST.
g. V c}y nh ph}n ra m{n hnh.
2. Cho mt c}y nh ph}n tree, h~y vit chng trnh sao chp n th{nh mt c}y
mi tree2, vi kha, ni dung, v{ lin kt ging nh c}y tree.
3. Vit c|c h{m kim tra xem c}y nh ph}n:
a. C phi l{ c}y nh ph}n ng khng.
b. C phi l{ c}y nh ph}n y khng.
4. Vit h{m kim tra nt x v{ y c trn c}y hay khng, nu c c x ln y trn c}y th
x|c nh nt gc ca c}y con nh nht c cha x v{ y.
5. H~y trnh b{y c|ch chuyn mt biu thc s hc sang c}y biu thc. V c}y biu
thc ca biu thc s hc sau:
(10 + 5 ) ^ 2 / (52 * 4 - 3 )
6. Cho mt c}y biu thc, h~y vit h{m Calculate (NODEPTR root) tnh gi| tr
ca c}y biu thc , bit rng c|c to|n t c dng trong biu thc l{:
+ - * / ^ % !
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
6

CHNG VI
SP XP V TM KIM
Trong thc tin cuc sng cng nh trong lnh vc lp trnh vic qun l d liu
thng i hi s tm kim c|c d liu cn thit; thun tin cho vic tm kim, d liu
thng c sp xp theo mt th t n{o .
C rt nhiu phng ph|p sp th t, trong gi|o trnh n{y ch kho s|t mt s
phng ph|p c c im l{ :
- Phng ph|p tt nht trong mt s trng hp c th.
- Mang c nt tiu biu cho tt c c|c phng ph|p kh|c.
- Gii thut d hiu v{ d vit.
C th ph}n c|c phng ph|p sp th t chnh nh sau :
- Sp th t ni (Internal Sorting) : To{n b d liu s c a v{o b nh trong
thc hin vic sp xp. Do to{n b d liu c a v{o b nh trong nn kch thc
d liu cn sp khng ln, tuy nhin u im ca phng ph|p n{y l{ gii thut d hiu
v{ thi gian sp xp nhanh.
- Sp th t ngoi (External Sorting) : D liu nhiu phi cha trong tp tin hoc
da, mi ln sp th t ta ch a mt phn ca d liu v{o b nh thc hin. Do ,
thi gian sp xp chm.
Trong chng n{y ta ch ph}n tch c|c phng ph|p sp th t ni trn danh s|ch
k. Khi sp xp ta phi ch n mt s kh|i nim sau:
- Kha (Key) : L{ d liu ca mi phn t m{ ta cn c v{o n sp th t; kha
n{y c th l{ ch hoc s.
- Thi gian thc hin : C|c gii thut sp xp ni thng c thc hin bng c|ch
so s|nh v{ i ch hai phn t vi nhau. Do thi gian thc hin ca 1 gii thut sp
xp ph thuc v{o hai yu t :
+ S ln i ch c|c phn t (i vi danh s|ch c), hoc s ln thay i con tr
(i vi danh s|ch lin kt). }y l{ yu t chim nhiu thi gian nht. K hiu : M(n)
+ S ln so s|nh kha. K hiu : C(n), vi n l{ s phn t trong danh s|ch.
I. MT S PHNG PHP SP XP N GIN :
I.1. Sp xp theo phng php Bubble_Sort (phng ph|p ni bt)
- Ni dung : Cho d~y A c n phn t. Ta cho i duyt d~y a[0],...,a[n-1]; nu a[i-1] ln
hn a[i] th ta ho|n i (a[i-1],a[i]). Lp li qu| trnh duyt d~y n{y cho n khi khng c
xy ra vic i ch ca hai phn t.
V d: Ta sp th t d~y s sau : 26 33 35 29 19 12 32
Bc 0 1 2 3 4 5 6
26 12 12 12 12 12 12
33 26 19 19 19 19 19
35 33 26 26 26 26 26
29 35 33 29 29 29 29
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
7

19 29 35 33 32 32 32
12 19 29 35 33 33 33
32 32 32 32 35 35 35
Hnh 8.1: Minh ha qu trnh sp xp qua phng php Buble Sort
- Chng trnh:
void Bubble_Sort(int A[100], int n)
{ int i,j,temp;
for (i=1; i<n; i++)
for (j=n-1;j>=i; j--)
if (A[j-1] > A[j])
{ temp = A[j-1];
A[j-1] = A[j];
A[j] = temp;
}
}
Ta nhn thy phng ph|p n{y c th c ci tin d d{ng. Nu ln duyt d~y
no m{ khng c c s i ch gia hai phn t th d~y ~ c th t v{ gii thut kt
thc. Trong trng hp n{y, ta dng mt c hiu flag ghi nhn iu n{y, v{ gii thut
Bubble Sort c ci tin nh sau:
#define FALSE 0
#define TRUE 1
void Bubble_Sort_Ad(int A[], int n)
{ int i,temp;
unsigned char flag=TRUE;
while (flag)
{ flag = FALSE ;
for (i=0; i<n-1; i++)
if (A[i] > A[i+1])
{ temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
flag=TRUE;
}
}
}
* Phn tch: Gi s d~y c n phn t.
- Ph}n tch thi gian thc hin ca gii thut Bubble Sort cha ci tin :
+ S ln so s|nh C(n):
Vng lp u c n-1 ln duyt
Vi mi i, ta li c ln duyt ph thuc v{o i, c th nh sau:
i S ln duyt
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
8

1 n-1
2 n-2
3 n-3
... ....
n-1 1
= C(n) = 1 + 2 + 3 + n-2 + n-1 = (n-1)*n/2
Bc ca C(n) l{ O(n
2
)
+ S ln i ch M(n): ta khng th x|c nh chnh x|c s ln i ch 2 phn t
trong d~y v n ph thuc v{o trt t hin c trong d~y. Tuy nhin, ta bit chc rng s
ln i ch ti a s bng C(n).
Do , M(n) s C(n)
Bc ca M(n) l{ O(n
2
)
Vy thi gian thc hin ca gii thut Bubble Sort cha ci tin c bc O(n
2
).
- Ph}n tch thi gian thc hin ca gii thut Bubble Sort ci tin :
+ S ln so s|nh C(n):
Vng lp while c k ln duyt ( k<= n-1)
C n-i ln so s|nh trong ln duyt th i
= C(n) = (n-1) + (n-2) + .... + (n-k) = (n-k)*(n-k+1)/2
Bc ca C(n) l{ O(n
2
)
+ S ln i ch M(n): Tng t nh trn, chng ta c M(n) s C(n)
Bc ca M(n) l{ O(n
2
)
Vy thi gian thc hin ca gii thut Bubble Sort ci tin cng c bc O(n
2
).
* Nhn xt: Gii thut Bubble Sort d hiu nhng khng ti u v thi gian thc
hin gii thut chm (c bc O(n
2
))
Gii thut Bubble Sort c ci tin khng l{m thay i bc nhng c l{m gim h s
nn ch nhanh hn khng |ng k.
I.2. Insertion Sort (Phng ph|p xen v{o )
a. Ni dung :
Xt mt danh s|ch c n phn t a0, a1, a2,..........,an-1, ni dung tng qu|t ca phng
ph|p xen v{o l{ : nu trong danh s|ch ~ c i-1 phn t trc ~ c th t, tip tc so
s|nh phn t ai vi i-1 phn t n{y tm v tr thch hp cho ai xen vo. V danh sch c
mt phn t th t n ~ c th t, do ta ch cn so s|nh t phn t th 2 cho n
phn t th n.
V d : Cho m~ng A c 5 phn t :
a0 a1 a2 a3 a4
44 55 12 42 94
i= a0 a1 a2 a3 a4
1 44 55 12 42 94
2 44 55 12 42 94
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
3
9

3 12 44 55 42 94
4 12 42 44 55 94
Hnh 8.2: Minh ha qu trnh sp xp qua phng php Insertion Sort
b. Gii thut :
void Insertion_sort(int A[], int n)
{
int x;
int i,j;
for (i=1; i< n; i++)
{
x = A[i];
for (j=i-1; j>=0 && x<A[j]; j--)
A[j+1] = A[j];
A[j+1]=x;
}
}
c. Phn tch
- S ln so s|nh C(n):
+ Trng hp tt nht : Khi danh s|ch ~ c th t ban u, mi phn t ch cn
so s|nh mt ln vi phn t ng trc n
C
min
= n-1
+ Trng hp xu nht: Khi danh s|ch c th t ngc, mt phn t A[i] s phi so
snh i-1 ln
Cmax =

=

=
1
1
2
) 1 (
n
i
n n
i ~
2
2
n

+ Trng hp trung bnh : Mi phn t A[i] s c s ln so s|nh trung bnh l
i
2

ln
Caverage =
4 4
) 1 (
2
) 1 ( ... 3 2 1
2
n
n n n
~

=
+ + + +

Bc ca C(n) l{ O(n
2
)
- S ln i ch M(n)
Gn x = A[i] ;
+ Trng hp tt nht : Sau ln so s|nh duy nht ta li g|n x tr li cho A[i]; do
vi n phn t s c n-1 ln g|n n{y, nn :
Mmin = 2* (n-1)
+ Trng hp xu nht : Mi bc s c i-1 ln so s|nh tng ng vi i-1 ln i
ch, cng thm 2 ln g|n tr nh trn; do ta c :
Mmax = Cmax + 2* (n-1)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
0

) 1 ( * 2
2
) 1 ( * 2
2
) 1 (
2
+ ~ +

= n
n
n
n n

+ Trng hp trung bnh : Ta cng c s ln i ch trung bnh l{ :
Maverage= Caverage ) 1 ( * 2
4
) 1 ( * 2
2
+ ~ + n
n
n
Bc ca M(n) cng l{ O(n
2
)
I.3. Selection Sort (Phng ph|p la chn) :
a. Ni dung : Xt mt danh s|ch c n phn t a0, a1, a2,..........,an-1; sp th t mt
danh s|ch, ta so s|nh tt c c|c phn t ca danh s|ch chn ra mt phn t nh nht
a v u danh s|ch; sau tip tc chn phn t nh nht trong c|c phn t cn li
to th{nh phn t th 2 trong danh s|ch. Qu| trnh n{y c lp i lp li cho n khi
chn ra c phn t nh th (n-1)
b. Gii thut (i vi danh s|ch c)
void Selection_Sort(int A[], int n)
{
int min, vitrimin;
int i,j;
for (i=0; i< n-1; i++)
{
min = A[i];
vitrimin=i;
for (j=i+1; j<n; j++)
if (A[j] < min)
{ min = A[j];
vitrimin=j;
}
// Doi cho 2 phan tu A[i] va A[vitrimin]
A[vitrimin] = A[i];
A[i] = min;
}
}
c. Phn tch :
- S ln so s|nh C(n) : khng ph thuc v{o th t ban u ca danh s|ch, m{ ph
thuc v{o s ln thc hin ca hai vng For lng nhau.
Vng For ngo{i s lp n-1 ln, vi mi ln lp th n s thc hin vng For trong. S
ln so s|nh ca vng For trong ty thuc v{o ch s i, tc l{ v tr ang xt :
i= 0 so snh (n-1) ln (j= 1 n-1)
i= 1 so snh (n-2) ln (j= 2 n-1)
....
i= n-2 so s|nh 1 ln (j:= n-1 n-1)
Suy ra s ln so s|nh l{:
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
1

C = (n-1) + (n-2) + (n-3) + ... + 1
= i
n n
i
n
=

=

1
1
1
2
( )

C(n) ~
2
2
n
s ln i ch
Bc ca C(n) cng l O(n
2
)
Nh vy s ln so s|nh phng ph|p chn la lun lun tng ng vi s ln
so s|nh trong trng hp xu nht ca phng ph|p xen v{o
- S ln i ch M(n) : Ty thuc th t ban u ca danh s|ch, n s nh nht khi
c|c kha ban u ~ c th t v{ ln nht khi kha c th t ngc.
II. QUICK_SORT : (Sp xp theo phng ph|p ph}n on)
1. Ni dung: Chn mt phn t bt k trong danh s|ch l{m im cht x, so s|nh v{
i ch nhng phn t trong danh s|ch n{y to ra 3 phn: phn c gi| tr nh hn x,
phn c gi| tr bng x, v{ phn c gi| tr ln hn x. Li tip tc chia 2 phn c gi| tr nh
hn v{ ln hn x theo nguyn tc nh trn; qu| trnh chia phn s kt thc khi mi phn
ch cn li mt phn t, lc n{y ta ~ c mt danh s|ch c th t.
V d: Xt dy 26 33 35 29 19 12 32
Ln chia phn th nht : Chn phn t cht c kha l{ 29, t l{ x
26 33 35 29 19 12 32
i j
Dng hai bin ch s i v{ j duyt t hai u danh s|ch n x. Nu i gp phn t
ln hn hay bng x s dng li, j gp phn t nh hn hay bng x s dng li, ri i ch
hai phn t n{y; sau tip tc duyt cho n khi i>j th ngng li.
Lc n{y d~y s c 3 phn kh|c nhau nh hnh v sau :
26 33 35 29 19 12 32
i j
26 12 35 29 19 33 32
i j
26 12 19 29 35 33 32
ij
26 12 19 29 35 33 32
j i
Ln chia phn th hai cho d~y con 26 12 19, chn cht x=12
26 12 19 12 26 19
i j j i
Kt thc ta s c hai phn : 12 ; 26 19
Ln chia phn th 3 cho d~y con 26 19, chn cht x=26
26 19 19 26 Kt thc qu| trnh chia nh d~y con 26 12 19
i j j i
- Ln chia phn th 4 cho d~y con 35 33 32, chn cht x= 33
35 33 32 32 33 35 32 33 35
i j ij j i
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
2

Kt thc ta s c ba phn : 32 ; 33 ; 35
n }y qu| trnh chia phn kt thc v tt c c|c phn ch c mt phn t, lc n{y
ta s c mt danh s|ch c th t l{ :
12 19 26 29 32 33 35
2. Gii thut:
a. Gii thut khng quy:
- Ta to mt Stack, mi phn t ca Stack c 2 th{nh phn l{ q, r cha ch s u v{
ch s cui ca d~y cn sp. Ban u, Stack[0].q = 0 v{ Stack[0].r =n-1
- Tin h{nh ph}n hoch d~y s gm c|c s bt u t ch s q n ch s r
- Sau mi ln chia phn, ta kim tra xem phn c gi| tr nh hn cht v{ phn c gi|
tr ln hn cht nu c t 2 phn t tr ln th a v{o Stack. Sau mi ln ph}n hoch, ta
li ly d~y s mi t Stack ra ph}n hoch tip.
- Qu| trnh c nh th cho ti khi Stack rng th kt thc.
* Chng trnh:
void Quick_Sort(int A[100], int n)
{ struct Element_Stack // kiu phn t trong Stack
{
int q, r;
} ;
Element_Stack Stack[50]; // Stack c ti a 50 phn t
int sp=0; // con tr Stack, khi to sp=0
int i,j,x,q,r,temp;
Stack[0].q =0 ; // ch s u ca mng cn sp
Stack[0].r =n-1; // ch s cui ca mng cn sp
do
{ // Ly mt ph}n hoch ra t Stack
q = Stack[sp].q ; r =Stack[sp].r ;
sp--; // Xa 1 phn t khi Stack
do
{ // Ph}n on d~y con a[q],..., a[r]
x = A[(q+r) / 2] ; // Ly phn t gia ca d~y cn sp th t l{m cht
i = q; j =r;
do
{ while (A[i] < x) i++; //Tm phn t u tin c tr ln hn hay bng x
while (A[j] > x) j--; //Tm phn t u tin c tr nh hn hay bng x
if (i<=j) // i ch A[i] vi A[j]
{ temp = A[i];
A[i] =A[j];
A[j] = temp;
i++ ; j--;
}
} while (i<=j);
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
3

if (i<r) // phn th ba c t 2 phn t tr ln
{ // a v{o Stack ch s u v{ ch s cui ca phn th ba
sp++;
Stack[sp].q=i;
Stack[sp].r=r;
}
r = j ; // Chun b v tr ph}n hoch phn c gi| tr nh hn cht
} while (q< r);
} while (sp!=-1); // Ket thuc khi Stack rong
}
b. Gii thut Quick Sort qui: v c ch thc hin th cng ging nh gii thut
khng qui, nhng ta khng kim so|t Stack m{ cho qu| trnh gi qui t to ra
Stack.
* Chng trnh:
void Sort(int A[], int q,int r)
{ int temp;
int i=q;
int j=r;
int x = A[(q+r) / 2] ; //Ly phn t gia ca d~y cn sp th t l{m cht
do
{ // Ph}n on d~y con a[q],..., a[r]
while (A[i] < x) i++; //Tm phn t u tin c tr ln hn hay bng x
while (A[j] > x) j--; //Tm phn t u tin c tr nh hn hay bng x
if (i<=j) // Doi cho A[i] voi A[j]
{ temp = A[i];
A[i] =A[j];
A[j] = temp;
i++ ; j--;
}
} while (i<=j);
if (q<j) // phn th nht c t 2 phn t tr ln
Sort(A,q,j);
if (i<r) // phn th ba c t 2 phn t tr ln
Sort (A,i,r);
}
void Quick_Sort(int A[], int n)
{ Sort( A,0,n-1); // Gi h{m Sort vi phn t u c ch s 0 n //
phn t cui cng c ch s n-1
}
3. Phn tch :
Ta nhn thy nh chia th{nh nhng d~y con trong mi ln chia phn s c kh
nng gim c s ln so s|nh. Tuy nhin cn ty thuc v{o vic chn phn t cht v{
th t ban u ca d~y.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
4

Khi chn v tr phn t cht l{ gia th nu chia ta s c c|c d~y con c s phn
t gn bng nhau v{ do s gim c s ln so s|nh.
- Trng hp tt nht:
d tnh C(n) v{ M(n), ta gi s s nt ca danh s|ch cn sp xp l{ n = 2
m

Vi 1 danh s|ch ban u : n ln so s|nh (trong c 2 hng qut)
Vi 2 danh s|ch con tip theo : nh hn hoc bng n/2 ln so s|nh trong mi
danh sch con
Vi 4 danh s|ch con tip theo : nh hn hoc bng n/4 ln so s|nh trong mi
danh sch con
.....
Vi n danh s|ch con cui cng: nh hn hoc bng n/n ln so s|nh trong mi danh
sch.
+ Tng s ln so s|nh C(n):
C(n) s (1*n) + (2* n/2 ) + (4* n/4 ) + ... + (n* n/n )
s n + n + n + ... + n
V ta s c nhiu nht l{ m ln chia nn:
C(n) s m * n = n lgn
Vy bc ca C(n) l{ O(nlgn)
+ Tng s ln i ch M(n):
S ln i ch phi t hn hoc bng s ln so s|nh:
M(n) s C(n)
Bc ca M(n) cng l{ O(nlgn)
- Trng hp xu nht: Vi gii thut Quick Sort, trng hp xu nht khi nt l{m
cht lc n{o cng u hay cui danh s|ch sau mi ln chia phn. Hai danh sch con suy
bin th{nh mt danh s|ch con c s nt bt i 1. Trong trng hp n{y:
Vi danh s|ch ban u : n ln so s|nh
Vi danh s|ch con tip theo : n-1 ln so s|nh
Vi danh s|ch con tip theo : n-2 ln so s|nh
....
Vi danh s|ch con cui cng : 1 ln so snh
+ Tng s ln so s|nh C(n):
C(n) = n + (n-1) + (n-2) + ... + 1 = n(n+1) /2
Bc ca C(n) l{ O(n
2
)
+ Tng s ln i ch M(n):
S ln i ch phi t hn hoc bng s ln so s|nh:
M(n) s C(n)
Bc ca M(n) cng l{ O(n
2
)
- Trng hp trung bnh : Trng hp trung bnh th C(n) v{ M(n) c bc khong
gia O(nlgn) v{ O(n
2
)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
5

III. HEAP SORT (Sp xp kiu vun ng)
III.1. nh ngha Heap: Heap l{ c}y nh ph}n gn y c c{i t bng mng mt
chiu vi c|c nt trn Heap c ni dung ln hn hay bng ni dung ca c|c nt con ca
n.
V d: Ta c d~y s sau:
55 24 78 15 37 62 94 41 09 82
(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)
th c}y nh ph}n ban u ca d~y l{:
55
24
15 37
78
62 94
41 09 82
(0)
(1)
(2)
(3) (4)
(5) (6)
(7)
(8)
(9)

v{ heap ca d~y sau khi vun ng s l{:
94
82
41 37
78
62 55
15 09 24

III.2. Thut to|n Heap Sort:
a. Ni dung:
- Trc tin ta c{i t h{m Adjust (A, r,n) iu chnh c}y c gc v tr r vi n
nt th{nh ng vi gi thit hai c}y con ~ l{ ng.
Lu : Do gi thit l{ ta ~ c hai c}y con l{ ng nn ta phi vun ng t di ln.
Trong c}y ch c c|c nt vi v tr 0,1,..., n/2-1 mi l{ c|c nt gc c c}y con. Do , ta ch
cn vun ng c|c c}y v tr 0,1,..., n/2-1.
- Do sau khi vun ng th nt v tr 0 s c ni dung ln nht nn ta s ho|n i
ni dung ca A0 vi An-1.
- Ta tip tc Adjust(0, n-1) vun ng c}y vi gc nt c v tr 0 v{ s nt l{ n-1
nt cn li (A0, A1,..., An-2). Sau , s ho|n i ni dung ca A0 vi An-2.
- Qu trnh trn tip tc cho n khi c}y c vun ng ch cn 1 nt th dng li.
Cui cng, ta ~ c d~y ~ c sp theo th t tng dn.
* Thut to|n Adjust (A,r,n)
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
6

- Ta so s|nh ni dung ca 2 nt con tm ra ni dung ca nt con ln hn
- So s|nh tip ni dung ca nt con ln hn vi ni dung ca nt gc :
+ Nu ni dung ca nt con m{ nh hn ni dung ca nt gc th c}y con l{
ng.
+ Nu ni dung ca nt con m{ ln hn ni dung ca nt gc th di chuyn ni
dung ca nt con ln v tr ca nt gc r. Sau , iu chnh tip c}y c gc v tr nt l{
nt con ln hn .
b. C{i t:
void Adjust(int A[], int r, int n)
{
int j=2*r+1; // vi tri nut con ben trai
int x=A[r];
int cont=TRUE;
while (j<=n-1 && cont)
{
if (j<n-1) // luc nay r moi co nut con ben phai. Neu j=n-1 thi r khong
// co nut con ben phai thi khong can so sanh
if (A[j] < A[j+1]) // tim vi tri nut con lon hon
j++;
if (A[j] <=x)
cont=FALSE;
else
{ // di chuyen nut con j len r
A[r]= A[j];
r=j ; // xem lai nut con co phai la dong khong
j=2*r+1;
}
}
A[r]=x;
}
void Heap_sort(int A[], int n)
{
int i, temp;
for (i=n/2-1; i>=0; i--) // Tao heap ban dau
Adjust(A, i,n);
for (i=n-2; i>=0; i--)
{
temp= A[0]; // Cho A[0] ve cuoi heap
A[0] = A[i+1];
A[i+1] = temp;
Adjust(A,0,i+1); // Dieu chinh lai heap tai vi tri 0
// Luc nay, 2 cay con o vi tri 1 va 2 da la heap
}
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
7

c. V d: Dng thut to|n heap sort sp xp d~y s sau theo chiu tng dn:
55 24 78 15 37 62 94 41 09 82
(0) (1) (2) (3) (4) (5) (6) (7) (8) (9)
n = 10;
C}y nh ph}n ban u ca d~y l{:
55
24
15 37
78
62 94
41 09 82
(0)
(1)
(2)
(3) (4)
(5) (6)
(7)
(8)
(9)

Vun c}y ban u th{nh ng bng gii thut Adjust
Vun ng : Vun t di ln, Trong c}y ch c c|c nt 0, 1,2,... n/2-1=4 mi l{ cc
nt gc
for (i=n/2-1; i>=0; i--) // Tao heap ban dau
Adjust(A, i,n);
+ Vun c}y c gc l{ n/2 -1 = C

+ Vun c}y c gc l{ n/2 -2 = C

+ Vun c}y c gc l{ n/2 -2 = C
55
24
15 82
78
62 94
41 09 37
55
24
41 82
78
62 94
15 09 37
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
8


+ Vun c}y c gc l{ n/2 -2 = C

Do sau khi ho|n i th c}y con khng phi l{ ng nn ta Adjust li:

+ Vun c}y c gc l{ n/2 -2 =

Do sau khi ho|n i th c}y con khng phi l{ ng nn ta Adjust li:
55
24
41 82
94
62 78
15 09 37
55
82
41 24
94
62 78
15 09 37
55
82
41 37
94
62 78
15 09 24
94
82
41 37
55
62 78
15 09 24
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
4
9


Ta i ch A[0] vi A[n-1] v{ sau Adjust li c}y v tr 0 vi s nt gim i 1,
v{ qu| trnh trn s dng li khi s nt bng 0.
for (i=n-2; i>=0; i--)
{
temp= A[0]; // Cho A[0] ve cuoi heap
A[0] = A[i+1];
A[i+1] = temp;
Adjust(A,0,i+1); // Dieu chinh lai heap tai vi tri 0
// Luc nay, 2 cay con o vi tri 1 va 2 da la heap
}
+ i = n-2 = 8: i ch A[0] vi A[n-1] th dy {A[n-1]} ~ sp xp.

Sau , ta li vun c}y c gc l{ 0 v{ s nt l n-1 =9 th{nh ng.

+ i = 7: i ch A[0] vi A[n-2] th dy {A[n-2], A[n-1]} ~ sp xp.
94
82
41 37
78
62 55
15 09 24
24
82
41 37
78
62 55
15 09 94
82
24
41 37
78
62 55
15 09
82
41
24 37
78
62 55
15 09
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
0


Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-2=8 th{nh ng.

+ i = 6: i ch A[0] vi A[n-3] th dy {A[n-3], A[n-2], A[n-1]} ~ sp xp.

Sau , ta li vun c}y c gc l{ 0 v{ s nt l n-3=7 th{nh ng.

+ i = 5: i ch A[0] vi A[n-4] th dy {A[n-4], A[n-3], A[n-2], A[n-1]} ~ sp xp.

Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-4=6 th{nh ng.
09
41
24 37
78
62 55
15 82
78
41
24 37
09
62 55
15
78
41
24 37
62
09 55
15
15
41
24 37
62
09 55
78
62
41
24 37
15
09 55
62
41
24 37
55
09 15
15
41
24 37
55
09 62
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
1


+ i = 4: i ch A[0] vi A[n-5] th dy {A[n-5],A[n-4], A[n-3], A[n-2], A[n-1]} ~
sp xp.

Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-5=5 th{nh ng.

+ i = 3: i ch A[0] vi A[n-6] th dy {A[n-6], A[n-5],A[n-4], A[n-3], A[n-2], A[n-
1]} ~ sp xp.

Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-6=4 th{nh ng.

+ i = 2: i ch A[0] vi A[n-7] th dy {A[n-7], A[n-6], A[n-5],A[n-4], A[n-3], A[n-
2], A[n-1]} ~ sp xp.
55
41
24 37
15
09
09
41
24 37
15
55
41
09
24 37
15
41
37
24 09
15
09
37
24 37
15
37
09
24
15
37
24
09
15
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
2


Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-7=3 th{nh ng.

+ i = 1: i ch A[0] vi A[n-8] th dy {A[n-8], A[n-7], A[n-6], A[n-5],A[n-4], A[n-
3], A[n-2], A[n-1]} ~ sp xp.
15
09 24

Sau , ta li vun c}y c gc l{ 0 v{ s nt l{ n-7=3 th{nh ng.
15
09

+ i = 0: i ch A[0] vi A[n-9] th dy {A[n-9], A[n-8], A[n-7], A[n-6], A[n-5],A[n-
4], A[n-3], A[n-2], A[n-1]} ~ sp xp.
09
15

Cui cng, d~y ~ c sp theo th t tng dn.
IV. MERGE SORT (Sp xp kiu trn)
a. Ni dung: Merge Sort l{ phng ph|p sp xp bng c|ch trn hai danh s|ch ~
c th t th{nh mt danh s|ch c th t. Phng ph|p n{y gm nhiu bc nh sau:
a.1. Xem danh s|ch cn sp xp nh n danh s|ch con ~ c th t, mi danh s|ch
con c 1 phn t.
Trn tng cp hai danh s|ch con k cn, ta s c n/2 danh s|ch con ~ c th t,
mi danh s|ch con c 2 nt.
a.2. Ta tip tc xem danh s|ch cn sp xp nh n/2 danh s|ch con ~ c th t, mi
danh s|ch con c 2 phn t.
Trn tng cp hai danh s|ch con k cn, ta s c n/4 danh s|ch con ~ c th t,
mi danh s|ch con c 4 nt.
a.3. Qu| trnh trn c tip tc cho n khi c 1 danh s|ch con c n phn t.
V d: Ta dng phng ph|p Merge Sort sp xp d~y s sau:
09
24
37
15
24
09 15
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
3

25 55 45 40 10 90 85 35

Hnh 8.3: Cc bc trn ca gii thut Merge Sort.
b. Gii thut:
C|c bin s dng:
- A l{ d~y s cn sp c n phn t
- low1, up1, low2, up2 l{ cn di v{ cn trn ca 2 danh s|ch con ang trn
- size l{ kch thc ca danh s|ch con, bc trn 1 th size=1, bc trn 2 th
size=2, bc trn 3 th size=4, bc trn 4 th size=8,...
#define MAXLIST 100
int A[MAXLIST];
void mergesort(int A[], int n)
{
int i, j, k, low1, up1, low2, up2, size;
int dstam[MAXLIST];
size = 1;
while(size < n)
{
low1 = 0;
k = 0;
while(low1+size < n)
{
up1 = low1+ size-1;
low2 = up1 + 1;

up2 = (low2+size-1 < n) ? low2+size-1 : n-1;

for(i = low1, j = low2; i <= up1 && j <= up2; k++)
if(A[i] <= A[j])
dstam[k] = A[i++];
else
dstam[k] = A[j++];
for(; i <= up1; k++)
dstam[k] = A[i++];
for(; j <= up2; k++)
25 55
25 55
45 40
40 45
10 90
10 90
85 35
35 85
Bc 1
Bc 2
40 25 55 45 35 10 90 85 Bc 3
Bc 4
10 25 35 40 45 55 85 90
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
4

dstam[k] = A[j++];
low1 = up2+1;
}
for(i = low1; k < n; i++)
dstam[k++] = A[i];
for(i = 0; i < n; i++) // gan nguoc tra lai cho A
A[i] = dstam[i];
size *= 2;
}
}
c. Phn tch
Gii thut Merge Sort khng hiu qu v mt b nh v c dng thm danh s|ch
tm trong qu| trnh sp xp.
- S ln so s|nh C(n) :
Gii thut Merge Sort c log2n bc trn, c t hn n ln so s|nh trong tng bc
Suy ra C(n) < nlog2n
Bc ca C(n) l{ O(nlgn)
- S ln i ch M(n) :
Gii thut Merge Sort c log2n bc trn, trong tng bc trn c chp n nt t
danh s|ch A[] sanh dstam[] v{ chp n nt t danh s|ch dstam[] v danh s|ch A[]
Vy M(n) c bc l{ O(nlgn)
V. TM KIM:
V.1. Kh|i nim: Cho danh s|ch A c n phn t. Tm x trong danh s|ch A, nu c th
tr v v tr ca phn t trong danh s|ch, ngc li nu tm khng thy th tr v -1.
Thng thng danh s|ch A cha c th t hoc ~ c sp theo 1 trt t n{o .
V.2. Tm kim tun t:
- Ni dung: Ta tm t u danh s|ch cho n khi n{o gp phn t u tin c tr
bng vi x hoc ~ tm ht danh s|ch th dng li. Gii thut n{y c dng trong danh
s|ch cha c th t.
- Gii thut:
int Search(int A[], int n, int x)
{ int i=0;
while (i<n && A[i] <> x)
i++;
return (i<n ? i : -1) ;
}
V.3. Tm kim nh ph}n: ch dng c i vi danh s|ch ~ c th t. Ta gi s
danh s|ch c th t tng dn.
- Ni dung:
+ Bc 1: Phm vi tm kim ban u l{ to{n b danh s|ch.
+ Bc 2: Ly phn t chnh gia ca phm vi tm kim (gi l{ y) so s|nh vi x.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
5

- Nu x=y th ta ~ tm thy, tr v ch s. Gii thut kt thc
- Nu x < y th phm vi tm kim mi l{ c|c phn t nm pha trc ca
y.
- Nu x > y th phm vi tm kim mi l{ c|c phn t nm pha sau ca y.
+ Bc 3: Nu cn tn ti phm vi tm kim th lp li bc 2, ngc li gii thut
kt thc vi kt qu l{ khng c x trong d~y s.
- Gii thut:
int Binary_Search(int A[], int n, int x)
{ int found=FALSE; // Gi s ban u ta cha tm thy x trong d~y
// Phm vi ban u tm kim l{ t k=0 m=n-1
int k=0;
int m=n-1;
int j;
while (k<=m && !found)
{ j=(k+m) /2; //ch s phn t gia
if (A[j]==x)
found=TRUE;
else if (x>A[j]) k=j+1; // Phm vi tm mi l{ (j+1, m)
else m=j-1; // Phm vi tm mi l{ (k, j-1)
}
return (found ? j : -1) ;
}
V.4. Php tm kim nh ph}n qui:
- Ni dung: tng t nh trn
+ Bc 1: Phm vi tm kim ban u l{ to{n b danh s|ch (k=0m=n-1).
+ Bc 2: Ly phn t chnh gia ca phm vi tm kim (gi l{ y) so s|nh vi x.
- Nu x=y th ta ~ tm thy, tr v ch s. Gii thut kt thc
- Nu x < y th phm vi tm kim mi l{ c|c phn t nm pha trc ca
y, nn ta gi qui vi phm vi mi l{ (k, j-1)
- Nu x > y th phm vi tm kim mi l{ c|c phn t nm pha sau ca y,
nn ta gi qui vi phm vi mi l{ (j+1,m )
+ iu kin dng: x=y hoc k > m.
- Gii thut:
int Binary_Search2(int A[], int k,int m, int x)
{ int j=(k+m) /2;
if (k>m) return -1 ;
else if (A[j]==x) return j ;
else Binary_Search2(A, (A[j]<x ? j+1:k), (A[j] > x ?j-1:m),x);
}

LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
6

BI TP :
1. Vit li h{m QuickSort trong trng hp chn nt cht l{ nt gia ca danh s|ch
cn sp.
2. Vit gii thut tm k nt ln nht trong danh s|ch c n nt, yu cu gii thut c
dng cu trc heap.
3. C{i t gii thut Seletion Sort trn danh s|ch lin kt.
4. Vit chng trnh minh ha c|c phng ph|p sp xp. Chng trnh c c|c chc
nng sau:
a. Nhp ngu nhin n s v{o danh s|ch vi n kh| ln
b. Chn phng ph|p sp xp, c b|o thi gian thc hin qu| trnh sp xp:
Bubble Sort, Insertion Sort, Selection Sort, Quick Sort, Heap Sort, Merge
Sort.
c. Xem danh sch
d. Kt thc chng trnh
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
7

CHNG VII
TH (GRAPH)
Mt cu trc d liu c |p dng rt nhiu trong k thut lp trnh l{ th. Cu
trc d liu th c s dng trong c|c b{i to|n ca rt nhiu lnh vc nh ng i,
s mng m|y tnh, s ng xe la - ng xe in ngm trong th{nh ph....
Chng n{y s m t c|c c|ch t chc v{ cu trc d liu kh|c nhau cho 2 loi
th: th v hng v{ th c hng. Chng ta s nghin cu 2 c|ch c{i t th nh
ma trn k v{ danh s|ch k, hai phng ph|p duyt th (theo chiu s}u v{ theo chiu
rng). Ngo{i ra ta s tham kho mt gii thut tm ng i ngn nht (Shortest paths
algorithm) trn mt th c trng s.
I. CU TRC D LIU CHO TH:
I.1. nh ngha th :
- Mt th G (Graph) bao gm mt tp V (vertices) cha c|c nt ca th v{ mt
tp E cha c|c cp nt (v,w) sao cho gia v v{ w c mt cnh.

Hnh 6.1 th v hng
V = {v, w, z, t}
E = { (v,w); (v,t); (t,z); (v,z) }
- th v hng (Undirected graph): l{ th m{ c|c cung khng c chiu nht
nh.
- th hu hng (Directed graph): l{ th trong mi cung c mt chiu nht
nh.

Hnh 6.2 th hu hng
V = {v, w, z, t}
E = {<v,w>); <w,t>; <w,z>; <t,v>; <t,z>}
I.2. C|c kh|i nim trn th:
v w
t
z
v w
t
z
G ={
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
8

Trong b{i hc, chng ta s dng th hnh 6.3 minh ha c|c kh|i nim trn
th.

Hnh 6.3 th hu hng minh ha cho cc khi nim ca th.
- Cnh ni hai nh a v{ b trn th v hng c k hiu (a,b)
- Cnh ni hai nh a v{ b trn th hu hng c k hiu <a,b>.
- Nt: th hnh 6.3 c 5 nt l A, B, C, D, E
- Cung : Mi cung trn th c x|c nh bi 2 nt: nt nh (nt trc ca
cung) v{ nt ngn (nt sau ca cung)
+ Khuyn: Cnh (hay cung) ni t 1 nh n chnh nh gi l{ khuyn.
Khuyn l{ chu trnh c chiu d{i l{ 1.
- Bc ca nt: s cung lin kt vi nt
+ Bc v{o: s nt ngn lin kt vi nt
+ Bc ra: s nt nh lin kt vi nt.
Bc ca nt = bc v{o + bc ra
- Nt k: Nt y c gi l{ nt k vi nt x nu c 1 cung i t nt x n nt y.
- ng i: ta ni t nt x n nt y c 1 ng i vi chiu d{i l{ k khi i t nt x
n nt y ta qua 1 chui k-1 nt x n1 n2 ... nk-1 y vi nt ni l{ nt k vi nt
ni-1.
V d: ng i t nt A n nt D qua c|c nt A, C, D c chiu d{i l{ 2.
- Chu trnh : Ta ni qua nt x c 1 chu trnh chiu d{i k nu xut ph|t t nt x
chng ta qua k-1 nt trung gian v{ v li nt x (x n1 n2 ... nk-1 x)
V d:
Khuyn A -> A (chiu d{i chu trnh n{y bng 1)
Chu trnh A -> C -> D -> E -> A c chiu d{i bng 4
- th c trng s: l{ th m{ mi cung c lin kt vi 1 trng s; thng thng
trng s n{y s c mt ngha n{o chng hn nh chiu d{i ca on ng, chi ph
vn chuyn trn mt qu~ng ng, thi gian vn chuyn...
- th lin thng: th c gi l{ lin thng nu vi mi cp nt ph}n bit bao
gi cng c 1 ng i t nt n{y n nt kia.
V d: th hnh 6.3 l{ th lin thng.
I.3 T chc d liu cho th :
Mt th G bao gm mt tp c|c nt v, mi nt v e V s c mt tp Av cha c|c nt
w e V sao cho c mt cung t v w e E
A
B
E D
C
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
5
9

w c gi l{ nt k ca v.
Chng ta c c|c phng ph|p c{i t cu trc d liu cho tp c|c nt ca mt
th : ma trn k v{ danh s|ch k.
a. Ma trn k (mng 2 chiu):
- Trong trng hp G l{ th v hng th ta quy c :
G[v][w] = G[w][v] = 1 nu (v,w) e E
- Trong trng hp G l{ th hu hng th ta quy c :
G[v][w] = 1 nu <v,w> e E
V d : Ma trn k ca th hnh 6.4 c dng:

0 0 1 1 0
0 0 1 0 0
0 0 0 1 1
0 0 0 0 1
0 0 0 1 0



Hnh 6.4
- Khai bo :
const MAX = 50; // S nh ti a ca th
typedef int Dothi[MAX][MAX] ;
Dothi G ; // G l{ ma trn k biu din th
b. Danh s|ch k (mng 1 chiu kt hp vi danh s|ch lin kt):
Mt th c xem l{ bao gm danh s|ch c|c nt, mi nt c mt danh s|ch c|c
nt k tng ng.
V d : Danh s|ch k ca th hnh 6.4 c dng:
1 2
0 3
4
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
0


Hnh 6.5 Danh sch k ca th 6.4
- Khai bo :
typedef int BYTE;
const MAX = 6;
struct node
{
int dinh_ke;
struct node *next;
};

typedef struct node *NODEPTR;
struct phantu
{
NODEPTR pF;
NODEPTR pL ;
};
typedef struct phantu Dothi[MAX];
Dothi G;
II. DUYT TH:
Trong a s c|c b{i to|n trn th, vic ln lt i qua tt c c|c nt ca mt
th l{ rt cn thit; vic n{y gi l{ duyt mt th. Ta c nhiu phng ph|p duyt
mt th: duyt theo chiu s}u v{ duyt theo rng.
minh ha cho c|c gii thut duyt th, ta s dng th hnh 6.6 sau:

Hnh 6.6 th minh ha cho cc gii thut duyt



2 3
4 3
4




0
1
2
3
4
6
7
2
3

max
0
1
4 3
2
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
1

II.1. Duyt theo chiu su (Depth-First Travelsal)
Nguyn tc :
Gi s ta n mt nt v c c|c nt k ln lt l{ w1, w2,...wk. Sau khi duyt nt v, ta
s i qua w1 v{ gi li c|c nt w2,...,wk v{o Stack. Tip tc duyt nt w1 v{ tt c c|c nt
k ca w1, ri mi tr li duyt w2. Lp li cho n khi duyt ht nt wk v{ c|c nt k ca
n.
Lu :
- Khng duyt mt nt hai ln.
- tr|nh trng hp duyt st mt nt k trong th, ta phi to mt vng lp
c th m bo duyt ht c|c nt ca th.
Gii thut:
void Depth_traverse(int i0) // nt bt u t duyt
{
int C [MAX] ; // de danh dau cac dinh da di qua
int Stack[MAX] ; // Stack de chua cac dinh trong khi duyet
int sp ; // sp : con tro dau stack
int i,x ;

for (i=0; i<MAX; C[i++] =0 );
sp=0; // khoi tao Stack
Stack[sp]=i0;
C[i0]=1 ; // da duyet qua dinh i0
while (sp >-1) // Khi Stack khac rong
{
x=Stack[sp];
sp-- ; // xoa dinh vua tham ra khoi Stack
cout << x << " "; // Tham dinh vua lay ra
for (i=0; i<MAX; i++) // dua tat ca cac nt ngon chua duyet tu x vao C
if (G[x][i] && C[i]==0)
{
Stack[++sp]=i;
C[i]=1;
}
}
}
V d: p dng gii thut trn cho th hnh 6.6 ta s nhn c kt qu tng
ng vi c|c nh bt u :
nh bt u Trnh t duyt
0 0 4 3 1 2
1 1 2 3 0 4
2 2 3 0 4 1
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
2

3 3 0 4 1 2
4 4 3 0 1 2
II.2. Duyt theo rng (Breadth First Travelsal)
Nguyn tc :
Gi s ta n mt nt v c c|c nt k ln lt l{ w1, w2,...wk. Sau khi duyt nt v, ta
duyt ht c|c nt wi ca v, ri mi tip tc xem c|c nt k ca tng wi. Duyt c|c nt k
cha c duyt ca c|c nt wi. C tip tc nh vy cho n khi ht c|c nt ca th.
* Gii thut:
// Hang doi phuc vu cho cong viec duyet Width_traverse
struct node
{
int diachi ;
struct node *next;
};
typedef node *Node_queue;
struct Queue
{
Node_queue Front, Rear;
} Q;
void Insert_queue(Queue &Q, int x)
{
Node_queue p;
p = (Node_queue)malloc(sizeof(struct node));
p->diachi = x;
if (Q.Front==NULL)
Q.Front=p;
else Q.Rear->next=p;
Q.Rear=p;
p->next=NULL;
}
int Delete_queue(Queue &Q)
{
Node_queue p;
int x;
if(Q.Front==NULL)
{
cout <<"\nHang doi rong";
getche();
exit(1);
}
else
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
3

p = Q.Front; // nut can xoa la nut dau
x = p->diachi;
Q.Front = p->next;
free(p);
return x;
}
}
void Width_traverse(int i0) // dinh bat dau de tu do duyet
{
BYTE C [MAX] ; // de danh dau cac dinh da di qua
int i,x ;
cout << "Cac dinh cua do thi theo giai thuat duyet rong \n";
for (i=0 ; i< MAX; C[i++]=0);
Q.Front= NULL; // khoi tao hang doi
Insert_queue(Q,i0);
C[i0]=1 ; // da duyet qua dinh i0
while (Q.Front !=NULL)
{
x=Delete_queue(Q); // xoa dinh vua tham ra khoi hang doi
cout << x << " "; // Tham dinh Q[l]
for (i=0; i<MAX; i++) // dua tat ca cac dinh ngon chua duyet tu x vao Q
if (G[x][i] && C[i]==0)
{
Insert_queue(Q,i);
C[i]=1;
}
}
}
V d: p dng gii thut trn cho th hnh 6.6 ta s nhn c kt qu tng
ng vi c|c nh bt u :
nh bt u Trnh t duyt
0 0 1 4 2 3
1 1 2 0 3 4
2 2 0 3 1 4
3 3 0 1 4 2
4 4 3 0 1 2
III. BI TON BAO NG TRUYN NG:
III.1. Kh|i nim:
Bao ng truyn ng ca mt th G c n nt l{ mt ma trn cho chng ta bit
gia 2 nt x v{ y bt k trn th c tn ti mt ng i vi chiu d{i nh hn hay
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
4

bng n hay khng.
Ma trn hnh 6.7 l{ bao ng truyn ng ca th hnh 6.4. C|c s 1 trong ma trn
cho ta bit t nt x n nt y tn ti ng i vi chiu d{i nh hn hay bng 5.
0 1 2 3 4
0 0 0 1 1 1
1 0 0 1 1 1
2 0 0 0 1 1
3 0 0 0 1 1
4 0 0 0 1 1
Hnh 6.7: Bao ng truyn ng ca th hnh 6.4
III.2. Thut to|n WarShall :
1- Cho P
1
l{ ma trn k ca th G cho chng ta bit gia 2 nt x v{ y bt k trn
th c tn ti mt ng i vi chiu d{i nh hn hay bng 1.
2. Tnh P
2
= P
1
x P
1
: cho chng ta bit gia 2 nt x v{ y bt k trn th c tn ti
mt ng i vi chiu d{i nh hn hay bng 2.
P
1
x P
1
chnh l{ php nh}n 2 ma trn vi php nh}n l{ and v{ php cng l{ or.
( )
P
*
P P
1
kj
1
ik
n
1 k
) 2 (
ij

=
=

3. Tng t, ta tnh P
3
, P
4
, ..., P
n
.
4. Bao ng truyn ng = P
1
P
2
P
3
... P
n
.
V d: Vi th G hnh 6.4, th ln lt c|c P
i
l:


P
1
=
0 0 1 1 0
0 0 1 0 0
0 0 0 1 1
0 0 0 0 1
0 0 0 1 0



P
2
=
0 0 0 1 1
0 0 0 1 1
0 0 0 1 1
0 0 0 1 0
0 0 0 0 1



P
3
=
0 0 0 1 1
0 0 0 1 1
0 0 0 1 1
0 0 0 0 1
0 0 0 1 0
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
5




P
4
=
0 0 0 1 1
0 0 0 1 1
0 0 0 1 1
0 0 0 1 0
0 0 0 0 1



P
5
=
0 0 0 1 1
0 0 0 1 1
0 0 0 1 1
0 0 0 0 1
0 0 0 1 0
Bao ng truyn ng ca th G :
0 1 2 3 4
0 0 0 1 1 1
1 0 0 1 1 1
2 0 0 0 1 1
3 0 0 0 1 1
4 0 0 0 1 1
* Chng trnh:
#include <stdio.h>
#include <conio.h>
const MAX = 4;
int G[MAX][MAX]= { {0,0,1,0},
{0,0,1,0},
{0,0,1,1},
{0,1,0,0}
} ;
void Xuat(int P[][MAX])
{
int i,j;
for( i=0; i<MAX;i++)
{
for( j=0; j< MAX; j++)
printf ("%4d", P[i][j] ) ;
printf ( "\n");
}
getch();
printf("\n");
}
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
6

void WarShall( int G[][MAX])
{
int i,j,k, dem;
int C[MAX][MAX], P[MAX][MAX];
int BD[MAX][MAX]; // bao ng truyn ng ca ma trn G
for( i=0; i<MAX;i++) // P1
for (j=0;j<MAX; j++)
BD[i][j]= P[i][j]=G[i][j];
for ( dem=1; dem<MAX; dem++)
{
for ( i=0; i<MAX; i++)
for (j=0; j< MAX;j++)
{
C[i][j]=0;
for (k=0; k<MAX; k++)
C[i][j]= C[i][j] || (P[i][k] && G[k][j]);
}
for (i=0;i<MAX;i++)
for (j=0 ; j<MAX; j++)
{
P[i][j]=C[i][j];
BD[i][j]=BD[i][j] || P[i][j]; // OR don ma tran P vua tinh vao bao dong
}
Xuat(P); // Kiem tra tung Pi
}
Xuat(BD);
}
void main()
{
int P[MAX][MAX] ;
int i,j ;
clrscr();
WarShall(G);
getch();
}
IV. GII THUT TM NG I NGN NHT:
i vi mt th c trng s, mi cnh s c mt gi| tr trng s tng ng, tm
ng i ngn nht trn th G t mt nt v n mt nt w l{ b{i to|n tm ng i c
trng lng nh nht t v n w.
Trng s ca mt cnh c th l{ thi gian i qua mt cnh, ph tn, khong c|ch
hoc lu lng.
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
7


Hnh 6.8 th hu hng c trng s
* Thut to|n Dijkstra: Tm c|c ng i ngn nht t nt v n c|c nt cn li ca
th.
Input : - th G l{ ma trn k hu hng c trng s vi qui c sau:
+ Nu u k vi v th d{i cung > 0
+ Nu u khng k vi v th d{i cung = -1
- Nt v l{ nt ta bt u tm c|c ng i ngn nht t v n tt c c|c nt
cn li trong th.
Output: d{i ngn nht t v n tt c c|c nt cn li trong th.
* Gii thut:
Dng mt tp S cha c|c nt ~ x|c nh c khong c|ch ngn nht t nt v
n c|c nt .
Dng mt mng Dist cha gi| tr c|c khong c|ch ngn nht n{y. Nu nt u
trong S th Dist [u] l{ gi| tr khong c|ch ngn nht t v cho n u. Nu u cha c trong S
th Dist [u] cha d{i t v n mt nt w n{o trong S cng vi khong c|ch t w n
u. Mng Dist s c khi to bng gi| tr trng lng t nt v n c|c nt cn li nu c
cnh trc tip, v{ bng v cng (MAXINT) nu khng c cnh trc tip.
0
4 1
3 2
2
5
2
4
1
6
3
10
6
2
0
4 1
3 2
2
5
2
4
1
6
3
10
6
2
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
8


Hnh 6.9 Minh ha cc bc p dng gii thut Dijkstra tm ng i ngn nht t nt 0
cho n tt c cc nt cn li trong th hnh 6.8
* Gii thut
void Shortest_path(BYTE v, const long G[][MAX])
{
/* Cost chua do dai cac cung cua do thi G, voi qui uoc
neu G[i][j]=-1 thi Cost[i][j] = MAXINT */
long Cost[MAX][MAX] ;
/* Dist[j] : the hien do dai cua duong di ngan nhat tu nut v den nut j
trong do thi dinh huong G co MAX nut; G duoc bieu dien boi
ma tran ke huu huong co trong so kich thuoc MAX x MAX */
long int Dist [MAX] ;
a
0
4 1
3 2
2
5
3
d=5
d=3
d=2
d=

S={0}
b
0
4 1
3 2
2
5
4
3
d=5
d=3
d=2
d=6
10
6
S={0,4}
c
0
4 1
3 2
2
2
1
3
d=4
d=3
d=2
d=5
6
S={0,4,2,1}
e
0
4
1
3 2
2
2
1
3
d=4
d=3
d=2
d=5
S={0,4,2,1,3}
f
0
4 1
3 2
2
5
2
4
1
3
d=4
d=3
d=2
d=5
d
S={0,4,2}
0
4 1
3 2
2
5
2
4
1
6
3
10
6
2
a
0
4 1
3 2
2
5
3
d=5
d=3
d=2
d=

S={0}
b
0
4 1
3 2
2
5
3
d=5
d=3
d=2
d=

S={0}
b
0
4 1
3 2
2
5
4
3
d=5
d=3
d=2
d=6
10
6
S={0,4}
c
0
4 1
3 2
2
2
1
3
d=4
d=3
d=2
d=5
6
S={0,4,2,1}
e
0
4
1
3 2
2
2
1
3
d=4
d=3
d=2
d=5
S={0,4,2,1,3}
f
0
4 1
3 2
2
5
2
4
1
3
d=4
d=3
d=2
d=5
d
S={0,4,2}
0
4 1
3 2
2
5
2
4
1
6
3
10
6
2
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
6
9

int duongdi[MAX] ; // chua lo trinh duong di ngan nhat tu v den cac dinh
duongdi= {v};
/* S : Tap cac dinh (ke ca v) theo do cac duong di ngan nhat da xac lap */
int S[MAX] ;
int w,i,j,u,k ;
for (i=0; i<MAX; i++)
for (j=0;j<MAX;j++)
Cost[i][j]= (G[i][j]==-1? MAXINT : G[i][j]);
// Khoi tao S va Dist
for (i=0; i< MAX; S[i]=0, Dist[i]=Cost[v][i],i++ );
S[v]=1; Dist[v]=0 ; k=1; //dua v vao S
while (k < MAX) // xac dinh n-1 duong di tu dinh v
{
// chon u sao cho: Dist[u] = min (Dist[j]), S[j]=0
j=0;
while (j<MAX && S[j]!=0) j++; // Tim S[j] = 0 dau tien
u=j;
for (j=u; j<MAX; j++)
if (S[j] == 0 && Dist[u] > Dist[j]) u=j;
//Dua u vao tap S *)
S[u]=1 ; k++;
for (w=0; w< MAX; w++)
if (S[w] == 0)
if (Dist[u]+Cost[u][w] < Dist [w])
{ Dist[w]= Dist[u]+Cost[u][w];
duongdi[w] = u; // ie : u w
}
}
for (w=0; w<MAX; w++)
if (Dist[w] < MAXINT)
cout << "\n" << v << "->" <<w <<": " << Dist[w];
else
cout << "\n" << v << "->" <<w << ": Khong co duong di";
}

Mun in l trnh ng|n nht t nh s n nh t :
printf("\nLo trinh tu %d->%d la: ", s, t);
i = t;
while(i != s)
{ printf("%d <- ", i); i = duongdi[i]; }
printf("%d", s);
V. SP TH T TOPO:
V.1. Khi nim:
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
0

Sp th t Topo l{ mt qu| trnh sp th t c|c phn t m{ trong c nh ngha
mt th t b phn, ngha l{ mt th t cho trc trn mt v{i cp c|c phn t m{
khng phi trn tt c c|c phn t.
Mt th t b phn ca mt tp hp S l{ mt quan h gia c|c phn t ca S. N
c k hiu bi <, c l{ "ng trc", v{ tha m~n ba tnh cht sau }y i vi mi
phn t ph}n bit x, y, z ca S:
(1) Nu x < y v{ y < z th x < z (tnh bc cu)
(2) Nu x < y th khng c th c y < x (tnh phn xng)
(3) Khng th c x < x (tnh khng phn x)
Thng thng, b{i to|n Topo nhm sp xp c|c phn vic trong mt cng vic
n{o cho logic, ngha l{ khi ta thc hin n phn vic th i th phi m bo ~ thc
hin c|c phn vic chun b cho n trc ri. Chng hn nh sp xp c|c tn ch mn hc
sao cho khi ng k n mn hc i th ta phi hc qua c|c mn chun b trc cho n.
V.2. Thut to|n: n gin, ta ly v d sau minh ha:
Gi s khoa cng ngh thng tin c ging dy c|c mn hc sau: i s tuyn tnh
(STT), Tin hc c bn (THCB), Lp trnh cn bn (LTCB), K thut lp trnh (KTLT), Cu
trc d liu (CTDL), Cu trc m|y tnh (CTMT), C s d liu (CSDL), Qun tr giao t|c
(QTGT), Ph}n tch & thit k h thng thng tin (PTTK), H qun tr c s d liu (HQT).
Yu cu: H~y sp xp c|c mn hc trn sao cho khi sinh vin ng k tn ch mn
hc th phi m bo c|c iu kin sau:
Mn hc C|c mn phi hc trc
i s tuyn tnh
Tin hc c bn
Lp trnh cn bn Tin hc c bn
K thut lp trnh Lp trnh cn bn, i s tuyn tnh
Cu trc d liu K thut lp trnh
Cu trc m|y tnh
C s d liu Tin hc c bn
Qun tr giao t|c C s d liu
Ph}n tch & thit k h thng thng tin
H qun tr c s d liu
C s d liu, Ph}n tch & thit k h
thng thng tin
Ta c th minh ha b{i to|n trn vi qui c:
Cung <u,v> vi u l{ mn phi hc trc mn v
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
1


Hnh 6.10 th minh ha bi ton sp th t cc mn hc tha rng buc cho
Gii thut:
(i) Ta tm nt n{o khng c cung n n th chn, sau hy tt c c|c cung t nt
i ra.
(ii) Lp li bc i cho n khi khng cn nt n{o trn th
Lu : Nu trong qu| trnh chn m{ khng tm c 1 nt khng c cung ti n th
c ngha l{ th c chu trnh. Do , khng th thc hin sp Topo c.
p dng gii thut trn vi th hnh 6.10
Nt chn th cn li
STT

THCB

STT
THCB
CTMT CSDL QTGT
HQT PTTK
LTCB CTDL
KTLT STT
THCB
CTMT CSDL QTGT
HQT PTTK
LTCB CTDL
KTLT
THCB
CTMT CSDL QTGT
HQT PTTK
LTCB CTDL
KTLT
CTMT CSDL QTGT
HQT PTTK
LTCB CTDL
KTLT
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
2

CTMT

LTCB

KTLT

CTDL

CSDL

PTTK

QTGT

HQT

V.3. C{i t: Do s nt trn th thng nhiu v{ s cung trn th tng i t
nn tit kim b nh, ta chn cu trc d liu lu tr l{ danh s|ch k; trong
mng 1 chiu cha danh s|ch c|c nt ca th, cn danh s|ch lin kt s cha c|c cung
trn th. Chng hn nh danh s|ch k ca th hnh 6.10 nh sau:
CSDL QTGT
HQT PTTK
LTCB
CTDL
KTLT
CSDL QTGT
HQT PTTK
CTDL KTLT
CSDL QTGT
HQT PTTK
CTDL
CSDL QTGT
HQT PTTK
QTGT
HQT PTTK
QTGT
HQT
HQT
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
3


Hnh 6.11 Danh sch k ca th hnh 6.10
bit c c bao nhiu cung i ti nt i, ta thm trng count v{o mng cha
danh sch cc nt.
Di }y l{ chng trnh sp Topo vi gi thit ca b{i to|n c cha trong 1 file
vn bn. File vn bn c dng sau:
S n : s nt ca th
Ma trn s biu din th
V d: File vn bn biu din th hnh 6.10 c dng:
10
0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <alloc.h>
#include <stdlib.h>
struct node
{
int dinh_ke;
STT
THCB
CTMT
LTCB
KTLT
CTDL
CSDL
PTTK
QTGT
HQT
0
0
0
1
2
1
0
2
KTLT
1
1
LTCB CSDL
KTLT
CTDL
QTGT HQT
HQT
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
4

struct node *next;
};
typedef struct node *NODEPTR;
struct phantu_ke
{
int count;
NODEPTR pF;
NODEPTR pL ;
};
typedef struct phantu_ke Dothi[100];
Dothi G;
int MAX;
void Init_graph(Dothi G)
{
for(int i=0; i< MAX; G[i++].pF=NULL);
}
void Create_graph()
{
int i,j ;
NODEPTR p;
unsigned B[100][100];
FILE *fptr;
if ( (fptr = fopen ("dt.txt", "rt")) == NULL )
{ printf("\nKhong the mo file dt.txt");
getch();
exit(0);
}
fscanf(fptr,"%d", &MAX);
for (i=0; i< MAX ; i++)
for (j=0; j<MAX; j++)
fscanf(fptr,"%d", &B[i][j]);
/// Khoi tao rong do thi
Init_graph(G);
//Tao count : so cung toi dinh j
for (j=0; j<MAX; j++)
{
G[j].count=0;
for (i=0; i< MAX; i++)
if (B[i][j] ==1) G[j].count++;
}
for (i=0; i< MAX; i++)
for (j=0;j<MAX; j++)
if (B[i][j] == 1)
{
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
5

p = (NODEPTR)malloc(sizeof(struct node));
p->next=NULL;
p->dinh_ke=j;
if( G[i].pF == NULL) G[i].pF=p;
else G[i].pL->next=p;
G[i].pL=p;
}
}
void Topo_Sort(Dothi G)
{
int Stack[100];
int i,j,k, Sp=-1 ;
NODEPTR p;
for(i=0;i<MAX; i++) // Dua vao Stack tat cac cac nut khong co cung di
// toi no
if (G[i].count==0) { // day la cac task co the lam doc lap
Stack[++ Sp]=i;
}
for( i=0; i<MAX; i++)
{
if (Sp ==-1)
{
printf("\nCo chu trinh trong do thi!!!");
exit(0);
}
j=Stack[Sp--]; printf("%5d",j); // Lay 1 nut trong Stack ra
p=G[j].pF;
while (p !=NULL)
{
k=p->dinh_ke; // k la ngon cua cung j --> k
G[k].count --;
if (G[k].count == 0) // khong co dinh nao toi nut k
{
Stack[++Sp]=k;
}
p=p->next;
}
}
}
void main()
{ clrscr();
Create_graph();
Topo_Sort(G);
getch();
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
6

}



LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
7

BI TP :
1. Vit th tc ReadGraph nhp v{o c|c nh v{ c|c cnh ca th G t 1 file
vn bn, bit rng:
- Ni dung ca file vn bn l{ nh sau:
n
u v trngs
.....
vi : n : s nt ca th G
u v trngs : chiu d{i ng i t nt u n nt v
- Cu trc d liu ca th G c s dng l{ :
a. Bng k
b. Danh s|ch k
2. Cho mt th G, vit th tc WriteGraph in c|c nh ca th, v{ c|c cnh
ca th ra m{n hnh.
3. Cho mt th G. H~y x|c nh xem gia 2 nt u v{ v c ng i hay khng?
Nu c, h~y x|c nh l trnh t nt u n nt v.
4. Cho mt th G. H~y x|c nh xem th G c lin thng hay khng ?
5. C{i t v{ kim tra th tc tm ng i ngn nht t nt u cho n nt v trong
mt th c hng. H~y x|c nh r l trnh v{ cho bit chiu d{i ng i
ngn nht l{ bao nhiu?
Minh ha c|c bc ca gii thut Dijkstra tm ng i ngn nht t nt 0 n nt
5 trn th sau:


0
1
2
5
4
3
12
25
30
20
30
24
8
0
8
0
5
0
3
0
4
0
LU NGUYN K TH CU TRC D LIU V GII THUT


P
a
g
e
1
7
8

TI LIU THAM KHO

[1] Cu trc d liu - ng dng Nguyn Hng Chng 1999
v{ c{i t bng C
[2] Cu trc d liu + Gii thut Niklaus Wirth -
= Chng trnh Ngi dch Nguyn Quc Cng
[3] Cu trc d liu Xu}n Li
[4] Cu trc d liu Nguyn Trung Trc 1992
[5] Ph}n tch v{ thit k gii thut inh Nghip 1992
H BK Tp. H Ch Minh
[6] Course 12.2AB2 Data Structures Alison Cousey 1999
and Algorithms II -
http://www.cee.hw.ac.uk/~alison/alg/lectures.html

You might also like