You are on page 1of 120

CHNG 1: GII THIU CHUNG

1.1. Gii thut v cu trc d liu:


Theo Niklaus Wirth: Gii thut + Cu trc d liu = Chng trnh. iu ny
hm rng cu trc d liu v gii thut c mi quan h mt thit vi nhau trong mt
chng trnh. Do vic nghin cu cc cu trc d liu sau ny i i vi vic xc
lp cc gii thut x l trn cc cu trc y.
1.2. Mt s vn lin quan:
La chn mt cu trc d liu thch hp t chc d liu vo ra v trn c s
xy dng c gii thut x l hu hiu nhm a ti kt qu mong mun cho bi
ton l mt khu rt quan trng.
Ta cn phn bit 2 loi quy cch d liu:
Quy cch biu din hnh thc: Cn c gi l cu trc logic ca d liu.
i vi mi ngn ng lp trnh xc nh s c mt b cu trc logic ca d liu. Mt
d liu thuc loi cu trc no cn phi c s m t kiu d liu . V d: Trong
Pascal c cc loi d liu: Array, Record, File.
Quy cch lu tr: l cch biu din mt cu trc d liu trong b nh. V
d: Cu trc d liu mng c lu tr trong b nh theo quy tc lu tr k tip. C 2
quy cch lu tr:
Lu tr trong: v d RAM.
Lu tr ngoi: v d a (disk).
1.3. Ngn ng din t gii thut: Ta chn ngn ng ta Pascal.
c im: Gn ging vi Turbo Pascal, do d dng trong vic chuyn mt
chng trnh vit bng ngn ng ta Pascal sang ngn ng Pascal.
1.3.1. Cu trc ca mt chng trnh chnh:
Program <Tn chng trnh>
S
1
;
S
2
;
...
S
3
;
End;
Nhn xt:
Chng trnh khng cn vit khai bo. Tuy nhin c th m t trc chng
trnh bng ngn ng t nhin.
Phn thuyt minh c t gia 2 du { , }.
Nu chng trnh gm nhiu bc th c th nh s th t mi bc km
li thuyt minh.
1
Cc lnh ca chng trnh dng din t gii thut
Bo kt thc chng trnh
V d:
Program Tinhgiaithua
1. Readln(n); { nhp n}
2. { Tnh p = n! }
p:=1;
for i:=1 to n do p:= p * i;
3. {In kt qu}
Writeln (p);
End.
1.3.2. Cc k t: Tng t trong Pascal:
- Cc k t trong s hc: +, -, *, /, (lu tha).
- Quan h: >, <, , , , .
1.3.3. Cc cu lnh:
- Lnh gn: V := E;
Trong : V l bin (variable), v E l biu thc (expression).
Lu : C th dng php gn chung. V d: a:=b:=1;

'

; 1 :
; 1 :
b
a
- Lnh ghp: Begin S
1
; S
2
; ...; S
n
; End;
coi nh l mt cu lnh (trong S
i
l cc cu lnh).
- Lnh If: Tng t nh lnh If ca ngn ng Pascal.
- Lnh Case: Tng t lnh Case ca Foxpro:
Case
B1: S1;
B2: S2;
B3: S3;
...
Bn: Sn;
[Else: Sn+1;]
End Case;
- Lnh lp: For, While, Repeat: Tng t nh cc lnh lp ca Pascal.
- Lnh nhy: goto n (n: s hiu / nhn ca mt bc trong chng trnh).
- Lnh vo ra: Write, Read,...: ging nh Pascal.
2
3
V d: Nhp vo im ca 2 mn hc, tnh trung bnh cng, sau xp loi.
Program Vidu_ve_Case
Readln(d1, d2);
d:=(d1+d2)/2;
Case
d < 5: Write(Yeu);
d < 6.5: Write(Trung binh);
d < 8.0: Write( Kha);
Else: Write( Gioi);
End Case;
1.3.4. Chng trnh con: C 2 dng:
a) Dng hm:
Function <Tn hm>(<danh sch tham s>)
S
1
;
S
2
;
...
S
3
;
Return Bo kt thc chng trnh con
Lu : Cc lnh bn trong chng trnh con bao gi cng c cu lnh gn m tn
hm nm bn tri. Khi c gi, hm s xut hin trong biu thc ca chng trnh
gi n.
V d: Vit chng trnh con dng hm NamNhuan(x). Cho kt qu nu s x l
nm nhun c gi tr l True, ngc li c gi tr l False; chng hn:
NamNhuan(1996) cho gi tr True, NamNhuan(1997) cho gi tr False. Bit rng x
c gi l nm nhun nu x chia ht cho 4 v x khng chia ht cho 100 hoc x chia
ht cho 400.
Cch 1:
Function NamNhuan(x)
If ((x mod 4 = 0) and (x mod 100 <> 0)) or
(x mod 400 = 0) then NamNhuan:=True
Else NamNhuan:=False;
Return
Cch 2:
Function NamNhuan(x)
NamNhuan:=((x mod 4 = 0) and (x mod 100 <> 0)) or
(x mod 400 = 0);
Return
4
b) Dng th tc:
Procedure <Tn th tc>(<danh sch cc tham s>)
S
1
; S
2
; ....; S
n
;
Return
Lu : Li gi th tc c dng: Call <Tn th tc>(<danh sch tham
s thc>) hoc khng cn ghi t kha Call.
V d: Vit th tc HoanDoi(a, b) hon i gi tr ca 2 bin s a v b cho
nhau.
Cch 1: Procedure HoanDoi(a, b); {a v b l cc tham
bin}
tam:=a;
a:=b;
b:=tam;
Return
Cch 2: Procedure HoanDoi(a, b);
a:= a+b;
b:= a-b;
a:= a-b;
Return
Lu : Bn trong 1 chng trnh con c th dng lnh Exit (thot khi chng
trnh con), Halt (thot khi chng trnh chnh).
5
CHNG 2: THIT K V PHN TCH GII THUT
2.1. Thit k gii thut:
2.1.1. Module ho gii thut:
Cc bi ton ngy cng a dng v phc tp. Do gii thut m ta xut
cng c quy m ln v vic vit chng trnh cn c mt lc lng lp trnh ng o.
Mun lm c vic ny , ngi ta phn chia cc bi ton ln thnh cc bi ton nh
(module). V d nhin mt module c th chia nh thnh cc module con khc na,...
by gi vic t chc li gii s c th hin theo mt cu trc phn cp.
V d:
Qu trnh module ho bi ton c xem l nguyn l chia tr (divide and
conquer) hay cn gi l thit k t nh xung (top-down) hoc l thit k t khi qut
n chi tit (specialization).
Vic module ho trong lp trnh th hin :
Cc chng trnh con. Chng hn, Procedure, Function trong Pascal.
Cm cc chng trnh con xung quanh mt cu trc d liu no . Chng hn,
Unit trong Pascal.
V d: Chng trnh qun l u sch ca mt th vin nhm phc v c gi tra
cu sch. C th, gi s ta c mt file d liu gm cc bn ghi v cc thng tin lin
quan n mt u sch nh: tn sch, m s, tc gi, nh xut bn, nm xut bn, gi
tin, ...
Yu cu:
- Cp nht d liu.
- Tm kim.
- In n.
6
A
B C
E F G H I
D
Chng trnh
qun l sch
Cp nht DL Tm kim In n
B sung Sa Xo Xem tt
c
Tra
cu
Th
sch
Thng k
Theo m Theo ngy
nhp
Nhn xt:
- Vic module ho lm cho bi ton c nh hng r rng.
- Bng cch ny, ngi ta c th phn chia cng vic cho i ng lp trnh.
- y l mt cng vic mt nhiu thi gian.
2.1.2. Phng php tinh chnh tng bc:
Phng php tinh chnh tng bc l phng php thit k gii thut gn lin
vi lp trnh. N phn nh tinh thn ca qu trnh module ho v thit k gii thut
theo kiu top-down.
Xut pht t ngn ng t nhin ca gii thut, gii thut s c chi tit ho
dn dn v cui cng cng vic x l s c thay th dn bi cc cu lnh (ca mt
ngn ng lp trnh no ). Qu trnh ny l tr li dn dn cc cu hi: What? (lm
g?), How (lm nh th no?)
V d: Gii h phng trnh: a
11
x
1
= b
1
a
21
x
1
+a
22
x
2
= b
2
....
a
n1
x
1
+ a
n2
x
2
+ ... +a
nn
x
n
= b
n
- Nhp cc h s: Nhp b
i
(i =
n , 1
), nhp a
ij
(i =
n , 1
; j =
i , 1
).
Readln(n);
For i:=1 to n do
Begin
Readln(b[i]);
For j:=1 to i do
Readln(a[i, j]);
End;
- T phng trnh trn ta suy ra:
x[1]:=b[1]/a[1, 1];
For i:=2 to n do
Begin
s:=0;
For j:=1 to i-1 do s:=s+a[i, j]*x[j];
x[i]:=(b[i]-s)/a[i, i];
Writeln(x[i]);
End;
7
( )
( )
ii
i i i i i i
i
a
x a x a b
x
1 1 1
+ +

2.2. Phn tch gii thut: Cht lng ca mt chng trnh hay gii thut bao
gm:
- Tnh ng n.
- Tnh n gin (d hiu, d qun l, d lp).
- Tnh ti u (hiu qu) v mt thi gian cng nh khng gian nh.
2.2.1. Tnh ng n:
y l mt yu cu phn tch quan trng nht cho mt gii thut. Thng
thng, ngi ta th nghim (test) nh mt s b d liu no cho chy chng
trnh ri so snh kt qu th nghim vi kt qu m ta bit. Tuy nhin, theo
Dijkstra: Vic th nghim chng trnh ch chng minh s c mt ca li ch khng
chng minh s vng mt ca li.
Ngy nay, vi cc cng c ton hc ngi ta c th chng minh tnh ng n
ca mt gii thut.
2.2.2. Mu thun gia tnh n gin v tnh hiu qu:
Mt gii thut n gin (d hiu) cha hn ti u v thi gian v b nh. i vi
nhng chng trnh ch dng mt vi ln th tnh n gin c th coi trng nhng nu
chng trnh c s dng nhiu ln (v d, cc phn mm) th thi gian thc hin r
rng phi c ch .
Yu cu v thi gian v khng gian t khi c mt gii php trn vn.
2.2.3. Phn tch thi gian thc hin gii thut:
Thi gian thc hin gii thut ph thuc vo nhiu yu t:
+ Kch thc d liu a vo (dung lng). Nu gi n l kch thc d liu vo
th thi gian thc hin mt gii thut, k hiu l T(n).
+ Tc x l ca my tnh, b nh (RAM).
+ Ngn ng vit chng trnh.
Tuy nhin, ta c th so snh thi gian thc hin ca hai gii thut khc nhau.
V d: Nu thi gian thc hin ca gii thut th nht T
1
(n) = Cn
2
(C: hng
dng) v thi gian thc hin gii thut th hai T
2
(n) = Kn (K: hng) th khi n kh ln,
thi gian thc hin gii thut 2 s ti u hn so vi gii thut 1.
Cch nh gi thi gian thc hin gii thut theo kiu trn c gi l nh gi
thi gian thc hin gii thut theo phc tp tnh ton ca gii thut.
2.2.3.1. phc tp tnh ton ca gii thut:
Nu thi gian thc hin mt gii thut l T(n) = Cn
2
(C: hng), th ta ni rng:
phc tp tnh ton ca gii thut ny c cp l n
2
v ta k hiu T(n) = O(n
2
).
Tng qut: T(n) = O(g(n)) th ta ni phc tp ca gii thut c cp l g(n).
8
2.2.3.2. Xc nh phc tp ca gii thut:
Vic xc nh phc tp tnh ton ca mt gii thut ni chung l phc tp.
Tuy nhin, trong thc t phc tp ca mt gii thut c th c xc nh t
phc tp tng phn ca gii thut. C th, ta c mt s quy tc sau:
- Quy tc tnh tng:
Nu chng trnh P c phn tch thnh 2 phn: P
1
, P
2
v nu phc tp ca
P
1
l T
1
(n) = O(g
1
(n)) v phc tp ca P
2
l T
2
(n) = O(g
2
(n)) th phc tp ca P
l: T(n) = O(g
1
(n) + g
2
(n)) = O(max(g
1
(n), g
2
(n))).
V d: g
1
(n) = n
2
, g
2
(n) = n
3
. Suy ra: T(n) = O(n
3
).
Lu : Nu g
1
(n) g
2
(n), n n
0
th O(g
1
(n) + g
2
(n)) = O(g
2
(n))
V d: O(n + log
2
n) = O(n)
- Quy tc nhn:
Nu phc tp ca P
1
l O(g
1
(n)), phc tp ca P
2
l O(g
2
(n)) th phc tp
tnh ton ca P
1
lng P
2
l O(g
1
(n).g
2
(n)).
Lu :
+ Cu lnh gn, Read, Write, If c thi gian thc hin bng hng s C = O(1).
+ Cu lnh lp trong vng g(n) ln th s c thi gian thc hin l O(g(n)).
+ O(Cg(n)) = O(g(n)) (C: hng)
V d:
1) Cu lnh: For i:=1 to n do { O(n) }
P:=P*i; { O(1) }
c thi gian thc hin l: O(n*1) = O(n).
2) For i:=1 to n do
For j:=1 to n do x:=x+1;
c thi gian thc hin l: O(n*n*1) = O(n
2
).
+ Thng thng, xc nh phc tp tnh ton ca mt gii thut, ngi ta i
tm mt php ton c s ln thc hin l nhiu nht (gi l php ton tch cc) t
tnh s ln thc hin ny. Nu s ln thc hin ca php ton tch cc l g(n), th
phc tp tnh ton ca gii thut l O(g(n)).
+ C khi thi gian thc hin mt gii thut cn ph thuc vo c im ca d
liu. By gi T(n) trong trng hp thun li nht c th khc T(n) trong trng hp
xu nht. Tuy nhin, thng thng ngi ta vn nh gi phc tp tnh ton ca
gii thut thng qua T(n) trong trng hp xu nht.
9
V d: Cho mt dy gm c n phn t mng: V[1], V[2], ..., V[n]. X l mt gi tr
cho trc.
Procedure TimKiem(X);
Found:=False;
i:=1;
While (i<= n) and (not Found) do
If V[i]=X then
Begin
Writeln(i); Found:=True;
End
Else i:=i+1;
If not Found then Write(Khng c);
Return
Khi : T(n) thun li = O(1) (vi X = V[1])
T(n) xu nht = O(n) (vi X V[i], i)
Nn: T(n) = O(n)
C trng hp ngi ta nh gi da vo T(n) trung bnh so snh thi gian
thc hin ca 2 gii thut no , bi v c chng trnh chy rt hiu qu trn d liu
c c im ny nhng khng hiu qu trn d lu c c im khc.
10
CHNG 3: QUY
3.1. i cng:
- Chng trnh quy l chng trnh gi n chnh n.
V d: Mt hm quy l mt hm c nh ngha da vo chnh n.
- Trong l thuyt tin hc, ngi ta thng dng th thut quy nh ngha
cc i tng.
V d: Tn bin trong Pascal chun c nh ngha nh sau:
- Mi ch ci l mt tn.
- Nu t l tn bin th t <ch ci>, t <ch s> cng l tn bin.
- Mt chng trnh quy hoc mt nh ngha quy th khng th gi n
chnh n mi mi m phi c mt im dng n mt trng hp c bit no , m
ta gi l trng hp suy bin (degenerate case).
V d: Cho s t nhin n, ta nh ngha n! nh sau:
n! =

'

1 0!
1)! - (n * n
- Li gii quy: Nu li gii ca mt bi ton T no c thc hin bng
mt li gii ca bi ton T' c dng ging nh T, nhng theo mt ngha no T' l
"nh hn" T v T' c khuynh hng ngy cng tip cn vi trng hp suy bin.
V d: Cho dy cc phn t mng V[1], V[2], ..., V[n] c sp xp theo th
t tng dn, gi X l mt gi tr bt k. Vit gii thut tm kim in v tr ca phn t
no trong mng c gi tr bng X (nu c). Ngc li, thng bo khng c.
Procedure TimKiem(d, c, X)
If d>c then Writeln('Khong co')
Else
Begin
g:=(d+c) div 2;
If X=V[g] then Writeln(g)
Else If X<V[g] then TimKiem(d, g-1, X)
Else TimKiem(g+1, c, X);
End;
Return;
Nhn xt:
11
Bi ton tm kim ban u c tch thnh cc bi ton tm kim vi phm vi
nh hn cho n khi gp phi cc trng hp suy bin. Chnh vic phn tch , ngi
ta xem gii thut quy l gii thut th hin phng php "chia tr".
Nu th tc hoc hm cha li gi n chnh n (v d trn) th c gi l
quy trc tip. Ngc li, c th tc cha li gi n th tc khc m th tc ny
cha li li gi n n th c gi l quy gin tip, hay cn gi l quy tng h
(trong Pascal, dng t kha Forward).
V d:
Program VD_Forward;
Procedure Ong(n: Byte); Forward;
Procedure Ba(n: Byte);
Begin
Writeln(n, 'Ba');
If n>0 then Ong(n-1);
End;
Procedure Ong(n: Byte);
Begin
Writeln(n, 'Ong');
If n>0 then Ba(n-1);
End;
BEGIN
Ong(3);
END.
Kt qu: 3 Ong
2 Ba
1 Ong
0 Ba
3.2. Phng php thit k mt gii thut quy:
- Tham s ho bi ton.
- Phn tch trng hp chung (a bi ton di dng bi ton cng loi nhng
c phm vi gii quyt nh hn theo nghi dn dn s tin n trng hp suy bin).
- Tm trng hp suy bin.
V d:
1) Lp hm GT(n) = n!
Function GT(n);
12
If n=0 then GT:=1
Else GT:=n*GT(n-1);
Return;
2) Dy s Fibonaci: F
1
= F
2
= 1;
F
n
= F
n-1
+ F
n-2.
(n 3)
Function F(n);
If n 2 then F:=1
Else F:= F(n-1)+F(n-2);
Return;
Nhn xt:
- Thng thung thay v s dng li gii quy cho mt bi ton, ta c th thay
th bng li gii khng quy (kh quy) bng phng php lp.
- Vic s dng gii thut quy c:
u im Khuyt im
+ Thun li cho vic biu din bi ton. + C khi khng c ti u v thi gian.
+ Gn (i vi chng trnh). + C th gy tn b nh
- Chnh v vy, trong lp trnh ngi ta c trnh s dng th tc quy nu thy
khng cn thit.
Bi tp:
1) Vit hm lu tha lt(x: real; n: byte): real; cho ra gi tr x
n
.
2) Vit chng trnh nhp vo s nguyn ri o ngc s li (khng c
dng phng php chuyn s thnh xu).
3) Vit chng trnh cho php sn sinh v hin th tt c cc s dng nh phn
di n (c n ch s).
V d 1: Vit th tc in xu o ngc ca xu X.
Cch 1:
- Trng hp chung: + In k t cui ca xu X.
+ o ngc phn cn li.
- Trng hp suy bin: Nu xu rng th khng lm g ht.
Procedure InNguoc(X);
If X <> '' then
Begin
Write(X[Length(X)]);
InNguoc(Copy(X, 1, Length(X)-1));
End;
Return;
Cch 2:
13
- Trng hp chung: + o ngc xu X b k t u tin.
+ In k t u tin ca X.
- Trng hp suy bin: Nu xu rng th khng lm g ht.
Procedure Innguoc(X);
If X<>'' then
Begin
InNguoc(Copy(X, 2, Length(X)-1);
Write(X[1]);
End;
Return;
V d 2: Bi ton thp H ni: Cho ba cc A, B, C; c n a khc nhau c xp
theo th t nh trn ln di nm trn cc A. Yu cu: Chuyn chng a t cc A
sang cc C vi iu kin:
- Mi ln ch c chuyn mt a.
- Khng c trng hp a ln c t trn a nh.
- C th dng cc B lm cc trung gian.
Tham s ho bi ton: HaNoi(n, A, B, C) { A, B, C: char}
Trong : n: S a.
A: Cc ngun cn chuyn a i.
B: Cc trung gian.
C: Cc ch chuyn a n.
Chng trnh chnh nh sau:
Program Thap_HN;
Readln(n);
A:= 'A'; B:= 'B'; C:= 'C';
HaNoi(3, A, B, C);
End.
* Gii thut quy:
- Trng hp suy bin:
Nu n = 1 th chuyn a t cc A qua cc C { Writeln(A, '', C) }
- Trng hp chung (n 2):
Th vi n=2: + Chuyn a th nht t A sang B.
+ Chuyn a th 2 t A sang C.
+ Chuyn a th nht t B sang C.
Tng qut: + Chuyn (n -1) a t A sang B (C lm trung gian).
+ Chuyn 1 a t A sang C (B: trung gian)
+ Chuyn (n -1) a t B sang C (A: trung gian).
Suy ra gii thut quy:
14
Procedure HaNoi(n, A, B, C);
If n=1 then Write(A, '', C)
Else
Begin
HaNoi(n -1, A, C, B); {I}
HaNoi(1, A, B, C); {II}
HaNoi(n -1, B, A, C); {III}
End;
End;
3.3. Gii thut quay lui:
Ta c th dng k thut quy din t gii thut quay lui. Bi ton s dng
gii thut quay lui thng c dng: Xc nh mt b gm n thnh phn: x
1
, x
2
,..., x
n
tho mn iu kin B no .
Phng php ca gii thut quay lui:
- Gi s ta xc nh c i-1 thnh phn: x
1
, x
2
,..., x
i-1
. xc nh thnh phn
x
i
, ta duyt tt c cc kh nng c th c ca n.
V d: x
i
c th c gi tr t 1 n 8; gi j l cc gi tr c th c ca x
i
, lc ta
dng cu lnh For nh sau: For j:=1 to 8 do ...
- By gi, vi mi kh nng j ta lun kim tra xem j c c chp nhn khng?
(liu b (x
1
, x
2
, , x
i
) hin ti c tho mn iu kin B hay khng?)
* Nh vy, xy ra 2 trng hp:
+ Nu chp nhn j:
Xc nh xi theo j: xi:=j;
Sau , nu i cn nh hn n th ta tin hnh xc nh xi+1.
Ngc li (i = n) th ta c mt li gii.
Kim tra j tip theo.
+ Nu tt c cc kh nng ca j khng c kh nng no c chp nhn th quay
li bc trc xc nh li xi-1. (C ch hot ng trong b nh ca gii thut
quy gip c th thc hin c iu ny).
* Vic xc nh xi c th m t qua th tc quy sau:
Procedure Try(i); {Th xem x
i
s nhn gi tr no}
For mi kh nng j ca x
i
do
Begin
If <Chp nhn> then
Begin
<Xc nh x
i
theo j>; { V d: x[i]:=j; }
If i=n then <Ghi nhn mt li gii>;
Else Try(i+1);
15
End;
End;
Return;
16
Bi tp:
1) Vit hm lu tha lt(x: real; n: byte): real; cho ra gi tr x
n
.
2) Vit chng trnh nhp vo s nguyn ri o ngc s li (khng c
dng phng php chuyn s thnh xu).
3) Vit chng trnh cho php sn sinh v hin th tt c cc s dng nh phn
di n (c n ch s).
Bi tp:
14) Tm tt c cc hon v ca mt mng gm c n phn t.
52) Bi ton 8 con hu: Hy tm cch t 8 qun hu trn mt bn c vua sao
cho khng c qun hu no c th n cc qun hu khc.
17
CHNG 4: MNG V DANH SCH TUYN TNH
4.1. Mng v cu trc lu tr ca mng:
- Mng l cu trc d liu n gin v thng dng trong nhiu ngn ng lp
trnh.
- Mng l mt tp c th t gm mt s c nh cc phn t c cng quy cch.
V d: Trong Pascal, khai bo mt dy s nguyn cc phn t: a1, a2,..., an
(vi n 100), ta khai bo mng A nh sau:
Var A: array [1..100] of integer;
Lc ny, vic truy xut s thng qua cc phn t ca mng, k hiu: a[1],
a[2],...a[100].
- Ma trn l mt mng 2 chiu.
V d: Var B: array [1..10, 1..10] of real;
Khi , B[i, j] l mt phn t ca ma trn B. Trong i l hng cn j l ct.
- Tng t ta cng c mng 3 chiu, mng 4 chiu.
Cu trc lu tr:
Cch lu tr mng thng thng (i vi mi ngn ng lp trnh) l lu tr
theo kiu k tip.
V d: Gi a l mng 1 chiu gm c n phn t, mi phn t c di l d
(chim d byte) v c lu tr k tip nh hnh di y:
d d
a
1
a
2
........... a
n
Loc (a
1
): a ch phn t a
1
Suy ra a ch ca phn t th a
i
:
Loc (a
i
) = Loc (a
1
) + d*(i-1)
Lu :
- Nu ch s u tin ca mng l ch s j no (v d, a: array[5..10])
th:
Loc (a
i
) = Loc (a
j
) + d*(i-j)
- i vi mng nhiu chiu, vic t chc lu tr cng c thc hin tng t:
V d: a: array[1..3, 1..2] of byte;
a
11
a
12
a
21
a
22
a
31
a
32
a ch ca phn t a
ij
:
Loc (a[i, j]) = Loc (a[1,1]) + d*((i-1)*n + (j-1))
Trong , n l s ct ca ma trn.
18
Bi tp:
1) Vit cng thc tng qut tnh a ch ca mt phn t no ca mt
mng n chiu (Loc a[i
1
, , i
n
]), vi ch s cc chiu ny ln lt l: b
1
..b'
1
, b
2
..b'
2
,....,
b
n
..b'
n
; trong : i
1
[b
1
..b'
1
], i
2
[b
2
..b'
2
], , i
n
[b
n
..b'
n
]. a ch ny ph thuc vo
a ch ca ch s u tin a[b
1
, b
2
,.., b
n
]. Cho d l di ca mt phn t.
Lu : Do cc phn t ca mng thng c lu tr k tip nhau nn vic truy
nhp vo chng nhanh, ng u vi mi phn t (u im). Trong lc , nhc
im ca vic lu tr mng l:
+ Phi khai bo ch s ti a, do c trng hp gy lng ph b nh.
+ Kh khn trong vic thc hin php xo / chn mt phn t trong mng.
2) Gi s trong b nh c mng a gm n phn t a
1
, a
2
, ... ,a
n
.
Hy vit cc th tc sau:
+ Procedure Xoa(i): Xo phn t th i trong mng ny.
+ Procedure ChenSau(i, x): Chn sau phn t th i mt phn t c gi tr l x.
4.2. Danh sch tuyn tnh (Linear list):
nh ngha:
Danh sch tuyn tnh l mt dy c th t a
1
, a
2
,..., a
n
vi n0. Nu n=0 c
gi l danh sch rng. Ngc li: a
1
c gi l phn t u tin, a
n
c gi l phn
t cui cng, v n c gi l chiu di ca danh sch.
- i vi danh sch tuyn tnh, vi mi phn t a
i
(i =
1 - n 1,
) th c phn t tip
theo l a
i+1
v vi mi phn t a
i
(i =
n 2,
) th c phn t ng trc l a
i 1
.
- Danh sch tuyn tnh khc c bn vi mng mt chiu ch l kch thc ca
danh sch khng c nh bi v php b sung v php loi b thng xuyn tc ng
ln mt danh sch. V d: Stack.
- C nhiu cch lu tr mt danh sch tuyn tnh:
+ Lu tr theo a ch k tip bng mng 1 chiu.
+ Lu tr a ch bng con tr (s dng danh sch mc ni).
+ Lu tr ra file (s dng b nh ngoi).
- Vi danh sch tuyn tnh, ngoi php b sung v loi b cn c mt s php
sau:
+ Php ghp 2 hoc nhiu danh sch thnh mt danh sch (xem nh bi
tp, lm trn mng v tr).
1 2 ..............
.
m .......
....
n
1 2 ..............
..
n
+ Php tch (tch mt danh sch thnh 2 danh sch).
19
+ Sao chp mt danh sch ra nhiu danh sch (2 danh sch).
+ Cp nht hoc sa i ni dung cc phn t ca danh sch.
+ Sp xp cc phn t trong danh sch theo th t n nh trc.
+ Tm kim mt phn t trong danh sch tho mn mt iu kin cho
trc.
4.3. Ngn xp (Stack):
4.3.1. nh ngha:
Stack l mt kiu danh sch tuyn tnh c bit, trong php b sung v loi b
ch thc hin mt u gi l nh Stack (u kia gi l y ca Stack).
Nguyn tc b sung v loi b i vi Stack c gi l nguyn tc vo sau ra
trc (LIFO Last In First Out).
4.3.2. Lu tr Stack bng mng:
V Stack l mt danh sch tuyn tnh nn c th s dng mng 1 chiu t chc
mt Stack. Chng hn: s dng mng S lu tr dy cc phn t: S[1], S[2],..., S[n]
(n gi l s phn t cc i ca mng S).
Gi T l ch s ca phn t nh ca Stack. T c s dng theo di v tr nh
ca Stack nn nu s dng danh sch mc ni t chc mt Stack th T c xem
nh l mt con tr ch vo v tr nh ca Stack.
Gi tr ca T s tng ln mt n v khi b sung mt phn t vo danh sch v s
gim bt 1 khi loi b mt phn t ra khi Stack.
S[n]

S[T]

S[2]
S[1]
Lu :
- Khi T = n th khng th b sung thm (hay ni cch khc l Stack y).
- Khi T = 0 th khng th loi b phn t v khi Stack rng (hay Stack cn).
Gii thut b sung mt phn t x vo Stack S c nh l T:
Procedure Push(S, T, X); {T: tham bin}
If T=n then Write('Khng b sung c')
Else
Begin
T:=T+1;
S[T]:=X;
End;
Return;
20
T
Gii thut loi b khi Stack S phn t ti nh T v gn gi tr ca phn t
cho tham bin X:
Procedure Pop(S, T, X); { T, X: tham bin}
If T=0 then Write('Stack cn')
Else
Begin
X:= S[T];
T:=T-1;
End;
Return;
Bi tp:
Gi s ta c mng S dng lu tr ng thi hai Stack nh hnh di y:
Stack 1 Stack 2
1 2 3 .............. n
-1
n
Trong :
+ T
1
dng theo di v tr nh ca Stack 1 (y l phn t s 1 ca mng S).
+ T
2
dng theo di v tr nh ca Stack 2 (y l phn t n ca mng S).
=> Nu T
2
= T
1
+ 1 th ngng, lc ny c hai Stack cng y.
Vit cc th tc sau:
1) Procedure Bosung(i, x);
Dng b sung vo Stack i (i =
2 , 1
) mt phn t x.
2) Procedure Loaibo (i, x);
Dng loi b 1 phn t ra khi Stack i (i =
2 , 1
) v tr v phn t ny cho
tham bin x.
4.3.3. Cc v d:
V d 1: Vit chng trnh i mt s h thp phn thnh s h nh phn.
Procedure Chuyen;
11. Readln (n); T:=0;
22. While n<>0 do
Begin
r:= n mod 2;
Push(S, T, r); {Push(S, T, n mod 2) nu r l tham tr}
n:= n div 2;
End;
3. While T<>0 do
Begin
Pop(S, T, r);
Write(r);
End;
Return; { Lu : S: array [1..100] of 0..1 }
21
T
2
T
1
V d 2: Vit chng trnh tnh gi tr ca mt biu thc hu t (tc l k php
Ba Lan o).
Mt s khi nim:
- Biu thc s hc m ta thng s dng c gi l biu thc trung t. y,
ta coi cc thnh phn (token) c trong mt biu thc trung t bao gm: hng s (ton
hng), ton t (+, -, *, /), cc du ngoc: (, ).
- Biu thc s hc cn c th biu din di dng k php hu t (biu thc hu
t) v k php tin t (biu thc tin t).
V d: 2 + 3 biu thc trung t.
2 3 + biu thc hu t (cc ton t i sau cc ton hng).
+ 2 3 biu thc tin t (cc ton t i trc cc ton hng).
- Vi cc k php mi ny (k php Ba Lan), du ngoc l khng cn thit.
V d: 7 + 3 * 5 7 3 5 * +
7 * 3 + 5 7 3 * 5 +
7 * (3 + 5) 7 3 5 + *
(1 + 5) * ( 8 - (4 - 1)) 1 5 + 8 4 1 - - *
- Cch tnh gi tr mt biu thc hu t: Biu thc cn tnh c c t tri sang
phi cho ti khi tm ra 1 ton t. Hai ton hng c c gn nht (trc ton t ny)
s c thc hin vi nhau bi ton t thay bng mt ton hng mi. Qu trnh
ny li tip tc cho n khi c c kt qu cui cng.
Gii thut:
1) T:=0;
2) Repeat
c token X tip theo trong biu thc;
If <X l s> then Push(S, T, X);
If <X l ton t> then
Begin
Pop(S, T, Y);
Pop(S, T, Z);
Tc ng ton t X vo Y v Z ri gn kt qu cho W
Push(S, T, W);
End;
Until <Khng cn token no na>;
3) Pop(S, T, X);
4) Write(X);
Bi tp:
1) Chuyn gii thut trn thnh chng trnh Pascal.
2) Nhp xu c ni dung l biu thc hu t, cc token cch nhau 1 trng.
Vit chng trnh tnh kt qu ca biu thc va nhp.
22
V d 3: Vit chng trnh chuyn biu thc trung t sang hu t.
Gii thut:
1) Khi to Stack cha cc k t ton t c nh l T:
T:=0; { S: array [1..100] of char +, -, *, /, ( }
Khi to xu biu thc hu t:
Xau:=;
2) Repeat
<c mt token biu thc trung t t tri sang phi;>
Case
<Token l ton hng>:
{ Cng vo bn phi ca xu (km khong trng). }
Xau:=Xau + Token + ;
<Token l ton t>:
If <Stack rng> then <Push Token ny>
Else
Begin
{ So snh token ny vi ton t nh Stack; }
If <Token > ton t nh Stack> then
<Push Token ny>;
Else
Begin
-<Lp vic Pop cc ton t nh Stack cng vo bn phi
ca xu (tr du ( ) cho ti khi Token > ton t nh
hoc Stack rng>;
-<Push Token ny;>
End;
End;
<Token l (>: <Push Token ny>;
<Token l )>:
<Lp vic Pop cc ton t nh Stack cng vo
bn phi ca xu (tr du ngoc m) cho ti khi gp du ngoc
m.>
End Case;
Until <Ht chui biu thc trung t>;
3) Pop cc phn t cn li trong Stack vo bn phi ca
xu cho n khi Stack rng ri a vo bn phi xu.
4) Write(Xu);
23
Bi tpthc hnh s 1:
Nhp mt xu c ni dung l biu thc trung t. Tnh kt qu biu thc ny.
Ch : Cc ton t: *, /, +, -, (, ). Dng hm tr v th t u tin so snh:
* hay / tr v 2.
+ hay - tr v 1.
( hay ) tr v 0.
24
Li gii tham kho chng trnh tnh kt qu biu thc hu t:
Program Tinh_bieu_thuc_hau_to;
uses crt;
var a:array[1..200]of REAL;
s,s1,STRI:string;
n:byte;
function uutien(x:char):byte;
begin
if (x in ['(',')']) then uutien:=0
else if (x='*')or(x='/') then
uutien:=2 else
uutien:=1;
end;
function laytu(s2:string;var i:byte):string;
var j:byte;
begin
j:=i;
while s2[j]<>' ' do inc(j);
laytu:=copy(s2,i,j-i);
i:=j;
end;
procedure thuchien;
var x:string;t:byte;kt,y,z:REAL;ER:INTEGER;
begin
t:=0; n:=0;
s:=s+' ';
repeat
inc(n);
x:=laytu(s,n);
val(x,y,er);
if er=0 then
begin
inc(t);
val(x,a[t],er);
end
else
25
begin
y:=a[t];
dec(t);
z:=a[t];
dec(t);
if x='+'then kt:=y+z;
if x='-'then kt:=z-y;
if x='*'then kt:=y*z;
if x='/'then kt:=z / y;
inc(t);
a[t]:=kt;
end;
until n=length(s);
y:=a[t];
writeln(y:5:5);
end;
begin
CLRSCR;
WRITELN('NHAP VAO XAU HAU TO:');
READLN(s);
thuchien;
readln
end.
Li gii tham kho chng trnh tnh kt qu biu thc trung t:
Program Tinh_bieu_thuc_trung_to;
uses crt;
var a:array[1..200]of real;
s,s1,STRI:string;
n:byte;
function uutien(x:char):byte;
begin
if (x in ['(',')']) then uutien:=0
else if (x='*')or(x='/') then
uutien:=2 else
uutien:=1;
end;
26
function laytu(s2:string;var i:byte):string;
var j:byte;
begin
j:=i;
while (s2[j]<>' ')do inc(j);
laytu:=copy(s2,i,j-i);
i:=j;
end;
procedure chuyen;
var t:byte;stack:array[1..100]of char;
token:string;
er:integer;ktt:real;
begin
write('Nhap vao xau trung to:');readln(s1);
token:='';
{s1:='1 + 2 * 3 - 3 * ( 1 + 1 )'; }
s1:=s1+' ';
t:=0;
STRI:='';
n:=0;
repeat
inc(n);
token:=laytu(s1,n);
val(token,ktt,er);
if er=0 then STRI:=STRI+token+' ' else
if n>length(s1) then
begin
writeln('bieu thuc sai, dung chuong trinh');
readln;
halt;
end;
if(token='*')or(token='+')or(token='')or
(token='/') then
begin
if t=0 then
begin
inc(t);
27
stack[t]:=token[1];
end
else
begin
if
uutien(token[1])>uutien(stack[t]) then
begin
inc(t);
stack[t]:=token[1];
end
else
begin
repeat {WHILE
(T<>0)AND(UUTIEN(TOKEN[1])<=UUTIEN(STACK[T]))DO}
BEGIN
if stack[t]<>'(' then
STRI:=STRI+stack[t]+' ';
dec(t);
END;
until (t=0)or
(uutien(token[1])>uutien(stack[t]));
inc(t);
stack[t]:=token[1];
end;
end;
end;
if token='(' then
begin
inc(t);
stack[t]:=token[1];
end;
if token=')' then
repeat
if stack[t]<>')' then
STRI:=STRI+stack[t]+' ';
dec(t);
until stack[t]='(';
until n=length(s1);
28
{=======================---------------------}
repeat
if stack[t]<>'(' then
STRI:=STRI+stack[t]+' ';
dec(t);
until t<=0;
writeln(STRI);
end;
{-------------------------------------------------}
procedure thuchien;
var x:string;t:byte;er:integer;p,q,kt,y,z:real;
begin
t:=0; n:=0;
s:=s+' ';
repeat
inc(n);
x:=laytu(s,n);
val(x,p,er);
if er=0 then
begin
inc(t);
val(x,p,er);a[t]:=p
end
else
begin
y:=a[t];
dec(t);
z:=a[t];
dec(t);
if x='+'then kt:=y+z;
if x='-'then kt:=z-y;
if x='*'then kt:=y*z;
if x='/'then kt:=z / y;
inc(t);
a[t]:=kt;
end;
until n=length(s);
y:=a[t];
29
writeln('KET QUA LA: ',y:5:4);
end;
begin
CLRSCR;
writeln('CHUONG TRINH TINH MOT BIEU THUC:');
WRITELN('YEU CAU PHAI NHAP SAO CHO DUNG BIEU
THUC:');
textcolor(green);
writeln(' Nhap bieu thuc sao cho cac so,dau,ngoac
phai cach nhau');
writeln(' mot dau cach moi thuc hien duoc, con
doi voi so am thi');
writeln(' viet dau tru dang truoc so do');
textcolor(white);
chuyen;
s:=stri;
thuchien;
readln
end.
30
4.3.4. Stack vi vic ci t gii thut quy:
Vic ci t mt gii thut quy c t chc trong b nh di dng Stack.
C th: Khi mt chng trnh con quy c gi t chng trnh chnh th ta ni
chng trnh con c thc hin mc 1. V trong chng trnh con, gp li gi ca
chnh n th chng trnh con ln lt c thc hin cc mc 2, mc 3, ..., mc k
(mc k phi c hon thnh xong th mc k-1 mi c thc hin tip).
Khi t mc i i su vo mc i+1 th c th c mt s tham s, bin cc b, a
ch quay lui ng vi mc i s c bo lu khi quay v chng s c khi phc
tip tc s dng.
Nhng tham s ca bin cc b, nhng a ch quay lui c bo lu sau th n
li c khi phc trc.
S dng Stack trong vic ci t chng trnh con quy theo hnh thc sau:
Khi c li gi n chnh n th Stack s c b sung mt phn t ( l mt
record gm cc trng: tham s, bin cc b, a ch quay lui).
Khi thot khi mt mc th 1 phn t nh Stack s c ly ra (khi phc li
gi tr cn thit trc y).
Ta c th tm tt cc bc ny nh sau:
Bc 1: Bc m u (bn cht l Push): Bo lu tham s, bin cc b v a
ch quay lui.
Bc 2: Bc thn.
Chia lm 2 trng hp:
Nu gp trng hp suy bin th thc hin phn kt thc. Chuyn ti bc 3.
Nu ngc li th thc hin phn tnh tng phn v chuyn sang bc 1.
Bc 3: Bc kt thc. Khi phc li tham s, bin cc b v a ch quay lui
(pop). V chuyn n a ch quay lui ny.
Ch : Da vo nguyn tc ny m Stack thng c s dng bin i mt
gii thut quy thnh mt gii thut khng quy.
V d 1: Bi ton thp H Ni:
Type Rec = Record
nn: Byte;
aa, bb, cc: Char;
End;
Var T: Byte;
a, b, c: char;
r: Rec;
S: Array[1..100] of Rec;
rr: Rec;
31
Procedure BoVao(r: Rec; n: Byte; a, b, c: Char);
Begin
r.nn:= n; r.aa:=a; r.bb:=b; r.cc:=c;
T:=T+1; S[T]:=r;
End;
Procedure LayRa(var r: Rec);
Begin
r:=S[T];
T:=T-1;
End;
BEGIN
Readln(n);
a:=A; b:=B; c:=C;
T:=0;
BoVao(r, n, a, b, c);
Repeat
LayRa(rr);
If rr.nn=1 then Write(rr.aa, , rr.cc)
Else
Begin
BoVao(r, rr.nn-1, rr.bb, rr.aa, rr.cc);
BoVao(r, 1, rr.aa, rr.bb, rr.cc);
BoVao(r, rr.nn-1, rr.aa, rr.cc, rr.bb);
End;
Until T=0;
END.
V d 2:
Chng trnh sau m t gii thut tnh n! theo kiu quy nhng bng cch s
dng Stack: l mng m mi phn t ca n l mt record gm 2 trng: trng Para
(tham s) v trng Addr (a ch quay lui).
Label 1, 2, 3, 4, 5;
Type Rec = record
Para: Byte;
Addr: Byte;
End;
32
Var n, T: Byte;
a: Array [1..100] of Rec;
Kq: Real;
TempRec: Rec;
Procedure Push(TempRec: Rec);
Begin
T:=T+1;
a[T]:=TempRec;
End;
Procedure Pop(Var TempRec: Rec);
Begin
TempRec:=a[T];
T:=T-1;
End;
BEGIN
Readln(n); T:=0;
TempRec.Para:=n;
TempRec.Addr:=5;
1: Push(TempRec);
2: If a[T].Para=0 then
Begin
Kq:=1;
Goto 4;
End
Else
Begin
TempRec.Para:=a[T].Para-1;
TempRec.Addr:=3;
end;
Goto 1;
3: Kq:=Kq*a[T].Para;
4: Pop(TempRec);
Case TempRec.Addr of
3: Goto 3;
5: Goto 5;
End;
5: Writeln(Kq);
END.
33
1 2 3 4
Li ra Li vo
F R
4.4. Hng i (Queue):
4.4.1. nh ngha:
Hng i l mt danh sch tuyn tnh m php b sung c thc hin mt u
(gi l li vo/li sau: rear) v php loi b c thc hin u kia (li ra/li trc:
front).
Nhn xt: C cu ca Queue ging nh mt hng i: vo trc - ra trc. Do
Queue cn c gi l danh sch kiu FIFO (First In First Out).
4.4.2. Lu tr Queue bng mng:
C th dng mng mt chiu Q c n phn t lm cu trc lu tr ca hng i.
x l Q ta dng 2 bin:
+ Bin R theo di v tr li sau ca Q.
+ Bin F theo di v tr li trc ca Q.
Lu :
- Khi Q (Queue) rng th ta quy c: F = R = 0.
- Khi mt phn t c b sung th R tng ln 1 (R:=R+1). Khi ly bt mt phn
t ra th F tng ln 1 (F:=F+1).
Tuy nhin, vi cch t chc ny c th xut hin tnh hung l n mt lc no
khng th b sung tip phn t no nhng khng gian nh ca mng Q vn cn
ch. khc phc, ta xem Q nh l mt mng vng trn, ngha l xem Q[1] ng sau
Q[n].
Vi cch t chc ny ta c:
Gii thut b sung vo hng i Queue (c v tr li trc l F v v tr li
sau l R) phn t x:
Procedure Insert_Queue(Q, F, R, X) {Q, R, F: tham bin}
If (R mod n)+1=F then
{ Tng ng: if ((R<n) and (R+1=F)) or ((R=n) and (F=1)) }
Write(Hng i y!)
Else
Begin
R:=(R mod n)+1;
Q[R]:=X;
If F=0 then F:=1;
End;
Return;
34
Gii thut loi b mt phn t t hng i Queue (li trc F, li sau l R)
v phn t loi b c gn cho mt bin X:
Procedure Delete_Queue(Q, F, R, X) {Q, F, R, X: tham bin}
If F=0 then Write(Hng i ang cn!)
Else
Begin
X:=Q[F];
If F=R then F:=R:=0
Else F:=(F mod n)+1;
End;
Return;
Bi tp:
1) Tnh gi tr ca mt biu thc trung t m cc token c 2 loi (Hng s, ton
t: +, -, *, /) bng phng php sau:
- c cc token t tri sang phi, tt c a vo hng i. V d: 11 + 2 * 3:
1
1
+ 2 * 3
- Ln lt ly ra b vo mt danh sch th hai. Nh rng: nu gp phi ton t *
hoc / th ly hng i mt phn t v danh sch th 2 ly ra li mt phn t thc hin
php ton ny, c kt qu li b vo danh sch th 2.
1
1
+ 2
2 * 3
2) Ging nh bi tp 1, nhng cc token c th c du ( hoc du ), bng
phng php sau:
V d: 1 + (2 * (3 + 4))
1 ( 2 * ( 3 + 4
- Ln lt c cc token t tri sang phi push vo mt Stack cho n khi gp
du ) th ln lt ly cc phn t trong Stack ny b vo mt danh sch th hai
(b vo t pha tri) cho n khi gp du (.
3 + 4
- Lc ta x l danh sch th 2 ny (tnh) da vo th tc xy dng trong
bi tp 1). c kt qu li cho vo Stack ban u.
1 + ( 2 * 7
- Ri li tip tc cho n khi ht biu thc ny.
1 + 1
4
- Lc ta coi Stack ny nh mt hng i s dng th tc trong bi tp 1 m
x l.
35
Nhn xt: Mt Stack cng c th xem nh l mt Queue hoc l mt danh sch
tuyn tnh ni chung. Vn quan trng l ta cn s dng 2 bin theo di v tr 2
u ca danh sch ny c th thc hin php b sung hay loi b cho ph hp.
36
CHNG 5: DANH SCH MC NI (LINKED LIST)
5.1. Danh sch mc ni n:
5.1.1. T chc danh sch ni n:
- Mi phn t ca danh sch c gi l nt (node), l mt bn ghi gm 2 phn:
Phn thng tin (Info): Cha thng tin ca phn t (c th c nhiu hn mt
trng).
Phn lin kt (Next): y l mt trng cha a ch ca phn t ngay sau n
(l mt con tr). Trng ny c kiu d liu con tr.
- Cc nt c th nm ri rc trong b nh.
- c th truy cp n mi phn t ca danh sch, ta phi truy nhp vo nt u
tin. Do phi c con tr First tr vo phn t u tin ca danh sch. T nt u
tin, thng qua trng Next ta s i n nt th hai v c nh th ta c th duyt ht
cc phn t trong danh sch.
- Phn t cui cng trong danh sch c trng Next khng cha a ch ca phn
t no c m ta gi l Nil.
- Khi danh sch rng, ta quy c First = Nil.
- Ta k hiu:
New(p) (hay: p Avail): l th tc nhm to mt vng nh cn trng cha
mt nt v nt ny c tr bi con tr p (p cha a ch nt ny).
Dispose(p) ( hay p Avail): l th tc gii phng vng nh ca nt tr bi
con tr p khi b nh.
- Nu ta k hiu p l mt con tr, th p^ xem nh l mt Record.
V d:
Type ConTro = ^BanGhi;
Banghi = Record
Name: String[10];
Age: Byte;
Next: ConTro;
End;
Var p: ConTro;
5.1.2. Mt s php ton trn danh sch ni n:
5.1.2.1. Chn mt nt mi c ni dung X vo danh sch sau nt c tr bi p:
Procedure Insert_Node(First, p, X); {First: tham bin}
New(Tam);
Tam^.Info:=X;
If First=Nil then
Begin
37
First:=Tam;
First^.Next:=Nil;
Exit;
End;
Tam^.Next:=p^.Next;
P^.Next:=Tam;
Return;
5.1.2.2. Loi b mt nt ang tr bi p ra khi danh sch:
Procedure Delete_Node(First, p); {First: tham bin}
If First=Nil then
Begin
Write(Danh sch rng);
Exit;
End;
If First=p then
Begin
First:=First^.Next;
Dispose(p);
Exit;
End;
q:=First;
While q^.Next<>p do q:=q^.Next;
q^.Next:=p^.Next;
Dispose(p);
Return;
5.1.2.3. Ghp 2 danh sch c tr bi first1 v first2 thnh mt danh sch c
tr bi first1:
Procedure Combine(First1, First2); {First1: tham bin}
If First1=Nil then
Begin
First1:=First2;
Exit;
End;
If First2=Nil then Exit;
p:=First1;
While p^.Next<>Nil do p:=p^.Next;
p^.Next:=First2;
Return;
38
Bi tp:
To file vn bn tn l VB.TXT c cu trc nh sau:
Vit th tc:
1) Procedure Docfile(first; f:text); ln lt
c cc dng trong file VB.TXT v a ra mt danh sch mc
ni n c phn t u tr bi first, kiu d liu l con tr nh
khai bo trc ( v d).
Gi :
Assign(f, VB.TXT);
Reset(f);
First:=Nil;
While not Eof(f) do
Begin
Readln(f, Xau, So);
New(Tam);
Tam^.Name:=Xau;
Tam^.Age:=So;
Tam^.Next:=First;
First:=Tam;
End;
2) Procedure Dinhvi(p, i); {p: tham bin} nh v con tr p n
phn t th i trong danh sch.
3) Procedure Lietke(first); lit k ni dung ca cc nt trong
danh sch.
5.2. Danh sch ni vng:
5.2.1. Nguyn tc:
Trong danh sch ni n, trng Next ca nt cui danh sch c gi tr Nil,
to nn s linh hot trong vic truy cp n cc phn t ca danh sch, ngi ta cho
trng Next ca nt ny li tr n nt u ca danh sch v c danh sch c cu
trc nh sau: T

Trong danh sch ny c mt con tr T chy. Trong trng hp ni n th ng
mi nt ta ch c th truy cp n cc phn t ng sau n nhng vi danh sch ni
vng, ta c th truy cp vo tt c cc nt ca danh sch t bt k nt no. Song cch
t chc ny c th dn n tnh trng l truy cp khng kt thc. Nhc im ny c
39
Tn(6 k t) Tui
Lan 25
Le 20
An 18
............
th c khc phc bng cch thm mt nt vo danh sch gi l nt u danh sch v
bin tr Head cha a ch ca nt u ny.
Head
Ni dung ca trng Info ca nt ny (tr bi Head) khng cha thng tin no.
Trong trng hp danh sch rng, ta c: Head^.Next = Head
5.2.2. Gii thut b sung v loi b mt nt ca danh sch ni vng:
5.2.2.1. B sung mt nt c ni dung trng Info l X vo ngay sau nt u danh
sch Head:
Procedure Insert_Node(Head, X); {Head: tham tr}
New(Tam);
Tam^.Info:=X;
Tam^.Next:=Head^.Next;
Head^.Next:=Tam;
Return,
5.2.2.2. Loi b mt nt ng ngay sau Head:
Procedure Delete_Node(Head);
If Head^.Next=Head then
Begin
Writeln(Danh sch rng);
Exit;
End;
Tam:=Head^.Next;
Head^.Next:=Tam^.Next;
Dispose(Tam);
Return;
5.3. Danh sch ni kp:
5.3.1. T chc:
Tng t nh danh sch ni n hoc ni vng, danh sch ni kp bao gm cc
nt c th nm ri rc trong b nh v c lin kt vi nhau. Nhng iu khc bit
y l ti mi nt c hai trng cha a ch ca nt ng trc v nt ng sau n
(con tr), ngha l mi nt c dng:
40
Head
Info Previous
Next
Lc danh sch c dng nh sau:
Nhn xt:
- Danh sch ny s dng 2 bin con tr First v Last tr ti nt u tin v nt
cui cng. Trong trng before ca nt u tin v trng Next ca nt cui cng
c gi tr l Nil.
- Khi danh sch rng: First = Last = Nil.
5.3.2. Mt s php ton trn danh sch ni kp:
Chn mt phn t c trng Info l X vo ngay sau nt c tr bi p:
Produre Insert_Node(First, Last, p, X);
New(Tam);
Tam^.Info:=X;
If First=Nil then
Begin
First:=Tam;
First^.Next:=First^.Prev:=Nil,
Last:=First;
Exit;
End;
Tam^.Next:=p^.Next;
Tam^.Prev:=p;
p^.Next:=Tam;
If p<>Last then
Tam^.Next^.Prev:=Tam
Else Last:=Tam;
Return;
41

First Last

First Last
p
X
Loi b mt nt tr bi p ra khi danh sch:
Procedure Delete_Node(First, Last, p);
If First=Nil then
Begin
Write(Danh sch rng);
Exit;
End;
If First=Last then First:=Last:=Nil
Else If p=First then
Begin
First:=First^.Next;
First^.Prev:=Nil;
End
Else If p=last then
Begin
Last:=Last^.Prev;
Last^.Next:=Nil;
End;
Else
Begin
P^.Prev^.Next:=p^.Next;
P^.Next^.Prev:=p^.Prev;
End;
Dispose(p);
Return;
5.4. V d v vic s dng danh sch mc ni:
- Biu din mt a thc bng mt danh sch mc ni n.
- a thc s c biu din di mt danh sch ni n m mi nt (lu mt
n thc) c dng nh sau:
H
s
M Tip
Bi ton: Tnh tng 2 a thc:
- Gi s a thc A(x), B(x) s c biu din bi 2 danh sch mc ni n ln
lt tr bi A v B.
- Vn t ra: To danh sch ni n th 3 tr bi C biu din cho a thc:
C(x) = A(x) + B(x)
- Trc ht ta vit th tc ghp thm mt nt vo cui danh sch C c ni
dung trng h s l XX, trng m l YY. Gi s danh sch C c nt cui cng l tr
bi R.
42
............
C
R
Procedure Ghep(C, R, XX, YY);
1. New(Tam);
Tam^.Heso:=XX;
Tam^.Mu:=YY;
Tam^.Tiep:=Nil;
2. R^.Tiep:=Tam;
R:=Tam;
Return;
Procedure Cong_Da_Thuc(A, B, C);
1. New(C);
R:=C;
p:=A; q:=B;
2. While (p<>Nil) and (q<>Nil) do
If p^.Mu=q^.Mu then
Begin
XX:=p^.Heso+q^.Heso;
If XX<>0 then Ghep(C, R, XX, p^.Mu);
p:=p^.Tiep;
q:=q^.Tiep;
End
Else If p^.Mu<q^.Mu then
Begin
Ghep(C, R, q^.Heso, q^.Mu);
q:=q^.Tiep;
End;
Else
Begin
Ghep(C, R, p^.Heso, p^.Mu);
p:=p^.Tiep;
End;
3. While p<>Nil do
Begin
Ghep(C, R, q^.Heso, q^.Mu);
q:=q^.Tiep;
End;
While q<>Nil do
43
Begin
Ghep(C, R, p^.Heso, p^.Mu);
p:=p^.Tiep;
End;
Tam:=C;
C:=C^.Tiep;
Dispose(Tam);
Return;
5.5. Stack v Queue mc ni:
i vi Stack, vic truy nhp lun thc hin mt u nn vic ci t mt danh
sch bng Stack mc ni l kh t nhin. Chng hn vi danh sch ni n c nt u
tr bi First th c th coi First nh l nh Stack.
B sung mt phn t vo Stack cng chnh l b sung mt nt vo danh sch
nt tr thnh nt u tin trong danh sch. Loi b mt phn t ca danh sch
chnh l loi b phn t u tin. i vi danh sch mc ni, chng ta khng cn kim
tra hin tng trn Stack v Stack dng danh sch mc ni khng b gii hn kch
thc nh dng mng (m ch gii hn bi b nh ton phn).
Th tc chn vo u danh sch mt phn t:
Procedure Push(First, X);
New(p);
p^.Info:=X;
p^.Tiep:=First;
First:=p;
Return;
Th tc ly phn t u danh sch:
Procedure Pop(First, Var X);
If First=Nil then
Begin
Write(Stack cn);
Exit;
End;
X:=First^.Info;
p:=First;
First:=First^.Tiep;
Dispose(p);
Return;
i vi Queue, dng danh sch mc ni cng theo phng php tng t.
Nhng nu dng danh sch mc ni n th cn 2 bin con tr First v Last.
44
B sung mt phn t vo Queue l b sung mt phn t ngay sau Last. V loi
b mt phn t khi Queue l loi b phn t u tin (First).
Th tc chn vo u danh sch mt phn t:
Procedure Insert_Queue(First, Last, X);
New(p);
p^.Info:=X;
p^.Tiep:=Nil;
If Last=Nil then First:=Last:=p
Else Begin
Last^.Next:=p;
Last:=p;
End;
Return;
Th tc xo phn t trn Queue: ging nh th tc Pop trn.
Bi tp (Bi thc hnh s 2):
To t in: C mt menu lm cc cng vic sau:
1) Khi to t in:
c file TD.DAT l file of string[7] (file ny cha sn cc t c ti a l 7
k t). Mi t ch c cc k t trong tp [A....Z]. Cc t trong file c sp xp
theo th t ABC) v lu cc t ny vo mt mng cc danh sch mc ni. C th:
Var TD: Array[A...Z] of DanhSach;
Trong , kiu DanhSach c khai bo nh sau:
DanhSach = ^Banghi;
BanGhi = Record
Tu: String[7];
Tiep: DanhSach;
End;
V d: File TD.DAT c 3 t: ANH, BAN, BONG.
Cn TD[C],..., TD[Z] u l Nil.
Lu : Nu file ny cha c th cho cc phn t ca mng u l Nil.
45
BAN BONG
ANH TD[A]
TD[B]
2) Cp nht t in t 1 file vn bn:
c mt file vn bn bt k, trong c cha cc t (mt t c quy nh l
cc k t lin tip trong tp [A...Z]) cc k t cn li u coi l du phn cch). C
mi t c c trong file vn bn ny hy thc hin cng vic sau: Nu t khng
tm thy trong TD th chn n vo v tr thch hp.
3) Lit k tt c cc t trong TD:
G vo k t, sau hin th tt c cc t c k t u l k t c g vo.
4) Xo mt t:
T bn phm g vo mt t. Nu t c trong TD th xo khi TD, cn ngc
li th thng bo: Khng c t ny trong TD.
Li gii tham kho chng trnh to t in
Program Tao_tu_dien;
uses crt;
type chuoi=string[7];
type myfile=file of chuoi;
type danhsach=^banghi;
banghi=record
tu:chuoi;
tiep:danhsach;
end;
const fi='tdd.txt';
var td:array['A'..'Z']of danhsach;
ten:string;
ten1:chuoi;
n:integer;
i,t,STE:char;
procedure xulyfile(ten1,ten2:string);
var f1,f2:text;
s:string;s1:string[7];ch:char;
n,i,d:byte;
begin
assign(f1,ten1);
reset(f1); {chep file tdd.txt vao thu muc hoac sua
const fi o dau:};
assign(f2,ten2);
46
rewrite(f2);
while not(eof(f1)) do
begin
readln(f1,s);
i:=1;
while i<length(s) do
if (s[i]=s[i+1])and(s[i]=' ') then delete(s,i,1)
else inc(i);
if s[length(s)]<>' ' then s:=s+' ';
n:=length(s);
d:=1 ;
i:=1;
while i<=length(s) do
begin
if s[i] =' ' then
begin
s1:=copy(s,d,i-d);
writeln(f2,s1);
d:=i+1;
end;
inc(i);
end;
end;
close(f2);
close(f1);
end;
procedure insert(st:chuoi);
var t:char;p:danhsach;
begin
t:=upcase(st[1]);
new(p);
p^.tu:=st;
p^.tiep:=td[t];
td[t]:=p;
end;
procedure dichfile(ten:string);
var st:string;s:chuoi;
f1:text;f2:myfile;
47
begin
assign(f2,'td.dat');
rewrite(f2);
assign(f1,ten);
reset(f1);
while not eof(f1) do
begin
readln(f1,s);
write(f2,s);
end;
CLOSE(F1);CLOSE(F2);
end;
function kiemtra(s:chuoi):boolean;
var t:char;p:danhsach;
kt:boolean;
begin
t:=upcase(s[1]);
p:=td[t];
kt:=true;
while p<>nil do
begin
if s=p^.tu then kt:=false;
p:=p^.tiep;
end;
kiemtra:=kt;
end;
procedure nhap;
var f:myfile;i:char;s:chuoi;
begin
assign(f,'td.dat');
reset(f);
for i:='A' to 'Z' do
td[i]:=nil;
while not eof(F) do
begin
read(f,s);
insert(s);
end;
48
CLOSE(F);
end;
procedure nhaptay;
var i:char;s:chuoi;ch:char;
begin
repeat
write('Tu ban muon nhap la:');
readln(s);
insert(s);
writeln(' ban co muon nhap nua ko:(c/k)');
ch:= readkey;
until upcase(ch)='K';
end;
procedure xuat(t:char);
var p:danhsach;
begin
p:=td[upcase(t)];
writeln;
while p<>nil do
begin
write(p^.tu,' ');
p:=p^.tiep;
end;
end;
procedure xoatu(s:chuoi);
var t:char;
p,q:danhsach;
begin
t:=upcase(s[1]);
p:=td[t];
if p^.tu=s then
begin
td[t]:=p^.tiep;
dispose(p);
exit;
end;
while p^.tiep^.tu<>s do
p:=p^.tiep;
49
q:=p^.tiep;
p^.tiep:=q^.tiep;
dispose(q);
end;
procedure capnhat(ten:string);
var s:chuoi;f:myfile;
begin
xulyfile(ten,'td1.txt');
dichfile('td1.txt');
assign(f,'td.dat');
reset(f);
while not eof(f) do
begin
read(f,s);
if kiemtra(s) then insert(s);
end;
end;
procedure luufile;
var f:text;
s:string;
st:chuoi;
t:char;
p:danhsach;
begin
writeln('nhap vao ten file text:');
readln(s);
assign(f,s);
rewrite(f);
for t:='A' to 'Z' do
begin
p:=td[t];
while p<>nil do
begin
writeLN(f,p^.tu);
p:=p^.tiep;
end;
end;
50
CLOSE(F);
end;
PROCEDURE LOGO;
BEGIN
CLRSCR;TEXTCOLOR(RED);
WRITELN(' XIN BAM PHIM ENTER DE VAO CHUONG
TRINH:');
READLN;
END;
procedure xuathet;
var t:char;
begin
for T:='A' to 'Z' do
if td[t]<>nil then xuat(t);
end;
{========CHUONG TRINH CHINH================}
begin
LOGO;
clrscr;
xulyfile(fi,'td1.txt');{file tu dien la file chua cac
chu:"}
dichfile('td1.txt');
nhap;
repeat
clrscr;
TEXTCOLOR(3);
writeln(' ===========CHUONG TRINH TU
DIEN===========');
TEXTCOLOR(4);
WRITELN;
WRITELN(' <<< Oo0oO >>>
');
TEXTCOLOR(2);
WRITELN;
WRITELN;
writeln(' [1] KHOI TAO FILE :');
WRITELN;
51
writeln(' [2] CAP NHAT MOT FILE:');
WRITELN;
writeln(' [3] LIET KE CAC TU TRONG TU
DIEN:');
WRITELN;
writeln(' [4] XOA 1 TU TRONG TU
DIEN:');
WRITELN;
writeln(' [6] LUU NGUOC LAI VAO FILE
TEXT:');
WRITELN;
writeln(' [7] BO SUNG VAO 1 TU:');
WRITELN;
writeln(' [8] LIET KE 1 NHOM TU:');
WRITELN;
writeln(' [0] THOAT KHOI CHUONG
TRINH:');
TEXTCOLOR(1);
WRITELN;
WRITE(' BAN CHON SO NAO:');
i:=readkey;
WRITELN; TEXTCOLOR(WHITE);
case i of
'1': BEGIN
nhap;
nhaptay;
WRITELN('DA KHOI TAO BANG TAY VA FILE
XONG:');READLN;
END;
'2': begin
write('nhap vao ten file:');readln(ten);
capnhat(ten);
writeln('da cap nhat xong');
readln;
end;
'3': begin
xuathet;
52
readln;
end;
'4': begin
write('nhap vao tu do:');
readln(ten1);
if not kiemtra(ten1) then
xoatu(ten1) else writeln('khong co tu do');
writeLn('da thuc hien xong:');
readln;
end;
'6': luufile;
'7':begin
writeLN('nhap vao 1 tu can bo sung:');
readln(ten1);
if kiemtra(ten1) then
begin
insert(ten1);
writeLN('da bo sung xong');
end
else writeln('da co tu do');
readln;
end;
'8':BEGIN
WRITELN('NHAP VAO 1 KI TU:');
READLN(STE);
if td[upcase(ste)]=nil then writeln('khong co
tu nao ')
else
XUAT(STE);
READLN;
END;
end;
until i='0';
CLRSCR;
GOTOXY(3,6);TEXTCOLOR(RED);
writeln('Ban bam Enter de ket thuc:');
53
readln;
end.
54
CHNG 6: CY (TREE)
6.1. nh ngha v cc khi nim:
6.1.1. nh ngha:
- Mt nt l mt cy. cng l gc ca cy ny.
- Nu n l mt nt v T
1
, T
2
,..., T
k
l k cy vi cc gc l n
1
, n
2
,..., n
k
th mt cy
mi s c thnh lp bng cch cho nt n tr thnh cha ca n
1
, n
2
,...,n
k
(c gi l
cc cy con ca gc n).
V d: Cho biu thc dng trung t: x + y * (z - t) + u / v. Biu thc ny c th
c biu din di dng cy nh sau:
6.1.2. Cc khi nim lin quan:
a. Cp (bc - degree):
- Cp ca mt nt l s cc cy con ca nt . Suy ra nt c cp 0 gi l l
(leaf), ngc li gi l nhnh (branch).
- Cp ca mt cy l cp cao nht ca cc nt trong cy.
b. Mc (level):
- Gc c mc 1.
55
Gc
*
+
+ /
x u v
-
df
df
g
y
z t
n
1
n
2
n
k
n
T
1
T
2
T
k

- Mt nt c mc i th nt con ca n c mc i + 1.
Lu :
- Mc ln nht ca cy c gi l chiu cao ca cy.
- Nu c mt dy cc nt n
1
, n
2
, ...., n
k
sao cho n
i
l cha ca n
i+1
(i =
1 - k 1,
) th
dy ny c gi l mt ng i t n
1
n n
k
, v k c gi l di ng i.
c. Cy c th t:
- L cy m th t ca cc cy con c coi trng.
V d: Nu cy v cy khc nhau th y l cc cy c th t.
Lu : Thng th th t ca cc cy con ca mt nt c tnh t tri sang
phi.V d, biu thc u / v c biu din nh sau:
d. Rng (forest): L mt tp hp cc cy phn bit.
6.2. Cy nh phn:
6.2.1. nh ngha v tnh cht:
- Cy nh phn l cy m ti mi nt c ti a l 2 con.
Nhn xt:
- Cy nh phn khng nht thit l cy cp 2. V d:
- Mt cy cp 2 th l cy nh phn.
- Cy nh phn l cy c th t.
- Mt cy nh phn c gi l suy bin nu n l cy cp 1, c th:
B :
S lng ti a cc nt mc i trong mt cy nh phn l: 2
i-1
.
S lng ti a cc nt trn cy nh phn c chiu cao h l: 2
h
-1.
Lu :
- Mt cy c gi l hon chnh nu s nt trn cc mc u t ti a tr mc
cui cng.
- Mt cy c gi l y nu s nt trn cc mc u t ti a.
56
A
B C
A
C B
C
/
u
B
v
A
B
B
C
Gc
A
B
B
C
Cy lch tri
A
B
B
C
Cy zic-zc
A
B
B
C
Cy lch phi
6.2.2. Biu din cy nh phn:
6.2.2.1. Lu tr k tip:
Nu c mt cy nh phn y , ta c th d dng nh s cc nt trn cy t
mc 1 tr i theo hng t tri sang phi.
V d:
Nhn xt: Lc cc con ca nt th i c s th t l:

'

+ 1 2
2
i
i
v ngc li cha ca nt th j l [j/2] (j div 2).
Do , ta c th lu tr cy vi ni dung nt th i l V[i], bng cch ny ta c
th trc tip di chuyn n mi nt ca cy.
Tuy nhin i vi mt cy khng y (v d nh cy suy bin) th vic t
chc lu tr theo kiu ny t ra lng ph (cho mt v d).
6.2.2.2. Lu tr mc ni:
- Ta c th biu din mt nt c 3 phn nh sau:
Left Info Right
Trong : + Info c th c nhiu trng.
+Left, Right: l trng kiu con tr tr ti cy con tri v cy
con phi.
V d:
57
Cy hon chnh
(Cy khng y )
Cy y
(Cy hon chnh)
5
1
2 3
4 6 7
A
B C
E D
A
B C
D E
T
Biu din
- c th truy nhp vo cc nt trn cy, cn c mt con tr T tr ti nt gc
ca cy .
- Ngi ta quy c nu cy nh phn rng th T = Nil.
Nhn xt:
- Ti cc nt l, trng Left v Right c gi tr l Nil.
- Nu mt nt khng c cy con bn tri th trng Left = Nil (tng t i vi
trng Right).
6.2.3. Php duyt cy nh phn:
Php duyt cy l php ln lt i qua mi nt ca cy v mi nt ch i qua 1
ln (thm 1 ln). C 3 php duyt cy da vo th t duyt.
Duyt theo th t trc, th t gia v th t sau tu thuc vo nt gc (N),
cy con tri (L), cy con phi (R), thnh phn no c duyt trc v thnh phn no
c duyt sau. Chng hn:
- Duyt theo th t trc c ngha l gc c duyt trc (NLR).
- Duyt theo th t gia (LNR).
- Duyt theo th t sau (LRN).
V d 1: Cho cy nh phn sau:
6.2.3.1. Duyt theo th t trc:
Procedure DuyetTruoc(T);
If T<>Nil then
Begin
Write(T^.Info);
DuyetTruoc(T^.Left);
DuyetTruoc(T^.Right);
End;
Return;
i vi cy v d trn, ta c kt qu sau khi duyt l: ABDEFC.
- Ta c th kh quy th tc ny bng th tc sau:
Procedure DuyetTruoc(T);
58
E
A
B C
D
F
T
1. Top:=0; Push(S, T);
2. Repeat
Pop(S, pt);
Write(pt^.Info);
If pt^.Right<>Nil then Push(S, pt^.Right);
If pt^.Left<>Nil then Push(S, pt^.Left);
Until top=0;
Return;
6.2.3.2. Duyt theo th t gia:
Procedure DuyetGiua(T);
If T<>Nil then
Begin
DuyetGiua(T^.Left);
Write(T^.Info);
Duyetgiua(T^.Right);
End;
Return;
i vi cy v d trn, ta c kt qu sau khi duyt l: DBFEAC.
6.2.3.3. Duyt theo th t sau:
Procedure DuyetSau(T);
If T<>Nil then
Begin
Duyetsau(T^.Left);
Duyetsau(T^.Right);
Write(T^.Info);
End;
Return;
i vi cy v d trn, ta c kt qu sau khi duyt l: DFEBCA.
59
V d 2: Xt cy nh phn:
Bi tp:
1) To cy (s dng biu din mc ni) nh hnh nh sau:
Type Contro = ^BanGhi;
BanGhi = Record
Info: Char;
Left, Right: ConTro;
End;
Var T: ConTro;
Procedure TaoNut(Var p: ConTro; X: Char);
Begin
New(p);
P^.Info:=X;
p^.Left:=p^.Right:=Nil;
End;
Procedure TaoCay;
Begin
TaoNut(T, A);
TaoNut(T, B); T^.Left:=p;
TaoNut(T, C); T^.Right:=p;
TaoNut(T, D); T^.Left^.Right:=p;
End;
BEGIN
60
*
+
+ /
x u v
-
df
df
g
y
z t
Th t trc: + x + * y - z + / u v
Th t gia: x + y * z - t + u / v
Th t sau: x y z t - * u v / + +
A
B C
D
T
TaoCay;
.....
END.
2) Gi s c cy nh phn m gc tr bi T. Nhp mt xu t bn phm ch
gm mt trong cc ch R, L ch ng dn n mt nt no t gc T (R: r phi,
L: r tri). T in ni dung trng Info ca nt ny.
Readln(Xau);
p:=T; i:=1; Kt:=True;
While Kt and (i<=Length(Xau)) do
Begin
If p<>Nil then
If Xau[i]=L then p:=p^.Left
Else p:=p^.Right
Else Kt:=False;
i:=i+1;
End;
If Kt then Write(p^.Info)
Else Write(ng dn sai);
3) To mt cy (gc tr bi T) vi d liu v cy c cho trong file vn bn
c cu trc nh sau:
4) Vit th tc kh quy th tc duyt gia v duyt sau.
5) Nhp vo 2 xu St1, St2. Trong St1 th hin php duyt trc, St2 th
hin php duyt gia. T to ra mt cy tr bi T (gi : lm bng quy).
Function TaoCay(St1, St2: String): ConTro;
Var p: ConTro; p0: Byte;
Begin
If (St1<>) and (St2<>) then
Begin
p0:=Pos(St1[1], St2);
New(p);
p^.Info:=St1[1];
p^.Left:=TaoCay(Copy(St1, 2, p0-1),
Copy(St2, 1, p0-1);
p^.Right:=TaoCay(Copy(St1, p0+1, Length(St1)-p0),
61
\ <K t>
<Cc ng dn> <k t>
V d:
\ A
L B
R C
LR F
Copy(St2, p0+1, Length(St2)-
p0));
TaoCay:=p;
End
Else TaoCay:=Nil;
End;
BEGIN
Readln(St1); Readln(St2);
T:=TaoCay(St1, St2);
.....
END.
6) Chng minh s duy nht ca cy khi bit kt qu duyt theo th t trc
v th t gia.
7) Vit li th tc to cy trn nhng c kim tra s mu thun ca xu St1 v
St2.
8) C xc nh c mt cy hay khng, nu bit th t duyt trc (St1) v
th t duyt sau (St2)?
9) Gi s mt phn t c khai bo:
Type Contro = ^BanGhi;
Banghi = Record
Info: Word;
Left, Right: ConTro;
End;
Vit mt chng trnh to cy, bit rng th t cc nt c duyt theo th t
trc lu trong mt mng V: array [1..100] of word. V th t duyt gia
c nhp t bn phm da vo v tr trong th t duyt trc.
10) Vit chng trnh nhp vo mt xu (ch chp nhn cc k t +, -, *, /, a, b,
c, , z) biu din biu thc dng tin t. T vit chng trnh to mt cy sao cho:
- Gc tr bi T.
- Ni dung cc nt trong cy l cc token ca biu thc trn.
- Php duyt cy ny theo th t trc chnh l ni dung ca xu trn.
V d: vi xu + - a b * c d, ta c cy:
p dng cy trong gii thut sp xp:
62
T
b
+
- *
a c d
- nh ngha: Mt cy nh phn m mi nt ca n cha mt s c gi l cy
c sp xp nu mi nt trn cy con tri c gi tr b hn nh (gc) v mi nt trn
cy con phi u ln hn hoc bng nh (gc).
V d: Cy c sp xp:
- Bi ton t ra: Vit chng trnh nhp vo mt s v chn n vo 1 cy c
sp xp. gii quyt bi ton ny, ta s dng th tc sau:
{ Chn mt nt c gi tr X vo cy c sp c nt gc tr bi T. }
Procedure Chen(T, X);
Begin
If T=Nil then
Begin
New(q); q^.Info:=X; T:=q;
T^.Left:=T^.Right:=Nil;
Exit;
End
Else If X<T^.Info then Chen(T^.Left, X)
Else Chen(T^.Right, X);
Return;
Nhn xt: Cy c sp khi c duyt theo th t gia s cho kt qu l dy s
tng dn.
=> Ta c chng trnh chnh nh sau:
Program SapXep;
1. T:=Nil;
2. Repeat
Readln(X);
Chen(T, X);
Until <Ht nhp>;
3. DuyetGiua(T);
END.
6.2.4. Cy nh phn ni vng:
Ta thy s cc trng mc ni (Left v Right) ca mt cy c gi tr Nil kh
nhiu (nu c n nt th s c (n+1) con tr Nil). tn dng cc trng mc ni ny,
63
20
b
3
1 5
5
8
ngi ta tm cch cho cc con tr ny tr n cc nt quy nh m theo mt ngha no
l to iu kin cho php duyt cy c thun tin. Loi mc ni ny gi l ni
vng v cy nh phn nh vy c gi l cy nh phn ni vng.
Quy c: xy dng cy ni vng t mt cy cho ta c mt s quy c sau:
- Php duyt cy theo th t gia.
- Cho mt nt P v cho mt php duyt (theo th t gia). Lc , ta c k hiu:

+
P: l nt ng trc P.
P
+
: l nt ng sau P.
64
T
V d: Cho cy c th t gia Head CBDAEF Head:
- Vi mt nt P bt k, nu:
+ p^.Left = Nil th iu chnh p^.Left=
+
P.
+ p^.Right = Nil th iu chnh p^.Right=P
+
.
Nhn xt:
- By gi r rng my khng th phn bit mc ni no l thc v mc ni no l
gi. V vy, trong quy cch ca mt nt ta phi thm vo 2 trng kim tra: LType v
RType (kiu Boolean) nh sau:
+Khi p^.LType = True th p^.Left l tr thc.
Khi p^.LType = False th p^.Left l tr gi.
+ Tng t i vi RType.
- Ta cng nhn xt rng, trong vic thit lp nh v d trn, trng Left nt cc
tri (nt C) v trng Right nt cc phi (nt F) vn cn Nil. tn dng ngi ta a
vo mt nt u cy l Head sao cho T l cy con tri ca Head, ngha l:
Head^.Left=T v trng Right ca Head tr li Head ngha l: Head^.Right = Head.
V quy nh trng Left nt cc tri v trng Right nt cc phi tr ti Head.
Hm xc nh p
+
ca p:
Function Succ(p) {p: ConTro}
1. q:=p^.Right;
If p^.RType=False then
Begin
Succ(p):=q; Exit;
End;
2. While q^.LType=True do q:=q^.Left;
3. Succ(p):=q;
Return;
Hm xc nh
+
p ca p:
Function Pred(p) {p: ConTro}
1. q:=p^.Left;
65
A
B E
F D
C
Head
CBDAEF
+
A = D
A
+
= E
T
If p^.LType=False then
Begin
Pred(p):=q; Exit;
End;
2. While q^.RType=True do q:=q^.Right;
3. Pred(p):=q;
Return;
Th tc duyt cy ni vng:
Procedure Duyetcay(Head);
1. p:=Head;
2. While True do
Begin
p:=Succ(p);
If p=Head then Exit
Else Write(p^.Info);
End;
Return;
Th tc thc hin php b sung mt nt vo cy thnh cy con tri ca nt
p cho trn cy ni vng:
Procedure BoSungTrai(p, X); {Nut moi co noi dung la X}
1. New(q);
q^.Info:=X;
q^.Left:=p^.Left; q^.LType:=p^.LType;
p^.Left:=q; p^.LType:=True;
q^.Right:=p; q^.RType:=False;
2. If q^.LType=True then {p dang tro toi mot canh}
Begin
w:=Pred(q);
w^.Right:=q;
w^.RType:=False;
End;
Return;
Bi tp:
Vit chng trnh to mt cy nh phn ni vng t mt cy nh phn cho
(tham kho trang 131 cun cu trc d liu ca Nguyn Trung Trc).
6.3. Cy tng qut:
6.3.1. Biu din cy tng qut:
66
i vi cy tng qut, ngi ta biu din n thng qua mt cy nh phn. C
th: Ta rng, bt k mt nt no trn cy tng qut nu c th ch c:
+ Mt nt con cc tri (con u).
+ Mt nt em cn phi.
Lc ny, cy nh phn biu din cy tng qut theo hai quan h ny c gi l
cy nh phn tng ng.
67
V d:
Khi chuyn qua cy nh phn, mt nt c dng:
Con
c
Info Em
k
Trong :
+Trng con c l con tr tr ti nt con cc tri (nu khng c th n c gi tr
Nil).
+Trng em k l con tr tr ti nt em cn phi.
T v d trn ta suy ra cy nh phn biu din cy tng qut trn l:
Nhn xt:
- Do nt gc ca cy tng qut khng c nt em nn nt gc cy nh phn tng
ng khng c cy con phi (trng em k ca nt gc c gi tr Nil).
- Tuy nhin, nu c mt rng cy tng qut c nh s th t th c th
chuyn thnh mt cy nh phn (vi lu , gc ca cy ny c th xem l em ca gc
cy tng qut khc).
68
I
A
B D
H
C
J E F G
F
A
B
C E
D
I
H
df
df
g
G
J
V d: Cho mt rng c 3 cy tng qut:
T y ta c th biu din chng thnh mt cy nh phn nh sau:
6.3.2. Php duyt cy tng qut:
Tng t nh cy nh phn, ngi ta cng c php duyt cy tng qut theo:
Th t trc:
- Duyt gc.
- Ln lt duyt cc cy con theo th t trc.
V d: Xt v d 1, ta c kt qu sau khi duyt: ABEFCGDHIJ.
Nhn xt: Php duyt theo th t trc trong cy tng qut tng ng vi
php duyt theo th t trc trn cy nh phn tng ng (th t trc trn cy nh
phn: ABEFCGDHIJ).
Th t sau:
- Ln lt duyt cc cy con theo th t sau.
- Duyt gc.
V d: Xt v d 1, ta c kt qu sau khi duyt: EFBGCHIJDA.
Nhn xt: Php duyt theo th t sau trong cy tng qut tng ng vi php
duyt theo th t gia trn cy nh phn tng ng (th t gia trn cy nh phn:
EFBGCHIJDA).
Lu : Php duyt cy tng qut thng ch xt th t trc v th t sau.
69
E
F
C
A
B D
G
H I
K
C
A
B E
F G
H
df
df
g
D
K
I
Bi tp:
Cho trc mt cy nh phn biu din mt rng cy tng qut. Cho bit rng
ny c bao nhiu cy.
6.4. ng dng (Biu din cy biu thc s hc):
Nh bit, mt biu thc s hc vi cc php ton 2 ngi: +, -, *, / ^ (lu
tha) c biu din mt cch t nhin bi mt cy nh phn. Ta c th a thm vo
php ton 1 ngi: (php i du).
70
V d: Cho biu thc sau: a * (-b) + c
2
. Ta c cy nh phn biu din n nh
sau:
Vi loi cy ny, tt c cc ton hng u l l, cn cc ton t th nm nhnh
v c th biu din bng mt nt nh sau:
Left Type Right
y, trng Info c thay bng trng Type:
1, 2, 3, 4, 5, 6 tng ng vi 6 php ton (+ - * / ^ ).
Type =
0 nu l l.
Nh vy nu nt l th trng Type c gi tr 0 ch bin hoc hng tng ng
nt . Trong trng hp ny, ta li cho trng Right tr ti a ch trong bng k
hiu ca bin hoc hng .
Lu :
Vi quy cch nh trn th nt trn cy s lu tr loi (Type) php ton ch
khng lu tr du php ton. Cn bng k hiu th c t chc cha tn ca bin
(dng trng Symbol) hay hng v gi tr ca chng (l trng Value). By gi v d
trn s c biu din nh hnh sau (trang 149):
T y, ta c gii thut tnh biu thc s hc c biu din trn mt
cy nh phn, c gc tr bi E:
Type ConTroGT = ^BanGhiGT;
BanGhiGT = Record
Symbol: String;
Value: Real;
End;
Var F: ConTroGT;
V: Array[1..100] of BanGhiGT;
Function Tinh(E);
Case
E^.Type=0: Begin
F:=E^.Right; Tinh:=F^.Value;
End;
E^.Type=1: Tinh:=Tinh(E^.Left)+Tinh(E^.Right);
E^.Type=2: Tinh:=Tinh(E^.Left)-Tinh(E^.Right);
71

+
* ^
c 2
b
a
E^.Type=3: Tinh:=Tinh(E^.Left)*Tinh(E^.Right);
E^.Type=4: Tinh:=Tinh(E^.Left)/Tinh(E^.Right);
E^.Type=5: Begin
If Tinh(E^.Left)<=0 then Exit;
Tinh:=Exp(Tinh(E^.Right)*
Ln(Tinh(E^.Left)));
End;
E^.Type=6: Tinh:=-Tinh(E^.Right);
End Case;
Return;
Bi tp (Bi thc hnh s 3): (Chn 1 trong 2 )
1:
ng dng cy trong vic tnh mt biu thc s hc., Ccn gii quyt theo 1
trong 3cc ni dung sau:
- Nhp mt xu dng trung t, t Cchuyn mt biu thc trung t thnh xu
dng tin t.
- Nhp mt biu thc dng tin t (v d: + - a b * c d).
- T vVit chng trnh to v tnh cy biu thc, vi:
+ Gc tr bi T.
+ Ni dung cc nt trong cy l cc token ca biu thc trn, v .
+ Pphp duyt cy theo th t trc chnh l ni dung ca biu thc tin t
trn.
+ Chuyn gii thut tnh gi tr ca mt biu thc s hc (trong l thuyt)
thnh chng trnh Pascal (hm Tinh) => Nhp 1 xu dng trung t v tnh ra kt qu.
Gi
Chng trnh chnh:
BEGIN
Readln(Xau);
T:=Nil;
i:=0; {i: So Token doc duoc}
Taocay(T);
END.
Th tc to cy:
Procedure TaoCay(T);
1. <c mt token X (tip theo) t biu thc tin t (c
t tri sang phi)>;
2. New(T); T^.Info:=X;
3. If <X l ton hng> then
72
T^.Left:=T^.Right:=Nil
Else { X = +, -, *, / }
Begin
Taocay(T^.Left);
Taocay(T^.Right);
End;
Return;
Li gii tham kho ca chng trnh tnh gi tr biu thc tin t
program Tinhtiento;
uses crt;
type nut=^tronut;
tronut=record
left,right:nut;
giatri:real;
kieu:char;
end;
var t:nut;
s:string;
i:integer;
function tinh(e:nut):real;
begin
case e^.kieu of
'0':tinh:=e^.giatri;
'+':tinh:=tinh(e^.left)+tinh(e^.right);
'-':tinh:=tinh(e^.left)-tinh(e^.right);
'*':tinh:=tinh(e^.left)*tinh(e^.right);
'/':tinh:=tinh(e^.left)/tinh(e^.right);
'^':begin
if tinh(e^.left)<=0 then exit;
tinh:=exp(tinh(e^.right)*ln(tinh(e^.left)));
end;
end;
end;
function laytu(s2:string;var i:integer):string;
var j:integer;
begin
j:=i;
73
while s2[j]<>' ' do inc(j);
laytu:=copy(s2,i,j-i);
i:=j;
end;
procedure docfile;
var f:text;
begin
assign(f,'tt.txt');
reset(f);
readln(f,s);
end;
procedure taocay(var t1:nut);
var st:string; code:integer;
begin
if i>length(S) THEN exit ;
inc(i);
new(t1);st:=laytu(s,i);
if
not((st='+')or(st='-')or(st='*')or(st='/')or(st='^')) then
begin
t1^.left:=nil;
t1^.right:=nil;
val(st,t1^.giatri,code);
t1^.kieu:='0';
end
else
begin
t1^.kieu:=st[1];
taocay(t1^.left);
taocay(t1^.right);
end;
end;
procedure xuly;
var j,k:integer;
begin
i:=0;
74
t:=nil;
taocay(t);
end;
begin
{docfile;}
clrscr;
writeln('Nhap xau tien to:(yeu cau fai nhap dung voi
cac');
writeln(' so va dau fai cach nhau mot dau cach(khoang
trang):');
readln(s);
xuly;
writeln('Ket qua la:');
write(tinh(t):6:4);
REadln;
end.
75
Bi thc hnh s 4 2:
Ngi ta biu din thng tin ca 1 th vin di dng mt cy tm kim nh
phn vi kho tm kim TenTG (tn tc gi). Mi nt ca cy l mt bng ghi gm
trng TenTG v 4 trng con tr:
- Hai con tr Trai v Phai ln lt tr ti cc nt con tri v nt con phi.
- Hai con tr Dau v Cuoi ln lt tr ti phn t u v phn t cui ca 1 danh
sch tuyn tnh mc ni dng ghi nhn cc sch c trong th vin ca tc gi .
Mi phn t ca danh sch ny l mt bng ghi gm 2 trng: TenSach, TiepTheo. C
th hnh dung cy ny nh hnh v sau:
-
Ta c khai bo:
Type Str25 = String[25];
TroSach = ^Sach;
Sach = Record
TenSach: String;
TiepTheo: TroSach;
End;
TroTG = ^TacGia;
TacGia = Record
Trai, Phai: TroTG;
Dau, Cuoi: TroSach;
TenTG: Str25;
End;
a) Vit hm: Function Nut(Goc: TroTG; Ten: Str25): TroTG;
Cho kt qu l mt con tr:
Bng Nil: khi gc bng Nil,
Nu khng th, tr ti nt c TenTG = Ten nu nt tn ti,
Nu khng th, tr ti 1 nt trong Ten < TenTG v Trai:=Nil hoc
tr ti 1 nt trong Ten > TenTG v Phai:=Nil.
76
Nam
Lin Yen
An Long Sinh
b) Vit hm: Function NutMoi(Ten: Str25; TuaDe: String):
TroTG;
Cho ta a ch (con tr kiu TroTG) ca mt nt mi thnh lp, nhng cha
c gn vo cy. Trong TenTG = Ten v trong phn t duy nht ca danh sch
tng ng TenSach = TuaDe.
c) Vit th tc: Procedure Bosung(Var Goc: TroTG; Ten: Str25;
TuaDe: String);
Cho php b sung tn 1 tc gi (c tn l Ten) vi 1 cun sch (c ta l
TuaDe) vo th vin tr bi gc theo cch sau:
Nu tn v ta u c trong th vin th khng phi lm g na.
Nu tn c v ta cha c th b sung ta vo cui danh sch tng
ng vi nt c TenTG = Ten.
Nu tn v ta u cha c th b sung 1 nt mi vo th vin vi TenTG =
Ten v TenSach = Tuade.
Yu cu: Trong chng trnh phi lm c cc vic:
Nhp thng tin khi to t mt file vn bn.
Lit k cc tc gi theo th t alphabet.
Lit k sch ca mt tc gi.
Lit k cc tc gi ca mt cun sch .
Nhp vo tn mt cun sch v t cho bit cun sch c hay khng?
Trong th vin, nu c th thng bo cc tc gi vit cun ny.
Li gii tham kho ca chng trnh qun l sch
Program Quan_ly_sach;
uses crt;
type str25=string[25];
trosach=^sach;
sach=record
tensach:string;
tiep:trosach;
end;
trotg=^tacgia;
tacgia=record
tentg:str25;
77
trai,phai:trotg;
dau,cuoi:trosach;
end;
const fi='tensach.txt';
var goc:trotg;
procedure lksach1(t:trotg);
var p:trosach;
begin
if t<>nil then p:=t^.dau else exit;
if p=nil then
begin
writeln('tg o co sach');exit;
end
else writeln(' sach cua ',t^.tentg,' la :');
while p<>nil do
begin
writeln(p^.tensach);
p:=p^.tiep;
end;
end;
function sosanh(s1,s2:str25):integer;
var i,J:integer;
begin
i:=1;
while(s1[i]=s2[i])and(i<length(s1))and(i<length(s2
)) do
inc(i);
if(length(s1)=length(s2))and(i=length(s1)) then
begin
sosanh:=0;
exit;
end;
if(s1[i]>s2[i])then sosanh:=1 else sosanh:=-1;
end;
function kttg(t:trotg;tuade:string):boolean;
var x:trosach;
begin
x:=t^.dau;
78
while(x<>nil)and(sosanh(x^.tensach,tuade)<>0)do
x:=x^.tiep;
if x=nil then kttg:=true else kttg:=false;
end;
procedure chen(t:trotg;tuade:string);
var p:trosach;
begin
if t^.dau=nil then
begin
new(p);
p^.tensach:=tuade;
p^.tiep:=nil;
t^.dau:=p;
t^.cuoi:=t^.dau;
end else if kttg(t,tuade) then
begin
new(p);
p^.tensach:=tuade;
p^.tiep:=nil;
t^.cuoi^.tiep:=p;
t^.cuoi:=p;
end;
end;
procedure bosung(var
goc:trotg;ten:str25;tuade:string);
var t,p:trotg;ps:trosach;
begin
if goc=nil then
begin
new(t);
t^.trai:=nil;t^.dau:=nil;t^.cuoi:=nil;
t^.phai:=nil;
t^.tentg:=ten;
goc:=t;
chen(goc,tuade);
end
else
79
if sosanh(goc^.tentg,ten)=0 then
chen(goc,tuade)else
if sosanh(ten,goc^.tentg)<0 then
bosung(goc^.trai,ten,tuade)
else bosung(goc^.phai,ten,tuade);
end;
procedure lietke(t:trotg);
begin
if t<>nil then
begin
lietke(t^.trai);
writeln('tac gia :',t^.tentg);
lietke(t^.phai);
end;
end;
procedure lktg(t:trotg;tuade:string);
begin
if t<>nil then
begin
lktg(t^.trai,tuade);
if kttg(t,tuade)=false then writeln('tac
gia :',t^.tentg);
lktg(t^.phai,tuade);
end;
end;
procedure timsach(goc:trotg;tuade:string;kq:boolean);
begin
if(goc<>nil) then
begin
if kttg(goc,tuade)=false then
begin
write(goc^.tentg,',');
kq:=true;
end;
timsach(goc^.trai,tuade,kq);
timsach(goc^.phai,tuade,kq);
80
end;
end;
procedure xuly(var t:trotg);
var f:text;
s,tuade:string;
tentg:str25;
kq:boolean;
begin
assign(f,fi);{khai bao ten file du lieu dau file
const fi neu sai thi sua}
reset(f);
t:=nil;
while not eof(f) do
begin
readln(f,s);
if s[1]='*' then tentg:=copy(s,2,length(s)-1);
if s[1]<>'*' then bosung(t,tentg,s);
end;
{lietke(t); }
close(f);
end;
function nut(t:trotg;ten:str25):trotg;
var p:trotg;
begin
if (sosanh(t^.tentg,ten)=0)or(t=nil) then nut:=t else
if sosanh(ten,t^.tentg)<0 then nut:=nut(t^.trai,ten)
else
nut:=nut(t^.phai,ten);
end;
procedure menu;
var ch:char; s:str25; ts:string;
begin
repeat
clrscr;
writeln;
TEXTCOLOR(4);
81
writeln(' CHUONG TRINH QUAN LY SACH VA TAC GIA:
' );
WRITELN;
WRITELN;
TEXTCOLOR(WHITE);
writeln(' Nhap thong tin khoi tao
[1]');
writeln(' Liet ke tac gia theo thu tu a,b,c:
[2]');
writeln(' Liet ke sach cua 1 tac gia:
[3]');
writeln(' Liet ke cac tac gia cua 1 cuon sach:
[4]');
writeln(' Thoat
[0]');
writeln;
write(' Ban cho so nao:[] ');
ch:=readkey;
case ch of
'1': begin
xuly(goc);
writeln;
writeln(' Da khoi tao xong:');
readln;
end;
'2': begin
writeln;
if goc=nil then writeln('Khong co tac gia
nao!')
else lietke(goc);
readln;
end;
'3':begin
writeln;
writeln('Nhap ten tac gia:');readln(s);
if nut(goc,s)=nil then
begin
82
writeln;
writeln('Tac gia nay khong co sach!');
end else
lksach1(nut(goc,s));
readln;
end;
'4':begin
writeln;
writeln('Nhap vao ten 1 cuon
sach:');readln(ts);
lktg(goc,ts);
readln;
end;
end;
until ch='0';
end;
begin
goc:=nil;
menu;
end.
83
CHNG 7: TH (GRAPH)
7.1. nh ngha v cc khi nim v th:
- Mt th G gm mt cp (V, E) trong : V l tp cc nt (hu hn), E l
tp cc cung (hu hn), k hiu: G(V,E).
- Ngi ta thng k hiu mt cung bi mt cp nh (V
1
, V
2
). Nu cung (V
1
,
V
2
) cung (V
2
, V
1
) th ta c th nh hng. Ngc li, nu th t cc nt trn cung
khng c coi trng ngha l (V
1
, V
2
) # (V
2
, V
1
) th ta c th khng nh hng.
- Cy l mt trng hp c bit ca th.
- nh V
1
c gi l ln cn vi V
2
nu tn ti cung (V
1
, V
2
) trong th G.
- Mt ng i t nh Vp n nh Vq trong th G nu tn ti cc cung:
(Vp, Vi
1
), (Vi
1
, Vi
2
)..., (Vi
n
, V
q
) thuc tp E. S lng cc cung trn ng i c
gi l di ca ng i.
V d: (2, 1, 3) l ng i c di 2 (Hnh 1).
(1, 2, 3) l ng i (Hnh 2).
- ng i n l ng i m mi nh trn (tr nh u v nh cui) u
l khc nhau.
- Chu trnh: L mt ng i n m nh u v nh cui trng nhau.
- Lin thng: Hai nh V
i
v V
j
c gi l lin thng nu tn ti mt ng i t
V
i
ti V
j
. th G c gi l lin thng nu mi cp nh phn bit trong th u
lin thng.
V d:
- Mt s th mi cung ngi ta gn thm mt gi tr th hin mt thng tin
no c lin quan ti cung (c gi l trng s ca cung). Trong trng hp ny,
th c gi l th c trng s.
84
3
1
2
4
Hnh 1: th nh hng
2
4
1
3
th khng lin thng
1
3 2
4
Hnh 2: th khng nh hng
7.2. Biu din th:
7.2.1. Biu din bng ma trn ln cn (ma trn k):
Xt mt th G(V, E) vi V gm c n nh (n 1) m gi s cc nh c
nh s th t theo mt quy nh no . Ma trn ln cn A biu din th G l mt
ma trn vung c kch thc n*n.
V d 1: A =

,
_

0 1 1 0 0
1 0 1 0 0
1 1 0 1 1
0 0 1 0 1
0 0 1 1 0
Nhn xt:
- Cc phn t ca ma trn ch c gi tr 0 hoc 1. Nu tn ti mt cung (i, j) th a
ij
= 1, ngc li th a
ij
= 0.
- i vi th khng nh hng th ma trn A l i xng. Cn i vi th
nh hng th ma trn A khng i xng.
V d 2: A =

,
_

0 0 0 0 0
1 0 1 0 0
0 0 0 1 0
1 0 0 0 0
0 1 0 1 0
Lu : i vi th c trng s c th biu din ma trn ny bng cch thay
s 1 bi trng s ca cung tng ng.
7.2.2. Biu din bng danh sch ln cn (danh sch k):
Trong cch biu din ny, n hng ca ma trn ln cn c thay i bi n danh
sch mc ni.
V d: Xt th khng nh hng trong v d 1 trn, ta c cc danh sch k:
85
2
5
1
4
3
2
5
1
4
3
2 3
V[1]
1 3
V[2]
1 2 4 5
V[3]
3 5
V[4]
3 4
V[5]
86
Nhn xt:
- Mi nh ca G c mt danh sch tng ng. Cc nt trong danh sch i (tr
bi V[i]) biu din cc nh ln cn ca nt i. Mi nt c dng:
nh Tip
- Mi danh sch i c mt nt u danh sch (V[i]), cc nt ny thng c t
chc thnh mt mng c th truy cp c nhanh.
Lu : Cc nt trong tng danh sch thng thng sp xp theo th t.
7.3. Php duyt mt th:
7.3.1. Tm kim theo chiu su:
Xt th khng nh hng v lin thng, php tm kim theo chiu su c
thc hin nh sau:
u tin thm nh V, sau thm nh W (nh ny cha c thm) l ln
cn ca V. By gi t W, mt php tm kim theo chiu su xut pht t W li c
thc hin. Khi mt nh U va () c thm m mi nh ln cn ca n c thm
ri th ta s quay ngc ln nh gn y va c thm (y l gii thut quay lui).
Php tm kim s kt thc khi khng cn mt nt no cha c thm m vn c th
ti c mt nt c thm.
V d:
T ta c th xy dng gii thut ca php duyt ny l nh sau:
Procedure Tim_Kiem_Sau(V);
1. Visited[V]:=1;
Write(V);
2. For <Mi nh W l ln cn ca V> do
If Visited[W]=0 then
Tim_Kiem_Sau(W);
Return;
Chng trnh chnh:
For i:=1 to n do { n l s nt ti a ca mng }
Visited[i]:=0;
Tim_Kiem_Sau(1); { Gi s th c nh 1 }
For i:=1 to n do
If Visited[i]=1 then Writeln(i);
=> Kt qu in ra s l nhng nh lin thng vi nh 1.
87
V
1
V
2
V
3
V
5
V
6
V
4
V
7
V
8
Th t duyt nh sau:
V1, V2, V4, V8, V5, V7, V3, V6
Lu :
- Trong th tc tm kim su, bc 1 ta c th b sung thm lnh chng t nt
V c thm (v d, lnh Write(V)). Lc ny chng trnh chnh ch cn thc hin
cc lnh:
Khi to cc phn t ca mng Visited bng 0.
Gi th tc Tim_Kiem_Sau(1).
- Chng trnh ny ch duyt qua tt c cc nt lin thng vi nt 1 m thi.
- Php duyt cy theo th tc tm kim theo chiu su tc l duyt theo th t
trc (i vi cy).
Bi tp:
Vit chng trnh bng Pascal th hin vic tm kim su trong mt th bng
2 cch biu din th (ma trn k, danh sch k).
7.3.2.Tm kim theo chiu rng:
Php tm kim theo chiu rng cng xut pht t mt nh V no nhng
khc vi php tm kim theo chiu su ch: cc nh l ln cn ca V m cha c
thm s c thm k tip nhau ri mi n cc nh cha c thm l ln cn ln
lt ca cc nh ny...
V d:
Gii thut tm kim theo chiu rng s da vo nguyn tc hng i
(Queue):
Procedure Tim_Kiem_Rong(V);
1. Visited[V]:=1;
2. <Khi to hng i Q rng>
Insert_Queue(Q, V); { Write (V); }
3. Repeat
Delete_Queue(Q, V);
For <Mi W ln cn ca V> do
If Visited[W]=0 then
Begin
Insert_Queue(Q, W);
88
V
1
V
2
V
3
V
5
V
6
V
4
V
7
V
8
Th t duyt nh sau:
V1, V2, V3, V4, V5, V6, V7, V8
Visited[W]:=1; { Write(W); }
End;
Until <Queue rng>;
Return;
Nhn xt:
- Tm kim theo chiu rng s dng cu trc hng i (Queue). Cn tm kim
theo chiu su s dng Stack ( quy).
- C 2 gii thut ny u c phc tp tnh ton O(n
2
).
Bi tp:
Vit chng trnh bng Pascal th hin vic tm kim theo chiu rng bng 2
cch biu din th.
7.4. Cy khung v cy khung vi gi cc tiu:
nh ngha: Khi mt th G(V, E) lin thng th mt php tm kim theo
chiu su hay chiu rng xut pht t mt nh no s cho php thm c mi
nh ca th. Trong trng hp ny, cc cung ca E s c phn thnh 2 tp:
Tp T bao gm tt c cc cung c dng ti hoc c duyt qua trong php
tm kim.
Tp B bao gm cc cung cn li.
Lc ny, tt c cc cung trong tp T cng vi cc nh tng ng to thnh mt
cy khung.
V d: Cy khung T ng vi v d trong tm kim theo chiu rng nh sau:
Cy khung T ng vi v d trong tm kim theo chiu su nh sau:
Nhn xt:
- Mt cy khung T cho ta mt th lin thng nhng khng tn ti chu trnh no
bn trong th ny.
- Khi ta b sung thm mt cung bt k vo mt cy khung th s xut hin mt
chu trnh.
- th c n nh th cy khung c n-1 cung.
ng dng (Xc nh cy khung vi gi cc tiu):
89
1
2 3
4 5 6 7
8
8
1
2 3
4 5 6 7
Xt bi ton sau:
Gi s cho 1 th lin thng c trng s, vn c t ra: Xc nh cy
khung vi gi cc tiu (cy khung m tng cc trng s trn cy khung l nh nht
so vi cc cy khung khc).
Gii quyt: Ta c th s dng gii thut ca Kruscal.
tng:
- Cc cung c xt a vo T da vo th t khng gim ca trng s tng
ng ca chng. Mt cung c a vo T nu n khng to nn chu trnh vi cc cung
c trong T.
- y, nu th c n nh th ch cn b sung n-1 cung.
Gii thut:
Procedure Kruscal(G);
1. T:= O; {T l tp cha cc cung}
2. While |T|<n-1 do
Begin
<Chn 1 cung (V, W) E c gi tr b nht>;
<Loi (V, W) khi E>;
If <(V, W) khng to nn chu trnh trong T> then
T:=T+{(V, W)}; {B sung cung (V, W) vo T}
End;
Return;
Bi thc hnh s 5
Xy dng cu trc th di dng mt danh sch a lin kt, vi d liu c
trch xut t mt file vn bn. T thc hin cc cng vic sau:
+ Duyt th theo chiu su
+ Duyt th theo chiu rng
+ Tm cy khung vi gi cc tiu.
Li gii tham kho
uses crt;
90
2
5
1
4
3
5
7
4
2
10
2
5
1
4
3
2
5
const MAX_DINH = 100; { so dinh cuc dai }
N = 100; { kich thuoc hang doi }
type
TroTrongSo = ^TrongSoRecord;
TrongSoRecord = record
key : byte;
weight : word;
next : TroTrongSo;
end;
TroDinh = ^DinhRecord;
DinhRecord = Record
key : byte;
down : TroDinh;
list : TroTrongSo;
end;
TroCanh = ^EdgeRecord;
EdgeRecord = record
source,des : byte;
weight : word;
next : TroCanh;
end;
KeyArrayType = array[1..MAX_DINH] of byte;
KhoangDinh = 0..MAX_DINH;
var
kingPointer : TroDinh;
f :text;
strFileName : string;
visited : array[1..MAX_DINH] of
boolean;
queueOfKey : KeyArrayType;
front,rear : KhoangDinh;
soDinhDoThi : KhoangDinh;
edgeSource,
edgeDestination : TroCanh;
choice : byte;
91
procedure writeTextXY(st:string;x,y:word);
begin
gotoxy(x,y);
write(st);
end;
procedure openFile(strFileName:string);
begin
assign(f,strFileName);
{$I-}
reset(f);
{$I+}
if IOResult<>0 then
repeat
clrscr;
writeTextXY('Khong tim thay file
''matranke.txt''',20,10);
writeTextXY('Hay chi ra duong dan cua file nay:
',20,11);
writeTextXY('-----------------------------------',
20,12);
gotoxy(20,14);
readln(strFileName);
if(strFileName='') then halt;
if pos(strFileName,'matranke.txt')=0 then
strFileName := strFileName + '\matranke.txt';
openFile(strFileName);
until IOResult=0;
end;
procedure closeFile;
begin
close(f);
end;
procedure createTroTrongSoList(var list:TroTrongSo);
begin
list:=nil;
92
end;
procedure addToTroTrongSoList(var list:TroTrongSo;
key: byte; weight: word);
var temp,p: TroTrongSo;
begin
new(temp);
temp^.key:=key;
temp^.weight:=weight;
temp^.next := nil;
if list=nil then list:= temp
else
begin
p:=list;
while p^.next<>nil do p:=p^.next;
p^.next:=temp;
end;
end;
procedure buildTrongSoList(var list:TroTrongSo);
var key:byte;
weight:word;
begin
key:=1;
createTroTrongSoList(list);
while not eoln(f) do
begin
read(f,weight);
if weight<>0 then
addToTroTrongSoList(list,key,weight);
inc(key);
end;
soDinhDoThi:=key-1;
readln(f);
end;
procedure traverseTrongSoList(list:TroTrongSo);
var p:TroTrongSo;
begin
93
p:=list;
while p<>nil do
begin
writeln(p^.key,' ',p^.weight);
p:=p^.next;
end;
end;
procedure createTroDinhList(var first:TroDinh);
begin
first:=nil;
end;
procedure addToTroDinhList(var first:TroDinh; key:
byte; list: TroTrongSo);
var temp,p:TroDinh;
begin
new(temp);
temp^.key:= key;
temp^.down:= nil;
temp^.list:= list;
if first=nil then first:= temp
else
begin
p:= first;
while p^.down<>nil do p:= p^.down;
p^.down:=temp;
end;
end;
procedure buildDinhList(var first:TroDinh);
var key:byte;
list:TroTrongSo;
begin
key:=1;
createTroDinhList(first);
while not eof(f) do
begin
94
buildTrongSoList(list);
addToTroDinhList(first,key,list);
inc(key);
end;
end;
function accessKey(first:TroDinh;key:byte):TroDinh;
var p:TroDinh;
begin
if first=nil then
begin
accessKey:=nil;
exit;
end;
p:=first;
while (p<>nil) and (p^.key<>key) do p:=p^.down;
accessKey:=p;
end;
procedure traverseDinhList(first:TroDinh);
var p:TroDinh;
begin
p:=first;
while p<>nil do
begin
write(p^.key,' ');
p:=p^.down;
end;
writeln;
end;
procedure depthTraverseDQ(first:TroDinh);
var p:TroTrongSo;
begin
if first<>nil then
begin
write(first^.key,' ');
visited[first^.key]:=true;
95
p:=first^.list;
while p<>nil do
begin
if not visited[p^.key] then
depthTraverseDQ(accessKey(first,p^.key));
p:=p^.next;
end;
end;
end;
procedure depthTraverse(first:TroDinh);
begin
if first=nil then exit;
fillchar(visited,soDinhDoThi,false);
clrscr;
window(20,10,80,24);
writeln('Ket qua duyet theo chieu sau: ');
writeln('------------------------------');
writeln;
depthTraverseDQ(first);
window(1,1,80,50);
readln;
end;
procedure insertQueue(var queue:KeyArrayType; var
f,r:KhoangDinh; key:byte);
begin
if (r mod N)+1=f then exit;
r := (r mod N)+1;
queue[r]:=key;
if f=0 then f:=1;
end;
procedure removeQueue(queue:KeyArrayType; var
f,r:KhoangDinh; var key:byte);
begin
if f=0 then exit;
key:=queue[f];
96
if f=r then
begin
f:=0;
r:=0;
end
else f:=(f mod N)+1;
end;
function isEmptyQueue:boolean;
begin
isEmptyQueue:=(front=0);
end;
procedure clearQueue;
begin
front:=0;
rear:=0;
end;
procedure wideTraverse(first:TroDinh);
var key:byte;
p:TroTrongSo;
ptrTroDinh:TroDinh;
begin
if first=nil then exit;
fillchar(visited,soDinhDoThi,false);
clearQueue;
insertQueue(queueOfKey,front,rear,first^.key);
visited[first^.key]:=true;
clrscr;
window(20,10,80,25);
writeln('Ket qua duyet theo chieu rong: ');
writeln('-------------------------------');
writeln;
write(first^.key,' ');
repeat
removeQueue(queueOfKey,front,rear,key);
ptrTroDinh:=accessKey(first,key);
97
p:=ptrTroDinh^.list;
while p<>nil do
begin
if not visited[p^.key] then
begin
visited[p^.key]:=true;
insertQueue(queueOfKey,front,rear,p^.key);
write(p^.key,' ');
end;
p:=p^.next;
end;
until isEmptyQueue;
window(1,1,80,50);
gotoxy(1,1);
readln;
end;
procedure addToTroCanhList(var list:TroCanh;
sour,des:byte; weight:word);
var temp,p:TroCanh;
begin
new(temp);
temp^.source:=sour;
temp^.des := des;
temp^.weight:=weight;
temp^.next:=nil;
if list=nil then list:=temp
else
begin
p:=list;
if list^.weight>weight then
begin
list:=temp;
temp^.next:=p;
exit;
end;
while p^.next<>nil do
98
begin
if p^.next^.weight>weight then break;
p:=p^.next;
end;
temp^.next:=p^.next;
p^.next:=temp;
end;
end;
procedure removeFromTroCanhList(var list:TroCanh;
source,des:byte);
var p,q:TroCanh;
begin
if list=nil then exit;
p:=list;
if (p^.source=source) and (p^.des=des) then
begin
list:=p^.next;
dispose(p);
exit;
end;
while p^.next<>nil do
begin
if (p^.next^.source=source) and (p^.next^.des=des)
then break;
p:=p^.next;
end;
if p^.next<>nil then
begin
q:=p^.next;
p^.next:=q^.next;
dispose(q);
end;
end;
procedure buildEdgeSource(var list:TroCanh;
first:TroDinh);
var ptrTroDinh:TroDinh;
99
p:TroTrongSo;
begin
if first=nil then exit;
ptrTroDinh:=first;
list:=nil;
while ptrTroDinh<>nil do
begin
p:=ptrTroDinh^.list;
while p<>nil do
begin
if ptrTroDinh^.key<p^.key then
addToTroCanhList(list,ptrTroDinh^.key,p^.key,p
^.weight);
p:=p^.next;
end;
ptrTroDinh:=ptrTroDinh^.down;
end;
end;
function numberOfEdges(list:TroCanh):byte;
var dem:byte;
p:TroCanh;
begin
dem:=0;
p:=list;
while p<>nil do
begin
inc(dem);
p:=p^.next;
end;
numberOfEdges:=dem;
end;
function
addressOfTroCanhList(list:TroCanh;source,des:byte):TroCanh
;
var p:TroCanh;
begin
100
p:=list;
while p<>nil do
begin
if (p^.source=source)and(p^.des=des) then break;
p:=p^.next;
end;
addressOfTroCanhList:=p;
end;
function
findEdgeInTroCanhList(list:TroCanh;source,des:byte):boolea
n;
var p:TroCanh;
begin
p:=list;
while p<>nil do
begin
if (p^.source=source)and(p^.des=des) then break;
p:=p^.next;
end;
findEdgeInTroCanhList:=(p<>nil);
end;
function findPath(list:TroCanh;
vertex1,vertex2:byte):boolean;
var lienThong:boolean;
i:byte;
begin
lienThong:=findEdgeInTroCanhList(list,vertex1,vertex
2);
findPath:=lienThong;
if lienThong then exit;
for i:=1 to soDinhDoThi do
if findEdgeInTroCanhList(list,vertex1,i) then
findPath:=findPath(list,i,vertex2);
end;
101
function
findVertexInTroCanhList(list:TroCanh;vertex:byte):boolean;
var p:TroCanh;
begin
p:=list;
while p<>nil do
begin
if (p^.source=vertex)or(p^.des=vertex) then break;
p:=p^.next;
end;
findVertexInTroCanhList:=(p<>nil);
end;
procedure buildEdgeDestination(var
edgeD:TroCanh;edgeS:TroCanh);
var p:TroCanh;
count:byte;
begin
if edgeS=nil then exit;
edgeD:=nil;
p:=edgeS;
count:=0;
while (count<soDinhDoThi-1) and (p<>nil) do
begin
if (not findVertexInTroCanhList(edgeD,p^.source))
or
(not findVertexInTroCanhList(edgeD,p^.des))
then
begin
addToTroCanhList(edgeD,p^.source,p^.des,p^.weigh
t);
inc(count);
end
else if not findPath(edgeD,p^.source,p^.des) then
begin
addToTroCanhList(edgeD,p^.source,p^.des,p^.weigh
t);
inc(count);
102
end;
p:=p^.next;
end;
end;
procedure traverseTroCanhList(list:TroCanh);
var p:TroCanh;
tongGiaTri:word;
begin
if list=nil then exit;
clrscr;
window(20,10,80,25);
writeln('Cay khung nho nhat: ');
writeln('-----------------------------');
writeln;
p:=list;
tongGiaTri:=0;
while p<>nil do
begin
tongGiaTri:=tongGiaTri+p^.weight;
writeln('Cung (',p^.source,', ',p^.des,') co
trong so: ',p^.weight);
p:=p^.next;
end;
writeln('-----------------------------');
writeln(' Tong gia tri la: ',tongGiaTri);
window(1,1,80,50);
gotoxy(1,1);
readln;
end;
procedure writeTextColorXY(st:string; color:byte;
x,y:byte);
begin
textcolor(color);
writeTextXY(st,x,y);
gotoxy(1,1);
end;
103
function menu(x0,y0:byte):byte;
var menuArray:array[1..5] of string[100];
y:byte;
ch:char;
i:byte;
x2,y2:byte;
x1,y1:byte;
dx,dy,dx1,dy1:integer;
width:byte;
titleMenu:string[100];
procedure dieuChinh(var x2,y2:byte;var dx:integer);
begin
if x2>x0+width-1 then
begin
x2:=x0+width-1;
inc(y2);
end;
if y2>y0+6 then
begin
y2:=y0+6;
dx:=-dx;
end;
if x2<x0 then
begin
x2:=x0;
dec(y2);
end;
if y2<y0-2 then
begin
y2:=y0-2;
dx:=-dx;
end;
end;
begin
menuArray[1]:='* 1. Xay dung cau truc do thi tu file
''MatranKe.txt''*';
104
menuArray[2]:='* 2. Duyet theo chieu sau
*';
menuArray[3]:='* 3. Duyet theo chieu rong
*';
menuArray[4]:='* 4. Tim cay khung nho nhat
*';
menuArray[5]:='* 5. Thoat
*';
clrscr;
titleMenu := '********************* MENU
**************************';
writeTextXY(titleMenu,x0,y0-2);
writeTextXY( '*
*',x0,y0-1);
writeTextXY( '*
*',x0,y0+5);
writeTextXY( '*************************************
****************',x0,y0+6);
for i:=1 to 5 do
writeTextXY(menuArray[i],x0,y0+i-1);
writeTextColorXY(copy(menuArray[1],3,length(menuArra
y[1])-3),RED,x0+2,y0);
y:=y0;
x2:=x0;
y2:=y0-2;
x1:=x0+2;
y1:=y2;
dx:=1;
dy:=1;
dx1:=1;
dy1:=1;
width:=length(menuArray[1]);
repeat
repeat
writeTextColorXY('*',WHITE,x2,y2);
if (x0+pos(' MENU',titleMenu)-1<=x2) and
(x2<=x0+pos(' **',titleMenu)-1) and (y2=y0-2) then
105
writeTextColorXY(titleMenu[x2-
x0+1],WHITE,x2,y2);
writeTextColorXY('*',WHITE,x1,y1);
if (x0+pos(' MENU',titleMenu)-1<=x1) and
(x1<=x0+pos(' **',titleMenu)-1) and (y1=y0-2) then
writeTextColorXY(titleMenu[x1-
x0+1],WHITE,x1,y1);
x2:=x2+dx;
x1:=x1+dx1;
dieuChinh(x2,y2,dx);
dieuChinh(x1,y1,dx1);
writeTextColorXY('*',BLACK,x2,y2);
writeTextColorXY('*',BLUE,x1,y1);
delay(7000);
until keypressed;
ch:=readkey;
if ord(ch)=0 then ch:=readkey;
case ch of
#72: begin
writeTextColorXY(menuArray[y-
y0+1],WHITE,x0,y);
dec(y);
end;
#80: begin
writeTextColorXY(menuArray[y-
y0+1],WHITE,x0,y);
inc(y);
end;
#13:begin menu:=y-y0+1; textColor(WHITE); exit;
end;
end;
if y>y0+4 then y:=y0;
if y<y0 then y:=y0+4;
writeTextColorXY(copy(menuArray[y-
y0+1],3,length(menuArray[y-y0+1])-3),RED,x0+2,y);
until false;
end;
106
procedure initialize;
begin
createTroDinhList(kingPointer);
edgeSource:=nil;
edgeDestination:=nil;
front:=0;
rear:=0;
end;
{ ************************** CHUONG TRINH CHINH
********************** }
BEGIN
initialize;
repeat
choice:=menu(15,10);
case choice of
1: begin
OpenFile('matranke.txt');
if kingPointer=nil then
buildDinhList(kingPointer);
clrscr;
writeTextXY('************* Da tao xong
************',20,10);
gotoxy(1,1);
readln;
end;
2: depthTraverse(kingPointer);
3: wideTraverse(kingPointer);
4: begin
buildEdgeSource(edgeSource,kingPointer);
buildEdgeDestination(edgeDestination,edgeSour
ce);
traverseTroCanhList(edgeDestination);
end;
5: exit;
end;
until false;
107
closeFile;
END.

108
CHNG 8: SP XP
8.1. t vn :
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo
mt th t nht nh. Yu cu v sp xp thng xuyn xut hin trong tin hc nhm
gip qun l d liu c d dng.
Cc gii thut sp xp c phn chia thnh 2 nhm chnh:
+Sp xp trong: Ton b d liu sp xp c a vo b nh trong. Do d
liu khng nhiu lm nhng ngc li thi gian sp xp nhanh.
+Sp xp ngoi: Mt phn d liu cn sp xp c a vo b nh trong, phn
cn li c lu tr b nh ngoi. Do c th sp xp d liu vi khi lng ln
nhng tin trnh sp xp s chm hn.
Ni chung, d liu c th xut hin di nhiu dng khc nhau. y ta quy
c tp i tng c sp xp l tp cc bn ghi. Tuy nhin, khi sp xp, thng
ngi ta ch quan tm n gi tr ca 1 trng no (gi l trng kho) v vic sp
xp c tin hnh da vo trng kho ny. n gin, y ta xem 1 bn ghi ch
cha 1 trng d liu c kiu s v th t sp xp theo chiu tng.
8.2. Mt s phng php sp xp n gin:
8.2.1. Sp xp kiu la chn:
Nguyn tc:
Ti mi bc i ta chn trong dy a
i+1
, ..., a
n
cc phn t ln hn a
i
, sau thc
hin hon i v tr ca chng vi a
i
(sao cho a
i
c gi tr nh nht (i =
1 , 1 n
)).
Gii thut:
Procedure Selection_Sort(a, n);
For i:=1 to n-1 do
For j:=i+1 to n do
If a[i]>a[j] then
<i ch a[i] v a[j]>;
Return;
8.2.2. Sp xp kiu chn:
Nguyn tc: Tng t nh khi sp bi tin ln. Chia lm 2 trng hp:
- Kt hp vic sp xp vi vic nhp d liu:
Procedure SapXep(a, n);
For i:=1 to n do
Begin
Readln(a[i]);
Chen(a[i]);
End;
109
Return;
Trong , ta c th tc Chen(X) nh sau:
Procedure Chen(X);
If i>1 then
Begin
j:=1;
While (a[j]<=X) and (j<=i-1) do j:=j+1;
If j<i then
Begin
For k:=i downto j+1 do
a[k]:=a[k-1];
a[j]:=X;
End;
End;
Return;
- Sp xp t mng c d liu:
Procedure Insert_Sort(a, n);
Const VoCuc = 10
6
;
1. a[0]:= -VoCuc;
2. For i:=2 to n do
Begin
X:=a[i]; j:=i-1;
While x<a[j] do
Begin
a[j+1]:=a[j]; j:=j-1;
End;
a[j+1]:=X;
End;
Return;
Lu : tng ca gii thut ny c th thc hin d dng hn nu s dng
danh sch mc ni lu dy s ny.
8.2.3. Sp xp kiu ni bt:
Procedure Bubble_Sort(a, n);
For i:=1 to n-1 do
For j:=n downto i+1 do
If a[j]<a[j-1] then
<i ch a[j] v a[j-1]>;
Return;
Nhn xt: C 3 gii thut trn u c phc tp tnh ton l O(n
2
).
8.3. Sp xp kiu phn on (Sp xp nhanh - quick sort):
110
Nguyn tc:
Chn ngu nhin mt phn t X ca dy (chng hn phn t u tin) v c
gng phn chia dy ny thnh 3 dy con lin tip nhau:
+ Dy 1: Gm nhng phn t nh hn X.
+ Dy 2: Gm nhng phn t bng X.
+ Dy 3: Gm nhng phn t ln hn X.
Sau p dng li gii thut ny cho dy con th nht v dy con th ba (dy
con ny c s phn t ln hn 1).
Procedure Quick_Sort(a, Be, Lon);
If Be<Lon then
Begin
1. i:=Be+1; j:=Lon; X:=a[Be];
2. Repeat
While (a[i]<X) and (i<=Lon) do i:=i+1;
If i>Lon then
Begin
<i ch a[Be] v a[Lon]>;
Quick_Sort(a, Be, Lon-1); Exit;
End;
While a[j]>X do j:=j-1;
If j=Be then
Begin
Quick_Sort(a, Be+1, Lon);
Exit;
End;
If i<=j then
Begin
<i ch a[j] v a[i]>;
i:=i+1;
j:=j-1;
End;
Until i>j;
<i ch a[Be] v a[j]>;
3. If Be<j then Quick_Sort (a, Be, j-1);
If Lon>i then Quick_Sort (a, i, Lon);
End;
Return;
Lu : Ti chng trnh chnh, sp xp mng a t phn t th nht n phn
t th n th ta gi th tc sp xp nh sau: Quick_Sort (a, 1, n);
111
- Ngi ta chng minh c trong trng hp xu nht, gii thut ny c
phc tp l O(nlog
2
n) (xem sch). Do , vi n kh ln gii thut Quick sort t ra hu
hiu hn cc gii thut n gin.
8.4. Sp xp kiu vun ng (Heap sort):
Nguyn tc: Vi phng php sp xp ny dy s c lu trong mng s
c coi nh l cu trc ca cy nh phn hon chnh.
- u tin, cy nh phn biu din s c sp xp to thnh mt ng (heap).
Ta gi l giai on to ng (ng l cy nh phn hon chnh m mi nt c gn
mt gi tr sao cho nt cha lun c gi tr ln hn hoc bng nt con). By gi gi tr
gc s l cc kho ln nht (gi l kha tri).
- Sau , cc ng tc sau y s c lp i lp li nhiu ln cho n khi cy ch
cn li mt l: a kha tri v v tr thc ca n (bng cch i ch cho kha cui
ng ang xt), sau vun li ng i vi cy gm cc kha cn li.
Lu :
Vn c t ra l: cn xy dng mt gii thut iu chnh mt cy thnh
mt ng vi gi thit rng cy con tri v cy con phi ca gc l ng.
Mt cch tng qut, ta c gii thut iu chnh li cy con ti i, bit rng cy
con tri (2i) v cy con phi (2i+1) l ng (gi s ng a c n phn t):
Procedure DieuChinh(a, i, n);
1. Key:=a[i];
j:=2*i; { j: ch s ch ti cy con tri ca i }
2. While j<=n do
Begin
If (j<n) and (a[j]<a[j+1]) then
j:=j+1; {Chn j v tr con ca i nhng
c gi tr ln nht}
If Key>=a[j] then {Cn thit cho ln
thc
hin sau ca vng
lp}
Begin
a[j div 2]:=Key;
Exit;
End;
a[j div 2]:=a[j];
j:=2*j;
End;
3. a[j div 2]:=Key;
Return;
112
Lc ny th tc sp xp theo kiu vun ng nh sau:
Procedure Heap_Sort(a, n);
1. {Giai on 1}
For i:=[n/2] downto 1 do
DieuChinh(a, i, n); {1 l c th xem nh l ng
cho nn th tc ny thc
hin
t trn l tr ln}
2. {Giai on 2}
For i:=n-1 downto 1 do
Begin
<i ch a[1] v a[i+1]>;
Dieuchinh(a, 1, i);
End;
Return;
Lu : Ngi ta cng chng minh c rng phc tp ca gii thut ny l
O(nlog
2
n).
8.5. Sp xp kiu trn (Merge sort):
- Php ho nhp 2 ng. Xt bi ton:
Gi s ta c mng X chia lm 2 phn c sp xp: (X
b
, X
b+1
,....,X
m
) v
(X
m+1
, X
m+2
,....,X
n
). Vit gii thut to ra mng Z c ch s t b ti n (Z
b
, Z
b+1
,....,Z
n
)
c sp xp.
Procedure Tron(X, b, m, n, Z);
1. i:=b; j:=m+1; k:=b;
2. While (i<=m) and (j<=n) do
Begin
If X[i]<=X[j] then
Begin
Z[k]:=X[i]; i:=i+1;
End
Else
Begin
Z[k]:=X[j]; j:=j+1;
End;
k:=k+1;
End;
3. If i>m then (Z[k], ..., Z[n]):=(X[j], ..., X[n]);
Else (Z[k], ..., Z[n]):=(X[i], ..., X[m]);
Return;
113
- Sp xp kiu ha nhp 2 ng trc tip: Sau y l th tc thc hin mt bc
sp xp kiu trn bng cch trn tng cp k cn nhau c di l L t mng X sang
mng Y, vi n l s phn t trong X.
Procedure Chuyen(X, Y, n, L);
1. i:=1;
2. While i<=n-2*L+1 do
Begin
Tron(X, i, i+L-1, i+2*L-1, Y); { i+2*L-1 <= n }
i:=i+2*l;
End;
3. {Trn phn cn d vi phn trc}
If i+L-1<n then Tron(X, i, i+L-1, n, Y)
Else (Y[i], ..., Y[n]):=(X[i], ..., X[n]);
Return;
=> T y ta c th suy ra th tc sp xp theo kiu trn nh sau:
Procedure Merge_Sort(X, Y, n);
1. L:=1;
2. While L<n do
Begin
Chuyen(X, Y, n, L);
L:=L*2;
X:=Y;
End;
Return;
Lu :
- Ngi ta chng minh c rng phc tp ca gii thut ny l O(nlog
2
n).
Tuy nhin, do phi to ra mng Y nn phng php ny tn b nh trong hn so vi 2
gii thut trn.
- Gii thut ny thng c p dng cho vic sp xp ngoi (c kt hp vi
file).
114
CHNG 9: TM KIM
9.1. Bi ton tm kim:
Tm kim l mt yu cu rt thng xuyn trong i sng hng ngy cng nh
trong tin hc. n gin ta xt bi ton tm kim nh sau:
Cho mt dy s gm cc phn t a
1
, a
2
, ..., a
n
. Cho bit trong dy ny c phn t
no c gi tr bng X (cho trc) hay khng?
9.2. Tm kim tun t:
Gii thut tm kim tun t c s dng mt bin logic, biu th mt phn t c
tn ti trong dy cn tm hay khng. y ta cng c th gii quyt theo cch khc:
Function TimKiemTT(a, n, X);
1. i:=1; a[n+1]:=X;
2. While a[i]<>X do i:=i+1;
If i=n+1 then TimKiemTT:=0
Else TimKiemTT:=i;
Return;
=> Hm ny s tr v gi tr l mt ch s i no trong dy nu tm thy, ngc
li hm s tr v gi tr 0.
Lu : Gii thut ny c phc tp l O(n).
9.3. Tm kim nh phn:
Vi gi thit ban u dy c sp theo th t tng dn. Gii thut tm kim
nh phn bng quy ta bit trong phn quy. Tuy nhin ta c th kh quy gii
thut ny nh sau:
Function TKNP(a, n, X);
1. Be:=1; Lon:=n;
2. While Be<=Lon do
Begin
Giua:=(Be+Lon) div 2;
If a[Giua]=X then
Begin
TKNP:=Giua; Exit;
End;
If a[Giua]<X then Be:=Giua+1
Else Lon:=Giua-1;
End;
3. TKNP:=0;
Return;
115
Lu : Gii thut ny c phc tp l O(log
2
n).
116
9.4. Cy nh phn tm kim:
Cy nh phn tm kim l cy c sp xp m ta bn n.
Bi ton: Gi s dy s trn c chuyn vo cy nh phn tm kim m nt
gc c tr bi T. Vn t ra: Vit mt hm CNPTK(T, X) tr v gi tr Nil nu
khng c nt no m trng Info c gi tr bng X, ngc li cho kt qu l con tr tr
vo phn t .
Function CNPTK(T, X);
1. q:=T;
2. While q<>Nil do
Case
q^.Info=X: Begin CNPTK:=q; Exit; End;
q^.Info<X: q:=q^.Right;
q^.Info>X: q:=q^.Left;
End Case;
3. CNPTK:=Nil;
Return;
Lu : Khi c sn cy nh phn tm kim, gii thut b sung mt nt vo cy
ny th ta xt. Nu cn loi b mt nt trong cy nh phn tm kim, ta xt cc
trng hp sau:
: Ch nt cn xo : Cy con
1. i) Xo nt l:
ii) Xo nt na l:
117
N
N
<N
B
A
Trc khi xa
B
A
Sau khi xa
Trc khi xa
B
A
C
B
A
C
B
A
Sau khi xa
C
hoc
- Xo 1 nt khng l l, khng l na l:
Gii thut: Gi s ta c hm b Bo(p):
Procedure XoaNut(Q);
1. {X l trong trng hp nt l v na l}
p:=Q;
If p^.Left=Nil then
Begin
R:=Bo(Q); R^.Left:=p^.Right;
Dispose(p); Exit;
End;
If p^.Right=Nil then
Begin
R:=Bo(Q); R^.Left:=p^.Left;
Dispose(p); Exit;
End;
{Trng hp Q l con phi ca b Q th x l tng t}
2. T:=p^.Left;
If T^.Right=Nil then
Begin
R:=Bo(Q); R^.Left:=T;
T^.Right:=p^.Right;
Dispose(p); Exit;
End;
S:=T^.Right;
While S^.Right<>Nil do
Begin
T:=S; S:=S^.Right;
End;
S^.Right:=p^.Right; T^.Right:=S^.Left;
118
A
B
D
C
E
F
Q, P
T
S
Trc khi xa
A
B
D
C
F
Sau khi xa
S^.Left:=p^.Left; R:=Bo(Q); R^.Left:=S;
Dispose(p);
Return;
119
TI LIU THAM KHO
[1] Cu trc d liu v gii thut ( Xun Li)
[2] Lp trnh nng cao bng PASCAL vi cc cu trc d liu (Larry Hoff -
L Minh Trung dch) - Tp 2
[3] Cm nang thut ton ( Robert Sedgewick) - 2 tp
[4] The Art of Computer Programming (Donald Knuth)
[5] Algorithm + Data Structure = Program (Niklaus Wirth)
120

You might also like