You are on page 1of 156

HC VIN CNG NGH BU CHNH VIN THNG

BI GING

K THUT LP TRNH

Bin son :

Ths. NGUYN DUY PHNG

Gii thiu mn hc

GII THIU MN HC

I. GII THIU CHUNG


S pht trin cng ngh thng tin trong nhng nm va qua lm thay i b mt
kinh t x hi ton cu, trong cng ngh phn mm tr thnh mt ngnh cng nghip
quan trng y tim nng. Vi s hi t ca cng ngh vin thng v cng ngh thng rin,
t trng v gi tr phn mm chim rt cao trong cc h thng vin thng cng nh cc thit
b u cui. Chnh v l do , vic nghin cu, tm hiu, tin ti pht trin cng nh lm
ch cc h thng phn mm ca cc k s in t vin thng l rt cn thit.
Ti liu ging dy K thut lp trnh cho h o to t xa c xy dng da trn
gio trnh K thut lp trnh c ging dy ti hc vin trong nhng nm qua vi
mc ch cung cp cho sinh vin nhng kin thc c bn nht, c tnh h thng lin quan
ti lp trnh.
Thng qua cun ti liu ny, chng ti mun gii thiu vi cc bn c v k nng
lp trnh cu trc v mt s thut ton quan trng, bao gm: i cng v lp trnh cu trc;
Duyt v qui; Ngn xp, hng i v danh sch mc ni; Cy; th v cui cng l Sp
xp v tm kim.

II. MC CH
Mn hc cung cp cho sinh vin k nng lp trnh trn cc cu trc d liu quan trng
nh: stack, queue mlink, tree & graph cng vi phng php phn tch, thit k, nh gi
thut ton.
Sau khi hc xong mn hc ny, sinh vin c kh nng vit c chng trnh gii
quyt nhng bi ton trong thc t.

III. PHM VI NGHIN CU


Nghin cu cc thut ton c bn c s dng trong thc t nh cc thut ton tm
kim, cc thut ton lin quan n th. Cc gii thut lp trnh da trn danh sch, cy
Nghin cu cch ci t cc thut ton trn my tnh.
Tm hiu cc lnh vc ng dng ca cc thut ton, phng php trong thc t.

IV. PHNG PHP NGHIN CU


hc tt mn hc ny, sinh vin cn lu nhng vn sau:
1. Kin thc cn trc

Li ni u
- Sinh vin phi c kin thc c bn v ton hc cao cp.
- Thnh tho t nht mt ngn ng lp trnh. c bit trong cun sch ny s dng
ngn ng lp trnh C m t thut ton, v vy sinh vin phi nm c ngn ng lp trnh C.
2. Cc ti liu cn c:
Sch hng dn hc tp K thut lp trnh. Ths. Nguyn Duy Phng, Hc vin
Cng ngh Bu chnh Vin thng, 2006.
Nu cn sinh vin nn tham kho thm:
- Gio trnh K thut lp trnh. Ts. L Hu Lp, Ths. Nguyn Duy Phng, Hc
vin Cng ngh Bu chnh Vin thng, 2002.
- Bi ging in t mn hc: K thut lp trnh ca Hc vin Cng ngh Bu
chnh Vin thng.
3. t ra mc tiu, thi hn cho bn thn
t ra cc mc tiu tm thi v thi hn cho bn thn v c gng thc hin chng
Xy dng mc tiu trong chng trnh nghin cu.
4 Nghin cu v nm nhng kin thc ct li
Sinh vin nn c qua sch hng dn hc tp trc khi nghin cu bi ging mn
hc v cc ti liu tham kho khc.
5. Tham gia y cc bui hng dn hc tp
Thng qua cc bui hng dn hc tp, ging vin s gip sinh vin nm c ni
dung tng th ca mn hc v gii p thc mc, ng thi sinh vin cng c th trao i,
tho lun vi nhng sinh vin khc v ni dung bi hc.
6. Ch ng lin h vi bn hc v ging vin
Cch n gin nht l tham d cc din dn hc tp trn mng Internet, qua c th
trao i trc tip cc vn vng mc vi ging vin hoc cc bn hc khc ang online.
7. T ghi chp li nhng chnh
Vic ghi chp li nhng chnh l mt hot ng ti hin kin thc, kinh nghim
cho thy n gip ch rt nhiu cho vic hnh thnh thi quen t hc v t duy nghin cu.
8. Hc i i vi hnh
Hc l thuyt n u thc hnh lm bi tp v thc hnh ngay n hiu v nm
chc l thuyt. Sinh vin cn ci t trn my tnh cc thut ton trong bi hc bng cc ngn
ng lp trnh t c th hiu v nm chc hn t tng v ni dung ca thut ton.
H Ni, ngy 20 thng 02 nm 2006
Ths. Nguyn Duy Phng

Chng 1: i cng v k thut lp trnh cu trc

CHNG 1: I CNG V K THUT LP


TRNH CU TRC

Ni dung chnh ca chng ny tp chung lm sng t nhng nguyn l c bn ca


lp trnh cu trc. Nhng nguyn l ny c coi nh nn tng t tng ca phng php
lp trnh cu trc c tch hp trong cc ngn ng lp trnh. Nm vng cc nguyn l
ca lp trnh cu trc khng ch gip ngi hc c cch tip cn ngn ng lp trnh nhanh
chng m con gip h cch t duy trong khi xy dng cc h thng ng dng. Cc nguyn
l c bn c gii thiu trong chng ny bao gm:
9 Nguyn l lnh - lnh c cu trc - cu trc d liu.
9 Nguyn l ti thiu.
9 Nguyn l a phng.
9 Nguyn l an ton.
9 Nguyn l nht qun.
9 Nguyn l Top-Down .
9 Nguyn l Botton-Up.
Bn c c th tm c nhng chi tit su hn v rng hn trong ti liu [1] & [6].

1.1. S LC V LCH S LP TRNH CU TRC


Lp trnh l mt trong nhng cng vic nng nhc nht ca khoa hc my tnh. C
th ni, nng sut xy dng cc sn phm phn mm l rt thp so vi cc hot ng tr tu
khc. Mt sn phm phn mm c th c thit k v ci t trong vng 6 thng vi 3 lao
ng chnh. Nhng kim tra tm li v tip tc hon thin sn phm phi mt thm
chng 3 nm. y l hin tng ph bin trong tin hc ca nhng nm 1960 khi xy dng
cc sn phm phn mm bng k thut lp trnh tuyn tnh. khc phc tnh trng li ca
sn phm, ngi ta che chn n bi mt mnh che mang tnh cht thng mi c gi l
Version. Thc cht, Version l vic thay th sn phm c bng cch sa i n ri cng b
di dng mt Version mi, ging nh: MS-DOS 4.0 ch tn ti trong thi gian vi thng
ri thay i thnh MS-DOS 5.0, MS-DOS 5.5, MS-DOS 6.0 . . . y khng phi l mt sn
phm mi nh ta tng m trong n cn tn ti nhng li khng th b qua c, v ngay
MS-DOS 6.0 cng ch l s khc phc hn ch ca MS-DOS 3.3 ban u.
Trong thi k u ca tin hc, cc lp trnh vin xy dng chng trnh bng cc
ngn ng lp trnh bc thp, qu trnh np v theo di hot ng ca chng trnh mt cch
trc tip trong ch trc tuyn (on-line). Vic tm v sa li (debbugging) nh ngy nay
l khng th thc hin c. Do vy, trc nhng nm 1960, ngi ta coi vic lp trnh
3

Chng 1: i cng v k thut lp trnh cu trc


ging nh nhng hot ng ngh thut nhum mu sc c nhn hn l khoa hc. Mt s
ngi nm c mt vi ngn ng lp trnh, cng mt s mo vt tn dng cu hnh vt l
c th ca h thng my tnh, to nn mt s sn phm l ca phn mm c coi l mt
chuyn gia nm bt c nhng b n ca ngh thut lp trnh.
Cc h thng my tnh trong giai on ny c cu hnh yu, b nh nh, tc cc
thit b vo ra thp lm chm qu trnh np v thc hin chng trnh. Chng trnh c
xy dng bng k thut lp trnh tuyn tnh m ni bt nht l ngn ng lp trnh Assembler
v Fortran. Vi phng php lp trnh tuyn tnh, lp trnh vin ch c php th hin
chng trnh ca mnh trn hai cu trc lnh, l cu trc lnh tun t (sequential) v
nhy khng iu kin (goto). H thng th vin vo ra ngho nn lm cho vic lp trnh tr
nn kh khn, chi ph cho cc sn phm phn mm qu ln, tin cy ca cc sn phm
phn mm khng cao dn ti hng lot cc d n tin hc b tht bi, c bit l cc h thng
tin hc c tm c ln. Nm 1973, Hoare khng nh, nguyn nhn tht bi m ngi M
gp phi khi phng v tinh nhn to v pha sao V n (Sao Kim) l do li ca chng trnh
iu khin vit bng Fortran. Thay v vit:
DO 50 I = 12, 523
(Thc hin s 50 vi I l 12, 13, ..., 523)
Lp trnh vin (hoc thao tc vin c ba) vit thnh:
DO 50 I = 12.523
(Du phy thay bng du chm)
Gp cu lnh ny, chng trnh dch ca Fortran hiu l gn gi tr thc 12.523
cho bin DO 50 I lm cho kt qu chng trnh sai.
gii quyt nhng vng mc trong k thut lp trnh, cc nh tin hc l thuyt
i su vo nghin cu tm hiu bn cht ca ngn ng, thut ton v hot ng lp trnh,
nng ni dung ca k thut lp trnh ln thnh cc nguyn l khoa hc ngy nay. Kt qu
ni bt nht trong giai on ny l Knuth xut bn b 3 tp sch mang tn Ngh thut lp
trnh gii thiu ht sc t m c s l thuyt m bo ton hc v cc thut ton c bn x
l d liu na s, sp xp v tm kim. Nm 1968, Dijkstra cng b l th V s nguy hi
ca ton t goto. Trong cng trnh ny, Dijkstra khng nh, c mt s li do goto gy nn
khng th xc nh c im bt u ca li. Dijkstra cn khng nh thm: Tay ngh
ca mt lp trnh vin t l nghch vi s lng ton t goto m anh ta s dng trong
chng trnh, ng thi ku gi hu b trit ton t goto trong mi ngn ng lp trnh
ngoi tr ngn ng lp trnh bc thp. Dijkstra cn a ra khng nh, ng thi ca chng
trnh c th c nh gi tng minh qua cc cu trc lp, r nhnh, gi qui l c s
ca lp trnh cu trc ngy nay.
Nhng kt qu c Dijikstra cng b to nn mt cuc cch mng trong k
thut lp trnh, Knuth lit k mt s trng hp c li ca goto nh vng lp kt thc gia
chng, bt li . . ., Dijkstra, Hoare, Knuth tip tc pht trin t tng coi chng trnh my
tnh cng vi lp trnh vin l i tng nghin cu ca k thut lp trnh v phng php
4

Chng 1: i cng v k thut lp trnh cu trc


lm ch s phc tp ca cc hot ng lp trnh. Nm 1969, Hoare pht biu cc tin
phc v cho vic chng minh tnh ng n ca chng trnh, pht hin tnh bt bin ca
vng lp bng cch coi chng trnh va l bn m ho thut ton ng thi l bn chng
minh tnh ng n ca chng trnh. Sau Dahl, Hoare, Dijiksta pht trin thnh ngn
ng lp trnh cu trc.
trin khai cc nguyn l lp trnh cu trc, L. Wirth thit k v ci t ngn
ng ALGOL W l mt bin th ca ALGOL 60. Sau ny, L. Wirth tip tc hon thin
tr thnh ngn ng lp trnh Pascal. y l ngn ng lp trnh gin d, sng sa v c php,
d minh ha nhng vn phc tp ca lp trnh hin i v c coi l mt chun mc
trong ging dy lp trnh.
Nm 1978, Brian Barninghan cng Denit Ritche thit k ngn ng lp trnh C vi ti
thiu cc cu trc lnh v hm kh ph hp vi t duy v tm l ca ca ngi lp trnh.
ng thi, hai tc gi pht hnh phin bn h iu hnh UNIX vit ch yu bng ngn
ng C, khng nh thm uy th ca C trong lp trnh h thng.

1.2. CU TRC LNH, LNH C CU TRC, CU TRC D LIU


1.2.1. Cu trc lnh (cu trc iu khin)
Mi chng trnh my tnh v bn cht l mt bn m ho thut ton. Thut ton
c coi l dy hu hn cc thao tc s cp trn tp i tng vo (Input) nhm thu c
kt qu ra (output). Cc thao tc trong mt ngn ng lp trnh c th c iu khin bi
cc lnh hay cc cu trc iu khin, cn cc i tng chu thao tc th c m t v biu
din thng qua cc cu trc d liu.
Trong cc ngn ng lp trnh cu trc, nhng cu trc lnh sau c s dng xy
dng chng trnh. D nhin, chng ta s khng bn ti cu trc nhy khng iu kin goto
mc d ngn ng lp trnh cu trc no cng trang b cu trc lnh goto.
Cu trc tun t

cu lnh
A; GOTO.

Cu trc r nhnh dng y


If (E) A;

Else B;

B;

Sau khi thc hin lnh A th thc hin lnh B

Nu biu thc E c gi tr ng (khc 0) th


thc hin A; Nu E sai th thc hin B;

Hnh 1.1: Cu trc tun t v cu trc r nhnh dng y


5

Chng 1: i cng v k thut lp trnh cu trc

Cu trc lp vi iu kin trc

Cu trc lp vi iu kin sau

While (E) A;

do
A

E
S

A;

while (E);

Trong khi biu thc E cn c gi tr ng th


thc hin A;

Thc hin A cho ti khi no E vn cn


ng;

Cu trc lp FOR
For (E1; E2;E3)
E1

A;

E3

E2

Hnh 1.2. Cc cu trc lp


A, B : k hiu cho cc cu lnh n hoc lnh hp thnh. Mi lnh n l c gi l
mt lnh n, lnh hp thnh l lnh hay cu trc lnh c ghp li vi nhau theo qui nh
ca ngn ng, trong Pascal l tp lnh hay cu trc lnh c bao trong thn ca begin . . .
end; trong C l tp cc lnh hay cu trc lnh c bao trong hai k hiu { ... }.
E, E1, E2, E3 l cc biu thc s hc hoc logic. Mt s ngn ng lp trnh coi gi tr
ca biu thc logic hoc ng (TRUE) hoc sai (FALSE), mt s ngn ng lp trnh khc
nh C coi gi tr ca biu thc logic l ng nu n c gi tr khc 0, ngc li biu thc
logic c gi tr sai.
Cn lu rng, mt chng trnh c th hin bng cc cu trc iu khin lnh :
tun t, tuyn chn if..else, switch . . case .. default, lp vi iu kin trc while , lp vi
iu kin sau do . . while, vng lp for bao gi cng chuyn c v mt chng trnh, ch
s dng ti thiu hai cu trc lnh l tun t v lp vi iu kin trc while. Phng php
lp trnh ny cn c gi l phng php lp trnh hn ch.

Chng 1: i cng v k thut lp trnh cu trc


1.2.2. Lnh c cu trc
Lnh c cu trc l lnh cho php cha cc cu trc iu khin trong n. Khi tm hiu
mt cu trc iu khin cn xc nh r v tr c php t mt cu trc iu khin trong
n, cng nh n l mt phn ca cu trc iu khin no. iu ny tng nh rt tm
thng nhng c ngha ht sc quan trng trong khi xy dng v kim tra li c th xy
ra trong chng trnh. Nguyn tc vit chng trnh theo cu trc: Cu trc con phi c
vit lt trong cu trc cha, im vo v im ra ca mi cu trc phi nm trn cng mt
hng dc. V d sau s minh ha cho nguyn tc vit chng trnh:
if (E)
while (E1)
A;
else
do
B;
while(E2);

Trong v d trn, while (E1) A; l cu trc con nm trong thn ca cu trc cha l if
(E) ; cn do B while(E2); l cu trc con trong thn ca else. Do vy, cu lnh while(E1);
do . . . while(E2) c cng cp vi nhau nn n phi nm trn cng mt ct, tng t nh
vy vi A, B v if vi else.
1.2.3. Cu trc d liu
Cc ngn ng lp trnh cu trc ni chung u ging nhau v cu trc lnh v cu
trc d liu. im khc nhau duy nht gia cc ngn ng lp trnh cu trc l phng php
t tn, cch khai bo, c php cu lnh v tp cc php ton c php thc hin trn cc
cu trc d liu c th. Nm bt c nguyn tc ny, chng ta s d dng chuyn i cch
th hin chng trnh t ngn ng lp trnh ny sang ngn ng lp trnh khc mt cnh
nhanh chng m khng tn qu nhiu thi gian cho vic hc tp ngn ng lp trnh.
Thng thng, cc cu trc d liu c phn thnh hai loi: cu trc d liu c kiu
c bn (Base type) v cu trc d liu c kiu do ngi dng nh ngha (User type) hay
cn gi l kiu d liu c cu trc. Kiu d liu c bn bao gm: Kiu k t (char), kiu s
nguyn c du (signed int), kiu s nguyn khng du (unsigned int), kiu s nguyn di c
du (signed long), kiu s nguyn di khng du (unsigned long ), kiu s thc (float) v
kiu s thc c chnh xc gp i (double).
Kiu d liu do ngi dng nh ngha bao gm kiu xu k t (string), kiu mng
(array), kiu tp hp (union), kiu cu trc (struct), kiu file, kiu con tr (pointer) v cc
kiu d liu c nh ngha mi hon ton nh kiu danh sch mc ni (link list), kiu cy
(tree) . . .
Kch c ca kiu c bn ng ngha vi min xc nh ca kiu vi biu din nh
phn ca n, v ph thuc vo tng h thng my tnh c th. xc nh kch c ca kiu
nn dng ton t sizeof( type). Chng trnh sau s lit k kch c ca cc kiu c bn.
7

Chng 1: i cng v k thut lp trnh cu trc


V d 1.1. Kim tra kch c ca kiu.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(void) {
printf(\n Kch c kiu k t:%d, sizeof(char));
printf(\n Kch c kiu k t khng du:%d, sizeof(unsigned char));
printf(\n Kch c kiu s nguyn khng du:%d, sizeof(unsigned int));
printf(\n Kch c kiu s nguyn c du:%d, sizeof(signed int));
printf(\n Kch c kiu s nguyn di khng du:%d, sizeof(unsigned long ));
printf(\n Kch c kiu s nguyn di c du:%d, sizeof(signed long ));
printf(\n Kch c kiu s thc c chnh xc n:%d, sizeof(float ));
printf(\n Kch c kiu s thc c chnh xc kp:%d, sizeof(double ));
getch();
}

Kch c ca cc kiu d liu do ngi dng nh ngha l tng kch c ca mi kiu


thnh vin trong n. Chng ta cng vn dng ton t sizeof(tn kiu) xc nh ln tnh
theo byte ca cc kiu d liu ny.
Mt im c bit ch trong khi lp trnh trn cc cu trc d liu l cu trc d liu
no th phi km theo php ton , v mt bin c gi l thuc kiu d liu no nu
nh n nhn mt gi tr t min xc nh ca kiu v cc php ton trn kiu d liu .

1.3. NGUYN L TI THIU


Hy bt u t mt tp nguyn tc v ti thiu cc phng tin l cc cu trc lnh, kiu
d liu cng cc php ton trn n v thc hin vit chng trnh. Sau khi nm chc nhng
cng c vng u mi t vn m rng sang h thng th vin tin ch ca ngn ng.
Khi lm quen vi mt ngn ng lp trnh no , khng nht thit phi l thuc qu
nhiu vo h thng th vin hm ca ngn ng, m iu quan trng hn l trc mt bi
ton c th, chng ta s dng ngn ng gii quyt n th no, v phng n tt nht l
lp trnh bng chnh h thng th vin hm ca ring mnh. Do vy, i vi cc ngn ng
lp trnh, chng ta ch cn nm vng mt s cc cng c ti thiu nh sau:
1.3.1. Tp cc php ton
Tp cc php ton s hc: + (cng); - (tr); * (nhn); % (ly phn d); / (chia).
Tp cc php ton s hc m rng:
++a

a = a +1; // tng gi tr bin nguyn a ln mt n v;

--a

a = a-1; //gim gi tr bin nguyn a mt n v;

a+= n a = a+n; // tng gi tr bin nguyn a ln n n v;


8

Chng 1: i cng v k thut lp trnh cu trc


a-=n

a = a - n; // gim gi tr bin nguyn a n n v);

a%=n a = a%n; // ly gi tr bin a modul vi n;


a/=n

a=a/n;// ly gi tr bin a chia cho n;

a*=n

a = a*n; // ly gi tr bin a nhn vi n;

Tp cc php ton so snh:


>, <, >=, <=, ==, != ( ln hn, nh hn, ln hn
hoc bng, nh hn hoc bng, ng bng, khc). Qui tc vit c th hin nh sau:
if ( a>b) { . . } // nu a ln hn b
if ( a<b) { . . } // nu a nh hn b
if ( a>=b) { . . } // nu a ln hn hoc bng b
if ( a<=b) { . . } // nu a nh hn hoc bng b
if ( a==b) { . . } // nu a ng bng b
if ( a!=b) { . . } // nu a khc b
Tp cc php ton logic: &&, ||, ! (v, hoc, ph nh)
&&: Php v logic ch cho gi tr ng khi hai biu thc tham gia u c gi tr
ng (gi tr ng ca mt biu thc trong C c hiu l biu thc c gi tr khc 0).
||: Php hoc logic ch cho gi tr sai khi c hai biu thc tham gia u c gi
tr sai.
!: Php ph nh cho gi tr ng nu biu thc c gi tr sai v ngc li cho
gi tr sai khi biu thc c gi tr ng. Ng ngha ca cc php ton c minh ha
thng qua cc cu lnh sau:
int a =3, b =5;
if ( (a !=0) && (b!=0) ) // nu a khc 0 v b khc 0
if ((a!=0) || (b!=0))

// nu a khc 0 hoc b khc 0

if ( !a )

// ph nh a khc 0

if (a==b)

// nu a ng bng b

Cc ton t thao tc bt (khng s dng cho float v double)


&

: Php hi cc bt.

: Php tuyn cc bt.

: Php tuyn cc bt c loi tr.

<<

: Php dch tri (dch sang tri n bt gi tr 0)

>>

: Php dch phi (dch sang phi n bt c gi tr 0)

: Php ly phn b.

Chng 1: i cng v k thut lp trnh cu trc


V d 1.2: Vit chng trnh kim tra cc ton t thao tc bt.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(void){
unsigned int a=3, b=5, c; clrscr();
c = a & b; printf(\n c = a & b=%d,c);
c = a | b; printf(\n c = a | b=%d,c);
c = a ^ b; printf(\n c = a ^ b=%d,c);
c = ~a; printf(\n c = ~a =%d,c);
c = a << b; printf(\n c = a << b=%d,c);
c = a >>b; printf(\n c = a >> b=%d,c);
getch();
}

Ton t chuyn i kiu: Ta c th dng ton t chuyn i kiu nhn c kt qu


tnh ton nh mong mun. Qui tc chuyn i kiu c thc hin theo qui tc: (kiu) bin.
V d 1.3: Tnh gi tr php chia hai s nguyn a v b.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
void main(voi)(
int a=3, b=5; float c;
c= (float) a / (float) b;
printf(\n thng c = a / b =%6.2f, c);
getch();
}

Th t u tin cc php ton : Khi vit mt biu thc, chng ta cn lu ti th t


u tin tnh ton cc php ton, cc bng tng hp sau y phn nh trt t u tin tnh ton
ca cc php ton s hc v php ton so snh.
Bng tng hp th t u tin tnh ton cc php ton s hc v so snh

TN TON T

CHIU TNH TON

( ), [] , ->

L -> R

- , ++, -- , ! , ~ , sizeof()

R -> L

* , /, %

L -> R

10

Chng 1: i cng v k thut lp trnh cu trc


+, -

L -> R

>>, <<

L -> R

<, <=, > , >=,

L -> R

== !=

L -> R

&

L -> R

L -> R

L -> R

&&

L -> R

||

L -> R

?:

R -> L

=, +=, -=, *=, /=, %=, &=, ^=, |=, <<=, >>=

R -> L

1.3.2. Tp cc lnh vo ra c bn
Nhp d liu t bn phm: scanf(format_string, . . ., &parameter . . .);
Nhp d liu t tp: fscanf( file_pointer,format_string, . . ., &parameter, . . .);
Nhn mt k t t bn phm: getch(); getchar();
Nhn mt k t t file: fgetc(file_pointer, character_name);
Nhp mt string t bn phm: gets(string_name);
Nhn mt string t file text : fgets(string_name, number_character, file_pointer);
Xut d liu ra mn hnh: printf(format_string . . ., parameter . . .);
Xut d liu ra file : fprintf(file_pointer, format_string . . ., parameter. . .);
Xut mt k t ra mn hnh: putch(character_name);
Xut mt k t ra file: fputc(file_pointer, character_name);
Xut mt string ra mn hnh: puts(const_string_name);
Xut mt string ra file: fputs(file_pointer, const_string_name);
1.3.3. Thao tc trn cc kiu d liu c cu trc
Tp thao tc trn string:
char *strchr(const char *s, int c) : tm k t c u tin xut hin trong xu s;
char *stpcpy(char *dest, const char *src) : copy xu scr vo dest;

11

Chng 1: i cng v k thut lp trnh cu trc


int strcmp(const char *s1, const char *s2) : so snh hai xu s1 v s2 theo th t t
in, nu s1 < s2 th hm tr li gi tr nh hn 0. Nu s1>s2 hm tr li gi tr
dng. Nu s1==s2 hm tr li gi tr 0.
char *strcat(char *dest, const char *src) : thm xu scr vo sau xu dest.
char *strlwr(char *s) : chuyn xu s t k t in hoa thnh k t in thng.
char *strupr(char *s): chuyn xu s t k t thng hoa thnh k t in hoa.
char *strrev(char *s): o ngc xu s.
char *strstr(const char *s1, const char *s2): tm v tr u tin ca xu s2 trong xu s1.
int strlen(char *s): cho di ca xu k t s.
Tp thao tc trn con tr:
Thao tc ly a ch ca bin: & parameter_name;
Thao tc ly ni dung bin (bin c kiu c bn): *pointer_name;
Thao tc tr ti phn t tip theo: ++pointer_name;
Thao tc tr ti phn t th n k t v tr hin ti: pointer_name = pointer_name +n;
Thao tc tr ti phn t sau con tr k t v tr hin ti: --pointer_name;
Thao tc tr ti phn t sau n phn t k t v tr hin ti:
Pointer_name = pointer_name - n;
Thao tc cp pht b nh cho con tr:
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
Thao tc cp pht li b nh cho con tr : void *realloc(void *block, size_t size);
Thao tc gii phng b nh cho con tr: void free(void *block);
Tp thao tc trn cu trc:
nh ngha cu trc:
struct struct_name{
type_1 parameter_name_1;
type_2 parameter_name_2;
......................
type_k parameter_name_k;
} struct_parameter_name;
Php truy nhp ti thnh phn cu trc:

12

Chng 1: i cng v k thut lp trnh cu trc


struct_parameter_name.parameter_name.
Php gn hai cu trc cng kiu:
struct_parameter_name1 = struct_parameter_name2;
Php tham tr ti thnh phn ca con tr cu trc:
pointer_struct_parameter_name -> struct_parameter_name.
Tp thao tc trn file:
Khai bo con tr file: FILE * file_pointer;
Thao tc m file theo mode: FILE *fopen(const char *filename,const char *mode);
Thao tc ng file: int fclose(FILE *stream);
Thao tc c tng dng trong file: char *fgets(char *s, int n, FILE *stream);
Thao tc c tng khi trong file:
size_t fread(void *ptr, size_t size,size_t n, FILE *stream);
Thao tc ghi tng dng vo file: int fputs(const char *s, FILE *stream);
Thao tc ghi tng khi vo file:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);
Thao tc kim tra s tn ti ca file: int access(const char *filename, int amode);
Thao tc i tn file: int rename(const char *oldname,const char *newname);
Thao tc loi b file: int unlink(const char *filename);

1.4. NGUYN L A PHNG

Cc bin a phng trong hm, th tc hoc chu trnh cho d c trng tn


vi bin ton cc th khi x l bin trong hm hoc th tc vn khng lm
thay i gi tr ca bin ton cc.

Tn ca cc bin trong i ca hm hoc th tc u l hnh thc.

Mi bin hnh thc truyn theo tr cho hm hoc th tc u l cc bin a


phng.

Cc bin khai bo bn trong cc chng trnh con, hm hoc th tc u l


bin a phng.

Khi phi s dng bin ph nn dng bin a phng v hn ch ti a vic


s dng bin ton cc trnh xy ra cc hiu ng ph.

V d hon i gi tr ca hai s a v b sau y s minh ha r hn v nguyn l a


phng.
V d 1.4. Hon i gi tr ca hai bin a v b.
13

Chng 1: i cng v k thut lp trnh cu trc


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
int a, b; // khai bo a, b l hai bin ton cc.
void Swap(void) {
int a,b, temp; // khai bo a, b l hai bin a phng
a= 3; b=5; // gn gi tr cho a v b
temp=a; a=b; b=temp;// i gi tr ca a v b
printf(\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {
a=1; b=8; // khi u gi tr cho bin ton cc a, b.
Swap();
printf(\n Kt qu sau khi thc hin th tc a =%5d b=%5d,a,b);
getch();
}

Kt qu thc hin chng trnh:


Kt qu thc hin trong th tc a = 5 b=3
Kt qu sau khi thc hin th tc a = 1 b =8
Trong v d trn a, b l hai bin ton cc, hai bin a, b trong th tc Swap l hai bin
cc b. Cc thao tc trong th tc Swap gn cho a gi tr 3 v b gi tr 5 sau thc hin
i gi tr ca a =5 v b =3 l cng vic x l ni b ca th tc m khng lm thay i gi
tr ca bin ton cc ca a, b sau thi thc hin xong th tc Swap. Do vy, kt qu sau khi
thc hin Swap a = 1, b =8; iu chng t trong th tc Swap cha bao gi s dng ti
hai bin ton cc a v b. Tuy nhin, trong v d sau, th tc Swap li lm thay i gi tr ca
bin ton cc a v b v n thao tc trc tip trn bin ton cc.
V d 1.5. i gi tr ca hai bin a v b
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <io.h>
int a, b; // khai bo a, b l hai bin ton cc.
void Swap(void) {
int temp; // khai bo a, b l hai bin a phng
a= 3; b=5; // gn gi tr cho a v b
temp=a; a=b; b=temp;// i gi tr ca a v b
printf(\n Kt qu thc hin trong th tc a=%5d b=%5d:,a,b);
}
void main(void) {

14

Chng 1: i cng v k thut lp trnh cu trc


a=1; b=8; // khi u gi tr cho bin ton cc a, b.
Swap();
printf(\n Kt qu sau khi thc hin th tc a =%5d b=%5d,a,b);
getch();
}

Kt qu thc hin chng trnh:


Kt qu thc hin trong th tc a = 8 b=1
Kt qu sau khi thc hin th tc a = 1 b =8

1.5. NGUYN L NHT QUN

D liu th no th phi thao tc th y. Cn sm pht hin nhng mu thun


gia cu trc d liu v thao tc kp thi khc phc.

Nh chng ta bit, kiu l mt tn ch tp cc i tng thuc min xc nh cng


vi nhng thao tc trn n. Mt bin khi nh ngha bao gi cng thuc mt kiu xc nh
no hoc l kiu c bn hoc kiu do ngi dng nh ngha. Thao tc vi bin ph
thuc vo nhng thao tc c php ca kiu. Hai kiu khc nhau c phn bit bi tn,
min xc nh v cc php ton trn kiu d liu. Tuy nhin, trn thc t c nhiu li nhp
nhng gia php ton v cu trc d liu m chng ta cn hiu r.
i vi kiu k t, v nguyn tc chng ta khng c php thc hin cc php ton
s hc trn n, nhng ngn ng C lun ng nht gia k t vi s nguyn c ln 1
byte. Do vy, nhng php ton s hc trn cc k t thc cht l nhng php ton s hc
trn cc s nguyn. Chng hn, nhng thao tc nh trong khai bo di y l c php:
char x1=A, x2 =z;
x1 = (x1 + 100) % 255;
x2 = (x2-x1) %255;
Mc d x1, x2 c khai bo l hai bin kiu char, nhng trong thao tc
x1 = (x1 + 100) % 255;
x2 = (x2 +x1) %255;
chng trnh dch s t ng chuyn i x1 thnh m ca k t A l 65, x2 thnh m k
t z l 122 thc hin php ton. Kt qu nhn c x1 l mt k t c m l
(65+100)%255 = 165; x2 l k t c m l 32 ng vi m ca k t space.
Chng ta c th thc hin c cc php ton s hc trn kiu int, long, float, double.
Nhng i vi int v long, chng ta cn c bit ch php chia hai s nguyn cho ta mt
s nguyn, tch hai s nguyn cho ta mt s nguyn, tng hai s nguyn cho ta mt s
nguyn mc d thng hai s nguyn l mt s thc, tch hai s nguyn hoc tng hai s
nguyn c th l mt s long int. Do vy, mun nhn c kt qu ng, chng ta cn phi
chuyn i cc bin thuc cng mt kiu trc khi thc hin php ton. Ngc li, ta khng

15

Chng 1: i cng v k thut lp trnh cu trc


th ly modul ca hai s thc hoc thc hin cc thao tc dch chuyn bt trn n, v nhng
thao tc khng nm trong nh ngha ca kiu.
iu tng t cng xy ra vi cc string. Trong Pascal, php ton so snh hai string
hoc gn trc tip hai Record cng kiu vi nhau l c php, v d : Str1>Str2, Str1 :=
Str2; Nhng trong C th cc php ton trn li khng c nh ngha, nu mun thc hin
n, chng ta ch c cch nh ngha li hoc thc hin n thng qua cc li gi hm.

1.6. NGUYN L AN TON

Li nng nht nm mc cao nht (mc thit k) v mc thp nht th


tc phi chu ti ln nht.

Mi li, d l nh nht cng phi c pht hin mt bc no ca


chng trnh. Qu trnh kim tra v pht hin li phi c thc hin trc
khi li honh hnh.

Cc loi li thng xy ra trong khi vit chng trnh c th c tng kt li nh


sau:
Li c thng bo bi t kho error (li c php): loi li ny thng xy ra
trong khi son tho chng trnh, chng ta c th vit sai cc t kho v d thay v vit l int
chng ta son tho sai thnh Int (li ch in thng thnh in hoa), hoc vit sai c php cc
biu thc nh thiu cc du ngoc n, ngoc kp hoc du chm phy khi kt thc mt
lnh, hoc cha khai bo nguyn mu cho hm .
Li c thng bo bi t kho Warning (li cnh bo): li ny thng xy ra khi
ta khai bo bin trong chng trnh nhng li khng s dng ti chng, hoc li trong cc
biu thc kim tra khi bin c kim tra khng xc nh c gi tr ca n, hoc li do
th t u tin cc php ton trong biu thc. Hai loi li error v warning c thng bo
ngay khi dch chng trnh thnh file *.OBJ. Qu trnh lin kt (linker) cc file *.OBJ
to nn file chng trnh m my *.EXE ch c tip tc khi chng ta hiu nh v kh b
mi li error.
Li xy ra trong qu trnh lin kt: li ny thng xut hin khi ta s dng ti cc
li gi hm, nhng nhng hm mi ch tn ti di dng nguyn mu (function
prototype) m cha c m t chi tit cc hm, hoc nhng li hm gi cha ng vi
tn ca n. Li ny c khc phc khi ta b sung on chng trnh con m t chi tit cho
hm hoc sa i li nhng li gi hm tng ng.
Ta quan nim, li c php (error), li cnh bo (warning) v li lin kt (linker) l li
tm thng v nhng li ny c Compiler ca cc ngn ng lp trnh pht hin c.
khc phc cc li loi ny, chng ta ch cn phi c v hiu c nhng thng bo li
thng c vit bng ting Anh. Cng cn phi lu rng, do mc phc tp ca
chng trnh dch nn khng phi li no cng c ch ra mt cch tng minh v chnh
xc hon ton ti ni xut hin li.

16

Chng 1: i cng v k thut lp trnh cu trc


Loi li cui cng m cc compiler khng th pht hin ni l li do chnh lp
trnh vin gy nn trong khi thit k chng trnh v x l d liu. Nhng li ny khng
c compiler thng bo m n phi tr gi bng qu trnh t test hoc chng minh c
tnh ng n ca chng trnh. Li c th nm chnh thit k, hoc li do khng
lng trc c tnh cht ca mi loi thng tin vo. V d sau minh ha cho li thng
xy ra thuc loi ny.
V d 1.6. Tnh tng hai a thc A bc n, a thc B bc m.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 100
typedef float dathuc[MAX];
void In(dathuc A, int n, char c){
int i;
printf("\n Da thuc %c:", c);
for(i=0;i<n; i++)
printf("%6.2f", A[i]);
}
void Init( dathuc A, int *n, dathuc B, int *m){
int i;float temp;
printf("\n Nhap n="); scanf("%d", n);*n=*n+1;
printf("\n Nhap m="); scanf("%d",m); *m=*m+1;
printf("\n Nhap he so da thuc A:");
for(i=0; i<*n;i++){
printf("\n A[%d]=", i); scanf("%f", &temp);
A[i]=temp;
}
printf("\n Nhap he so da thuc B:");
for(i=0; i<*m;i++){
printf("\n B[%d]=",i); scanf("%f", &temp);
B[i] = temp;
}
In(A,*n,'A'); In(B,*m,'B');
}
void Tong(dathuc A, int n, dathuc B, int m, dathuc C){
int i, k;
if (n>= m ){
k =n;
for(i=0; i<m; i++)
C[i] = A[i]+B[i];
for (i=m; i<n; i++)

17

Chng 1: i cng v k thut lp trnh cu trc


C[i]=A[i];
In(C,k,'C');
}
else {
k = m;
for(i=0; i<n; i++)
C[i] = A[i]+B[i];
for (i=n; i<m; i++)
C[i]=B[i];
In(C,k,'C');
}
}
void main(void){
dathuc A, B, C;
int n, m;
Init(A, &n, B, &m);
Tong(A, n, B, m, C);
}

Trong v d trn, chng ta s dng nh ngha MAX =100 gii quyt bi ton.
MAX c hiu l bc ca a thc ln nht m chng ta cn x l. Nh vy, bn thn vic
nh ngha MAX hn ch ti phm vi bi ton, hn ch cng c th xut pht t
thit k. Do vy, nu ngi s dng nhp n>MAX th chng trnh s gp li. Nu chng ta
khc phc bng cch nh ngha BAC ln th trong trng hp x l cc a thc c bc n
nh s gy nn hin tng lng ph b nh, v trong nhiu trng hp khng b nh
nh ngha a thc. Gii php khc phc cc li loi ny l chng ta s dng con tr thay
cho cc hng, k thut ny s c tho lun k trong Chng 2.

1.7. PHNG PHP TOP-DOWN

Qu trnh phn tch bi ton c thc hin t trn xung di. T vn


chung nht n vn c th nht. T mc tru tng mang tnh cht tng
quan ti mc n gin nht l n v chng trnh.

Mt trong nhng nguyn l quan trng ca lp trnh cu trc l phng php phn
tch t trn xung (Top - Down) vi quan im thy cy khng bng thy rng, phi
ng cao hn quan st tng th khu rng ch khng th ng trong rng quan st chnh
n.
Qu trnh phn r bi ton c thc hin theo tng mc khc nhau. Mc thp nht
c gi l mc tng quan (level 0), mc tng quan cho php ta nhn tng th h thng
thng qua cc chc nng ca n, ni cch khc mc 0 s tr li thay cho cu hi H thng
c th thc hin c nhng g ?. Mc tip theo l mc cc chc nng chnh. mc ny,
nhng chc nng c th c m t. Mt h thng c th c phn tch thnh nhiu mc
khc nhau, mc thp c php s dng cc dch v ca mc cao. Qu trnh phn tch tip
18

Chng 1: i cng v k thut lp trnh cu trc


tc phn r h thng theo tng chc nng ph cho ti khi no nhn c mc cc n th (
UNIT, Function, Procedure), khi chng ta tin hnh ci t h thng.
Chng ta s lm r hn tng mc ca qu trnh Top-Down thng qua bi ton sau:
Bi ton: Cho hai s nguyn c biu din nh phn l a=(a1, a2, . . ., an), b = (b1, b2,
.., bn); ai, bi =0, 1, i=1, 2, . . .n. Hy xy dng tp cc thao tc trn hai s nguyn .
Mc tng quan (level 0):
Hnh dung ton b nhng thao tc trn hai s nguyn a=(a1, a2, . . ., an),
b=(b1,b2,..,bn) vi y nhng chc nng chnh ca n. Gi s nhng thao tc bao
gm:
F1- Chuyn i a, b thnh cc s nh phn;
F2- Tnh tng hai s nguyn: a + b;
F3- Tnh hiu hai s nguyn: a - b;
F4 Tnh tch hai s nguyn: a *b;
F5- Thng hai s nguyn : a/b;
F6- Phn d hai s nguyn: a % b;
F7- c s chung ln nht ca hai s nguyn.
Mc 1. Mc cc chc nng chnh: mi chc nng cn m t y thng tin vo
(Input), thng tin ra (Output), khun dng (Format) v cc hnh ng (Actions).
Chc nng F1: Chuyn i a, b thnh cc s h nh phn
Input

a : integer;

Output

a=(a1, a2, . . ., an)b; (*khai trin c s b bt k*)

Format

Binary(a);

Actions
{

Q = n; k=0;
While ( Q 0 ) {
ak = q mod b;
q = q div b;
k = k +1;
}
< Khai trin c s b ca a l (ak-1, ak-2, . ., a1, a0) >;

Chc nng F2: Tnh tng hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:

19

Chng 1: i cng v k thut lp trnh cu trc


c = a + b;
Format: Addition(a, b);
Actions {
c = 0;
for (j = 0; j< n; j++){
d = (aj + bj + c) div 2;
sj = aj + bj + c - 2d;
c = d;
}
sn = c;
< Khai trin nh phn ca tng l (snsn-1. . .s1,s0)2>
}

Chc nng F3: Hiu hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:
c = a - b;
Format: Subtraction(a, b);
Actions {
b = -b;
c = Addition(a, b);
return(c);
}

Chc nng F4: Tch hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:
c = a * b;
Format: Multual(a, b);
Actions {
For (j =0; j< n; j++){
If ( bj =1)
cj = a<<j;
Else
cj = 0;
}
(* c0, c1, . . ., cn-1 l cc tch ring*)
p=0;

20

Chng 1: i cng v k thut lp trnh cu trc


for( j=0; j< n; j++) {
p = Addition(p, cj);
}
return(p);
}

Chc nng F5: Thng hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:
c = a div b;
Format: Division(a, b);
Actions {
c = 0;
while ( a>= b ) {
c = c +1;
a = Subtraction(a, b);
}
return(c);
}

Chc nng F6: Modul hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:
c = a mod b;
Format: Modulation(a, b);
Actions {
while ( a>= b )
a = Subtraction(a, b);
return(a);
}

Chc nng F7: c s chung ln nht hai s nguyn a, b.


Input:
a=(a1, a2, . . ., an),
b = (b1, b2, .., bn);
Output:
c = USCLN(a,b);
Format: USCLN(a, b);
Actions {

21

Chng 1: i cng v k thut lp trnh cu trc


while ( a b ) {
if (a > b)
a = Subtraction(a, b)
else
b = Subtraction(b,a);
}
return(a);
}

rng, sau khi phn r bi ton mc 1, chng ta ch cn xy dng hai php ton
cng v php tnh nhn cc s nh phn ca a, b. V hiu hai s a v b chnh l tng s ca
(a,-b). Tng t nh vy, tch hai s a v b c biu din bng tng ca mt s ln php
nhn mt bt nh phn ca vi a. Php chia v ly phn d hai s a v b chnh l php tr
nhiu ln s a. Php tm USCLN cng tng t nh vy.
i vi cc h thng ln, qu trnh cn c m t tip tc cho ti khi nhn c
mc n v chng trnh. Trong v d n gin ny, mc n v chng trnh xut hin
ngay ti mc 1 nn chng ta khng cn phn r tip na m dng li ci t h thng.

1.8. PHNG PHP BOTTOM-UP

i t ci ring ti ci chung, t cc i tng thnh phn mc cao ti cc


i tng thnh phn mc thp, t mc n v chng trnh ti mc tng
th, t nhng n v bit lp t thnh nhng n v mi.

Nu nh phng php Top-Down l phng php phn r vn mt cch c h


thng t trn xung, c ng dng ch yu cho qu trnh phn tch v thit h thng, th
phng php Bottom- Up thng c s dng cho qu trnh ci t h thng. Trong v d
trn, chng ta s khng th xy dng c chng trnh mt cch hon chnh nu nh ta
cha xy dng c cc hm Binary(a), Addition(a,b), Subtraction(a,b), Multial(a,b),
Division(a,b), Modulation(a,b), USCLN(a,b). Chng trnh sau th hin qu trnh ci t
chng trnh theo nguyn l Botton-Up:
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Init(int *a, int *b){
printf("\n Nhap a=");scanf("%d", a);
printf("\n Nhap b=");scanf("%d", b);
}
void Binary(int a){
int i, k=1;

22

Chng 1: i cng v k thut lp trnh cu trc


for(i=15; i>=0; i--){
if ( a & (k<<i))
printf("%2d",1);
else
printf("%2d",0);
}
printf("\n");delay(500);
}
int bit(int a, int k){
int j=1;
if (a & (j<<k))
return(1);
return(0);
}
int Addition(int a, int b){
int du, d, s, j, c=0;
du=0;
for ( j=0; j<=15; j++){
d =( bit(a,j) + bit(b, j) +du)/2;
s = bit(a,j)+bit(b,j)+ du - 2*d;
c = c | (s <<j);
du = d;
}
return(c);
}
int Multial(int a, int b) {
int c,j, p=0;
for(j=0; j<=15; j++){
c = bit(b, j);
if (c==1) {
c = a<<j;
p= Addition(p, c);
}
else c=0;
}
return(p);
}
int Subtraction(int a, int b){
int c;
b=-b;
c=Addition(a,b);return(c);

23

Chng 1: i cng v k thut lp trnh cu trc


}
int Modul(int a, int b){
while(a>=b)
a = Subtraction(a,b);
return(a);
}
int Division(int a, int b){
int d=0;
while(a>=b) {
a= Subtraction(a,b);
d++;
}
return(d);
}
int USCLN(int a, int b){
while(a!=b){
if(a>b) a = Subtraction(a,b);
else b = Subtraction(b,a);
}
return(a);
}
void main(void){
int a, b, key, control=0;
do {
clrscr();
printf("\n Tap thao tac voi so nguyen");
printf("\n 1- Nhap hai so a,b");
printf("\n 2- So nhi phan cua a, b");
printf("\n 3- Tong hai so a,b");
printf("\n 4- Hieu hai so a,b");
printf("\n 5- Tich hai so a,b");
printf("\n 6- Thuong hai so a,b");
printf("\n 7- Phan du hai so a,b");
printf("\n 8- USCLN hai so a,b");
printf("\n 0- Tro ve");
key=getch();
switch(key){
case '1': Init(&a, &b); control=1; break;
case '2':
if (control){
Binary(a); Binary(b);

24

Chng 1: i cng v k thut lp trnh cu trc


}
break;
case '3':
if (control)
printf("\n Tong a+b = %d", Addition(a, b));
break;
case '4':
if (control)
printf("\n Hieu a-b =%d", Subtraction(a, b));
break;
case '5':
if(control)
printf("\n Tich a*b =%d", Multial(a,b));
break;
case '6':
if(control)
printf("\n Chia nguyen a div b=%d",Division(a,b));
break;
case '7':
if(control)
printf("\n Phan du a mod b =%d", Modul(a,b));
break;
case '8':
if(control)
printf("\n Uoc so chung lon nhat:%d",USCLN(a,b));
break;
}
delay(1000);
} while(key!='0');
}

25

Chng 1: i cng v k thut lp trnh cu trc

NHNG NI DUNG CN GHI NH

9 Mt ngn ng lp trnh bt k u da trn tp cc cu trc lnh iu khin (tun


t, tuyn chn & lp), cc cu trc d liu (d liu kiu c bn & d liu c cu
trc) cng vi cc php ton trn n.
9 Khi mi bt u hc lp trnh, hy lp trnh t tp ti thiu cc cng c m ngn
ng lp trnh trang b (Nguyn l ti thiu).
9 Khi no dng bin a phng, khi no dng bin ton cc l ni dung chnh ca
nguyn l a phng. Nm vng nguyn l ny gip cho ta s dng cch truyn
tham bin v cch truyn tham tr cho hm.
9 D liu kiu no th php ton l ni dung chnh ca nguyn l nht qun.
9 Mi li d nh nht cng phi lng trc mi mc ci t ca chng trnh.
9 Cch phn r mt vn ln thnh nhng vn nh hn l ni dung chnh ca
nguyn l Top-Down.
9 Cch ci t mt vn c thc hin t mc n v chng trnh (hm, th
tc) n mc lp ghp cc n v chng trnh thnh h thng hon thin l ni
dung chnh ca nguyn l Botton-Up.

26

Chng 1: i cng v k thut lp trnh cu trc

BI TP CHNG 1

Bi 1. Tm cc nghim nguyn dng ca h phng trnh:


X + Y + Z = 100
5X + 3Y + Z/3 = 100
Bi 2. Cho s t nhin n. Hy tm tt c cc b 3 cc s t nhin a, b, c sao cho a2+b2 = c2
trong a<= b< =c <=n .
Bi 3. Cho s t nhin n. Hy tm cc s Fibonaci nh hn n. Trong cc s Fibonai
c nh ngha nh sau:
U0 = 0; U1 = 1; Uk = Uk-1 + Uk-2 ; k=1, 2, . . .
Bi 4. Chng minh rng, vi mi s nguyn dng N, 0<N<=39 th N2 + N + 41 l mt
s nguyn t. iu khng nh trn khng cn ng vi N>39.
Bi 5. Cho s t nhin n. Hy lit k tt c cc s nguyn t nh hn n.
Bi 6. Cho s t nhin n. Hy tm tt c cc s nguyn t nh hn n bng phng php
sng Estheven.
Bi 7. Cho s t nhin n. Dng phng php sng Estheven tm 4 s nguyn t b hn
n nm trong cng bc chc ( v d : 11, 13, 15, 17).
Bi 8. Cho s t nhin n. Hy lit k tt c cc cp s p, 4p+1 u l s nguyn t nh hn
n. Trong p cng l s nguyn t nh hn n.
Bi 9. Hy lit k tt c cc s nguyn t c 5 ch s sao cho tng s cc ch s trong s
nguyn t ng bng S cho trc 1S45.
Bi 10. Mt s c gi l s Mersen nu n l s nguyn t c biu din di dng 2P 1 trong P cng l mt s nguyn t. Cho s t nhin n, tm tt c cc s Mersen
nh hn n.
Bi 11. Cho s t nhin n. Hy phn tch n thnh tch cc tha s nguyn t. V d 12 =
2*2*3.
Bi 12. Hai s t nhin a, b c gi l hu ngh nu tng cc c s thc s ca a (k c
1) bng b v ngc li. Cho hai s t nhin P , Q. Hy tm tt c cc cp s hu ngh
trong khong [P, Q].
Bi 13. Cho s t nhin n. Hy tm tt c cc s 1, 2, .., n sao cho cc s trng vi phn
cui bnh phng chnh n (V d : 62 = 36, 252 = 625).
Bi 14. Mt s t nhin c gi l s amstrong nu tng cc ly tha bc n ca cc ch s
ca n bng chnh s . Trong n l s cc ch s ( V d 153 = 13 + 23 + 33 ). Hy
tm tt c cc s amstrong gm 2, 3, 4 ch s.

27

Chng 1: i cng v k thut lp trnh cu trc


Bi 15. Mt s t nhin l Palindrom nu cc ch s ca n vit theo th t ngc li th s
to thnh l chnh s ( V d: 4884, 393). Hy tm:
Tt c cc s t nhin nh hn 100 m khi bnh phng ln th cho mt
Palindrom.
Tt c cc s Palindrom b hn 100 m khi bnh phng ln chng cho mt
Palindrom.
Bi 16. ghi nhn cho nhng chic gh trong mt ging ng, ngi ta s dng 4 k t,
k t u tin l mt ch ci in hoa, ba k t tip theo l mt s nguyn dng khng
vt qu 100. Hi bng cch c nhiu nht bao nhiu chic gh c nh nhn v
l nhng nhn no.
Bi 17. D n nh s in thoi ca Bang Florida c qui nh nh sau. Trong d n nh
s in thoi gm 10 ch s c chia thnh nhm: m vng gm 3 ch s, nhm m
chi nhnh gm 3 ch s v nhm m my gm 4 ch s. V nhng nguyn nhn k
thut nn c mt s hn ch i vi cc ch s, gi s X biu th cc ch s nhn gi tr
t 0 . .9, Y l cc ch s nhn gi tr hoc 0 hoc l 1, N l cc ch s nhn gi tr t 2 .
.9. Hi vi cch nh s dng NYX NNX XXXX v NXX NXX XXXX s c bao
nhiu s in thoi khc nhau. In ra mn hnh v ghi li vo File DT.TXT s in thoi
ca vng c m 200, m chi nhnh 250 v s in thoi bt u l s 9. Mi s in
thoi c ghi trn mt dng, mi dng c ghi lm 3 phn (M vng, m chi nhnh,
s in thoi) mi phn phn bit vi nhau bi mt hoc v du trng.
Bi 18. Cho File d liu TEXT.TXT c t chc thnh tng dng, di ti a ca mi
dng l 80 k t. K thut m ho tuyn tnh l phng php bin i m ca cc k t
t [a . .z], [A . .Z] thnh mt k t mi m m ca n cng thm vi mt hng s k cho
trc. Qu trnh gii m c thc hin ngc li. Hy vit chng trnh m t
phng php m ho v gii m tuyn tnh File d liu TEXT.TXT. Qu trnh m ho
c ghi li trong File MAHOA.TXT, qu trnh gii m ghi li trong File
GIAIMA.TXT.
Bi 19. Cho File d liu TEXT.TXT c t chc thnh tng dng, di ti a ca mi
dng l 80 k t. K thut m ho chn l l phng php bin i m ca cc k t [a
. .z], [A . . Z]. Trong , nu k t c s cc bt 1 l l ta b xung thm mt bt c gi
tr mt vo bt s 7 ca k t k t tr thnh chn. Qu trnh gii m c thc hin
ngc li. Hy vit chng trnh m t k thut m ho chn l File d liu
TEXT.TXT. Qu trnh m ho c ghi li trong File MAHOA.TXT, qu trnh gii
m ghi li trong File GIAIMA.TXT.

28

Chng 2: Duyt v qui

CHNG 2: DUYT V QUI

Duyt ton b l phng php ph dng nht trong khi gii quyt mt bi ton trn
my tnh. Cc k thut duyt cng rt phong ph a dng nu nh ta chng ta li dng c
nhng mo mc khng mang tnh tng qut ho nhng hn ch c khng gian tm kim
li gii bi ton. qui c s dng nhiu trong cc k thut duyt. S dng qui
thng cho ta mt li gii tng i ngn gn, d hiu nhng n cha trong n nhiu b n
kh lng. Tuy nhin, n vn c coi l mt mu hnh vt cn tt c cc kh nng ca
bi ton. Cc k thut qui c cp y bao gm:
9 Cc nh ngha bng qui, cc cu trc d liu nh ngha bng qui & gii
thut qui.
9 Thut ton sinh k tip gii quyt bi ton duyt.
9 Thut ton quay lui giiquyt bi ton duyt.
9 Thut ton nhnh cn giiquyt bi ton duyt.
Bn c c th tm thy nhiu hn nhng ng dng v ci t c th phng php
duyt trong ti liu [1].

2.1. NH NGHA BNG QUI


Trong thc t, chng ta gp rt nhiu i tng m kh c th nh ngha n mt cch
tng minh, nhng li d dng nh ngha i tng qua chnh n. K thut nh ngha i
tng qua chnh n c gi l k thut qui (recursion). qui c s dng rng ri
trong khoa hc my tnh v l thuyt tnh ton. Cc gii thut qui u c xy dng
thng qua hai bc: bc phn tch v bc thay th ngc li.
V d 2.1. tnh tng S(n) = 1 + 2 + . . .+ n, chng ta c th thc hin thng qua hai
bc nh sau:
Bc phn tch:

tnh ton c S(n) trc tin ta phi tnh ton trc S(n-1) sau tnh
S(n) = S(n-1) +n.

tnh ton c S(n-1), ta phi tnh ton trc S(n-2) sau tnh S(n-1) =
S(n-2) + n-1.

......................................................

tnh ton c S(2), ta phi tnh ton trc S(1) sau tnh S(2) = S(1) + 2.

V cui cng S(1) chng ta c ngay kt qu l 1.

Bc thay th ngc li:


29

Chng 2: Duyt v qui


Xut pht t S(1) thay th ngc li chng ta xc nh S(n):

S(1) = 1

S(2) = S(1) + 2

S(3) = S(2) + 3

............

S(n) = S(n - 1) + n

V d 2.2. nh ngha hm bng qui


Hm f(n) = n!
D thy f(0) = 1.
V (n+1) ! = 1 . 2.3 . . . n(n+1) = n! (n+1), nn ta c:
f(n+1) = ( n+1) . f(n) vi mi n nguyn dng.
V d 2.3. Tp hp nh ngha bng qui
nh ngha qui tp cc xu : Gi s * l tp cc xu trn b ch ci . Khi *
c nh ngha bng qui nh sau:

*, trong l xu rng

wx * nu w * v x

V d 2.4. Cu trc t tr c nh ngha bng qui


struct node {
int infor;
struct node *left;
struct node *right;
};

2.2. GII THUT QUI


Mt thut ton c gi l qui nu n gii bi ton bng cch rt gn bi ton ban
u thnh bi ton tng t nh vy sau mt s hu hn ln thc hin. Trong mi ln thc
hin, d liu u vo tim cn ti tp d liu dng.
V d: gii quyt bi ton tm c s chung ln nht ca hai s nguyn dng a v
b vi b> a, ta c th rt gn v bi ton tm c s chung ln nht ca (b mod a) v a v
USCLN(b mod a, a) = USCLN(a,b). Dy cc rt gn lin tip c th t c cho ti khi
t iu kin dng USCLN(0, a) = USCLN(a, b) = a. Sau y l v d v mt s thut ton
qui thng dng.
Thut ton 1: Tnh an bng gii thut qui, vi mi s thc a v s t nhin n.
double power( float a, int n ){
if ( n ==0)

30

Chng 2: Duyt v qui


return(1);
return(a *power(a,n-1));
}

Thut ton 2: Thut ton qui tnh c s chung ln nht ca hai s nguyn dng
a v b.
int USCLN( int a, int b){
if (a == 0) return(b);
return(USCLN( b % a, a));
}

Thut ton 3: Thut ton qui tnh n!


long factorial( int n){
if (n ==1)
return(1);
return(n * factorial(n-1));
}

Thut ton 4: Thut ton qui tnh s fibonacci th n


int fibonacci( int n) {
if (n==0) return(0);
else if (n ==1) return(1);
return(fibonacci(n-1) + fibonacci(n-2));
}

2.3. THUT TON SINH K TIP


Phng php sinh k tip dng gii quyt bi ton lit k ca l thuyt t hp.
Thut ton sinh k tip ch c thc hin trn lp cc bi ton tha mn hai iu kin sau:

C th xc nh c mt th t trn tp cc cu hnh t hp cn lit k, t


xc nh c cu hnh u tin v cu hnh cui cng.

T mt cu hnh bt k cha phi l cui cng, u c th xy dng c mt


thut ton suy ra cu hnh k tip.

Tng qut, thut ton sinh k tip c th c m t bng th tc genarate, trong


Sinh_K_Tip l th tc sinh cu hnh k tip theo thut ton sinh c xy dng. Nu
cu hnh hin ti l cu hnh cui cng th th tc Sinh_K_Tip s gn cho stop gi tr true,
ngc li cu hnh k tip s c sinh ra.
Procedure generate{
<Xy dng cu hnh ban u>;
stop =false;
while (! stop) {
<a ra cu hnh ang c >;
Sinh_K_Tip;

31

Chng 2: Duyt v qui


}
}

Di y l mt v d in hnh minh ha cho thut ton sinh k tip.


Bi ton lit k cc tp con ca tp n phn t
Mt tp hp hu hn gm n phn t u c th biu din tng ng vi tp cc s
t nhin 1, 2, . . . n. Bi ton c t ra l: Cho mt tp hp gm n phn t X = { X1, X2, .
., Xn }, hy lit k tt c cc tp con ca tp hp X.
lit k c tt c cc tp con ca X, ta lm tng ng mi tp Y X vi mt xu
nh phn c di n l B = { B1, B2, . . , Bn } sao cho Bi = 0 nu Xi Y v Bi = 1 nu Xi
Y; nh vy, php lit k tt c cc tp con ca mt tp hp n phn t tng ng vi
php lit k tt c cc xu nh phn c di n. S cc xu nh phn c di n l 2n. By
gi ta i xc nh th t cc xu nh phn v phng php sinh k tip.
Nu xem cc xu nh phn b = { b1, b2, . . , bn } nh l biu din ca mt s nguyn
dng p(b). Khi th t hin nhin nht l th t t nhin c xc nh nh sau:
Ta ni xu nh phn b = { b1, b2, . . , bn } c th t trc xu nh phn b = { b1, b2, . . ,
bn } v k hiu l b<b nu p(b) < p(b). V d vi n= 4: chng ta c 24 = 16 xu nh phn
(tng ng vi 16 tp con ca tp gm n phn t) c lit k theo th t t in nh sau:
b

p(b)

0000

0001

0010

0011

0100

0101

0110

0111

1000

1001

1010

10

1011

11

1100

12

1101

13

1110

14

1111

15
32

Chng 2: Duyt v qui


T y ta xc nh c xu nh phn u tin l 00. .00 v xu nh phn cui cng l
11..11. Qu trnh lit k dng khi ta c xu nh phn 1111. Xu nh phn k tip l biu
din nh phn ca gi tr xu nh phn trc cng thm 1 n v. T ta nhn c qui
tc sinh k tip nh sau:
Tm ch s i u tin theo th t i = n, n-1, . ., 1 sao cho bi = 0.
Gn li bi = 1 v bj = 0 vi tt c j>i. Dy nh phn thu c l dy cn tm
Thut ton sinh xu nh phn k tip
void Next_Bit_String( int *B, int n ){
i = n;
while (bi ==1 ) {
bi = 0;
i = i-1;
}
bi = 1;
}

Sau y l vn bn chng trnh lit k cc xu nh phn c di n:


#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>
#include <conio.h>
#define MAX 100
#define TRUE

#define FALSE

int

Stop, count;

void Init(int *B, int n){


int i;
for(i=1; i<=n ;i++)
B[i]=0;
count =0;
}
void Result(int *B, int n){
int i;count++;
printf("\n Xau nhi phan thu %d:",count);
for(i=1; i<=n;i++)
printf("%3d", B[i]);
}
void Next_Bits_String(int *B, int n){
int i = n;
while(i>0 && B[i]){
B[i]=0; i--;

33

Chng 2: Duyt v qui


}
if(i==0 )
Stop=TRUE;
else
B[i]=1;
}
void Generate(int *B, int n){
int i;
Stop = FALSE;
while (!Stop) {
Result(B,n);
Next_Bits_String(B,n);
}
}
void main(void){
int i, *B, n;clrscr();
printf("\n Nhap n=");scanf("%d",&n);
B =(int *) malloc(n*sizeof(int));
Init(B,n);Generate(B,n);free(B);getch();
}

2.4. THUT TON QUAY LUI (BACK TRACK)


Phng php sinh k tip c th gii quyt c cc bi ton lit k khi ta nhn bit
c cu hnh u tin ca bi ton. Tuy nhin, khng phi cu hnh sinh k tip no cng
c sinh mt cch n gin t cu hnh hin ti, ngay k c vic pht hin cu hnh ban
u cng khng phi d tm v nhiu khi chng ta phi chng minh s tn ti ca cu hnh.
Do vy, thut ton sinh k tip ch gii quyt c nhng bi ton lit k n gin. gii
quyt nhng bi ton t hp phc tp, ngi ta thng dng thut ton quay lui (Back
Track) s c trnh by di y.
Ni dung chnh ca thut ton ny l xy dng dn cc thnh phn ca cu hnh bng
cch th tt c cc kh nng. Gi s cn phi tm mt cu hnh ca bi ton x = (x1, x2, . .,
xn) m i-1 thnh phn x1, x2, . ., xi-1 c xc nh, by gi ta xc nh thnh phn th i
ca cu hnh bng cch duyt tt c cc kh nng c th c v nh s cc kh nng t 1 .
.ni. Vi mi kh nng j, kim tra xem j c chp nhn c hay khng. Khi c th xy ra
hai trng hp:

Nu chp nhn j th xc nh xi theo j, nu i=n th ta c mt cu hnh cn


tm, ngc li xc nh tip thnh phn xi+1.

Nu th tt c cc kh nng m khng c kh nng no c chp nhn th


quay li bc trc xc nh li xi-1.

34

Chng 2: Duyt v qui


im quan trng nht ca thut ton l phi ghi nh li mi bc i qua, nhng
kh nng no c th trnh s trng lp. nh li nhng bc duyt trc ,
chng trnh cn phi c t chc theo c ch ngn xp (Last in first out). V vy, thut
ton quay lui rt ph hp vi nhng php gi qui. Thut ton quay lui xc nh thnh
phn th i c th c m t bng th tc Try(i) nh sau:
void Try( int i ) {
int

j;

for ( j = 1; j < ni; j ++) {


if ( <Chp nhn j >) {
<Xc nh xi theo j>
if (i==n)
<Ghi nhn cu hnh>;
else

Try(i+1);

}
}
}

C th m t qu trnh tm kim li gii theo thut ton quay lui bng cy tm kim
li gii sau:
Gc

Kh nng chn x1

Kh nng chn x2
vi x1 chn

Kh nng chn x3 vi
x1, x2 chn

Hnh 2.1. Cy lit k li gii theo thut ton quay lui.

V d: Bi ton Xp Hu. Lit k tt c cc cch xp n qun hu trn bn c n x n


sao cho chng khng n c nhau.

35

Chng 2: Duyt v qui


Bn c c n hng c nh s t 0 n n-1, n ct c nh s t 0 n n-1; Bn c c
n*2 -1 ng cho xui c nh s t 0 n 2*n -2, 2 *n -1 ng cho ngc c nh s
t 2*n -2. V d: vi bn c 8 x 8, chng ta c 8 hng c nh s t 0 n 7, 8 ct c nh
s t 0 n 7, 15 ng cho xui, 15 ng cho ngc c nh s t 0 . .15.
V trn mi hng ch xp c ng mt qun hu, nn chng ta ch cn quan tm
n qun hu c xp ct no. T dn n vic xc nh b n thnh phn x1, x2, . ., xn,
trong xi = j c hiu l qun hu ti dng i xp vo ct th j. Gi tr ca i c nhn t
0 n n-1; gi tr ca j cng c nhn t 0 n n-1, nhng tho mn iu kin (i,j) cha
b qun hu khc chiu n theo ct, ng cho xui, ng cho ngc.
Vic kim sot theo hng ngang l khng cn thit v trn mi hng ch xp ng
mt qun hu. Vic kim sot theo ct c ghi nhn nh dy bin logic aj vi qui c aj=1
nu ct j cn trng, ct aj=0 nu ct j khng cn trng. ghi nhn ng cho xui v
ng cho ngc c chiu ti (i,j) hay khng, ta s dng phng trnh i + j = const v i
- j = const, ng cho th nht c ghi nhn bi dy bin bj, ng cho th 2 c ghi
nhn bi dy bin cj vi qui c nu ng cho no cn trng th gi tr tng ng ca n
l 1 ngc li l 0. Nh vy, ct j c chp nhn khi c 3 bin aj, bi+j, ci+j u c gi tr 1.
Cc bin ny phi c khi u gi tr 1 trc , gn li gi tr 0 khi xp xong qun hu
th i v tr li gi tr 1 khi a ra kt qu.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define N 8
#define

(2*N-1)

#define

SG

(N-1)

#define

TRUE 1

#define

FALSE 0

void hoanghau(int);
void inloigiai(int
int

loigiai[]);FILE *fp;

A[N], B[D], C[D], loigiai[N];

int soloigiai =0;


void hoanghau(int i){
int j;
for (j=0; j<N;j++){
if (A[j] && B[i-j+SG] && C[i+j] ) {
loigiai[i]=j;
A[j]=FALSE;
B[i-j+SG]=FALSE;
C[i+j]=FALSE;
if (i==N-1){
soloigiai++;

36

Chng 2: Duyt v qui


inloigiai(loigiai);
delay(500);
}
else
hoanghau(i+1);
A[j]=TRUE;
B[i-j+SG]=TRUE;
C[i+j]=TRUE;
}
}
}
void inloigiai(int *loigiai){
int j;
printf("\n Li gii %3d:",soloigiai);
fprintf(fp,"\n Li gii %3d:",soloigiai);
for (j=0;j<N;j++){
printf("%3d",loigiai[j]);
fprintf(fp,"%3d",loigiai[j]);
}
}
void main(void){
int i;clrscr();fp=fopen("loigiai.txt","w");
for (i=0;i<N;i++)
A[i]=TRUE;
for(i=0;i<D; i++){
B[i]=TRUE;
C[i]=TRUE;
}
hoanghau(0);fclose(fp);
}

2.5. THUT TON NHNH CN


Gi s, chng ta cn gii quyt bi ton ti u t hp vi m hnh tng qut nh sau:

min{ f ( x) : x D}
Trong , D l tp hu hn phn t. Ta gi thit D c m t nh sau:
D = { x =( x1, x2, . . ., xn) A1 A2 . . . An ; x tho mn tnh cht P }, vi A1 A2
. . . An l cc tp hu hn, P l tnh cht cho trn tch cc A1 A2 . . . An .
Vi gi thit v tp D nh trn, chng ta c th s dng thut ton quay lui lit k
cc phng n ca bi ton. Trong qu trnh lit k theo thut ton quay lui, ta s xy dng

37

Chng 2: Duyt v qui


dn cc thnh phn ca phng n. Mt b phn gm k thnh phn (a1, a2, . . ., ak) xut hin
trong qu trnh thc hin thut ton s c gi l phng n b phn cp k.
Thut ton nhnh cn c th c p dng gii bi ton t ra, nu nh c th tm
c mt hm g xc nh trn tp tt c cc phng n b phn ca bi ton tho mn bt
ng thc sau:

g (a1 , a 2 ,.., a k ) min{ f ( x) : x D, xi = ai , i = 1,2,..., k }

(*)

vi mi li gii b phn (a1, a2, . ., ak), v vi mi k = 1, 2, . . .


Bt ng thc (*) c ngha l gi tr ca hm ti phng n b phn (a1, a2, . ., ak)
khng vt qu gi tr nh nht ca hm mc tiu bi ton trn tp con cc phng n.
D(a1, a2, . ., ak) { x D: xi = ai, 1 = 1, 2, . ., k },
ni cch khc, g(a1, a2, .., ak) l cn di ca tp D(a1, a2, . ., ak). Do c th ng nht
tp D(a1, a2, . . ., ak) vi phng n b phn (a1, a2, . . , ak), nn ta cng gi gi tr g(a1, a2, .
., ak) l cn di ca phng n b phn (a1, a2, . ., ak).
Gi s, ta c c hm g. Ta xt cch s dng hm ny hn ch khi lng
duyt trong qu trnh duyt tt c cc phng n theo thut ton quay lui. Trong qu trnh
lit k cc phng n, c th thu c mt s phng n ca bi ton. Gi x l gi tr
hm mc tiu nh nht trong s cc phng n duyt, k hiu f = f (x) . Ta gi x l
phng n tt nht hin c, cn f l k lc. Gi s, ta c c f , khi nu
g(a1, a2, .., ak) > f th t bt ng thc (*) ta suy ra

f < g(a1, a2, . . ., ak) min { f(x): x D, xi = ai, i=1, 2, . . ., k }, v th tp con cc


phng n ca bi ton D(a1, a2, . . ., ak) chc chn khng cha phng n ti u. Trong
trng hp ny, ta khng cn phi pht trin phng n b phn (a1, a2, . . ., ak). Ni cch
khc, ta c th loi b cc phng n trong tp D(a1, a2, . ., an) khi qu trnh tm kim.
Thut ton quay lui lit k cc phng n cn sa i li nh sau:
void Try(int k) {
(*Pht trin phng n b phn (a1, a2, . . ., ak-1 theo thut ton quay lui c kim tra cn di trc
khi tip tc pht trin phng n*)
for ak Ak {
if ( chp nhn ak ) {
xk = ak;
if (k== n) < cp nht k lc>;
else if (g(a1, a2, . . ., ak)
}
}
}

38

f )) Try (k+1);

Chng 2: Duyt v qui


Khi , thut ton nhnh cn c thc hin nh th tc sau:
void Nhanh_Can(){

f = +;
(* Nu bit mt phng n x no th c th t

f = f ( x) *)

Try(1);
if(

f + ) < f l gi tr ti u , x l phng n ti u >;

else < bi ton khng c phng n>;


}

Ch rng, nu trong th tc Try ta thay th cu lnh


if( k== n) < cp nht k lc >;
else if (g(a1, a2, . ., ak)

f )) Try(k+1);

bi
if (k == n) < cp nht k lc >;
else Try(k+1);

th th tc Try s lit k ton b cc phng n ca bi ton, v ta li thu c thut ton


duyt ton b. Vic xy dng hm g ph thuc vo tng bi ton ti u t hp c th.
Nhng chng ta c gng xy dng sao cho vic tnh gi tr ca g phi n gin v gi tr
ca g(a1, a2, . ., ak) phi st vi gi tr ca hm mc tiu.
V d. Gii bi ton ngi du lch bng thut ton nhnh cn
Bi ton Ngi du lch. Mt ngi du lch mun i thm quan n thnh ph T1, T2, . .
. , Tn. Xut pht t mt thnh ph no , ngi du lch mun i qua tt c cc thnh ph
cn li, mi thnh ph i qua ng mt ln, ri quay tr li thnh ph xut pht. Bit cij l
chi ph i t thnh ph Ti n thnh ph Tj (i, j = 1, 2, . ., n), hy tm hnh trnh vi tng chi
ph l nh nht (mt hnh trnh l mt cch i tho mn iu kin).
Gii: C nh thnh ph xut pht l T1. Bi ton Ngi du lch c a v bi
ton: Tm cc tiu ca phim hm:

f ( x1 , x 2 ,..., x n ) = c[1, x 2 ] + c[ x 2 , x3 ] + ... + c[ x n 1 , x n ] + c[ x n , x1 ] min


vi iu kin

c min = min{c[i, j ], i, j = 1,2,..., n; i j} l chi ph i li gia cc thnh ph.


Gi s ta ang c phng n b phn (u1, u2, . . ., uk). Phng n tng ng vi hnh
trnh b phn qua k thnh ph:

T1 T (u 2 ) ... T (u k 1 ) T (u k )
V vy, chi ph phi tr theo hnh trnh b phn ny s l tng cc chi ph theo tng
node ca hnh trnh b phn.

39

Chng 2: Duyt v qui

=c[1,u2] + c[u2,u3] + . . . + c[uk-1, uk] .


pht trin hnh trnh b phn ny thnh hnh trnh y , ta cn phi i qua n-k
thnh ph cn li ri quay tr v thnh ph T1, tc l cn phi i qua n-k+1 on ng
na. Do chi ph phi tr cho vic i qua mi trong n-k+1 on ng cn li u khng
nhiu hn cmin, nn cn di cho phng n b phn (u1, u2, . . ., uk) c th c tnh theo
cng thc
g(u1, u2, . . ., uk) = +(n - k +1) *cmin.
Chng hn, gii bi ton ngi du lch vi ma trn chi ph nh sau

C=

3 14 18 15

4 22 20

17
6

9
2

0 16 4
7 0 12

9 15 11

Ta c cmin = 2. Qu trnh thc hin thut ton c m t bi cy tm kim li gii


c th hin trong hnh 2.2.
Thng tin v mt phng n b phn trn cy c ghi trong cc trn hnh v
tng ng theo th t sau:

u tin l cc thnh phn ca phng n

tip n l chi ph theo hnh trnh b phn

g l cn di

Kt thc thut ton, ta thu c phng n ti u ( 1, 2, 3, 5, 4, 1) tng ng vi


phng n ti u vi hnh trnh

T1 T2 T3 T5 T4 T1
v chi ph nh nht l 22

40

Chng 2: Duyt v qui

f = +
(2) =3; g=15

(2,3) =7; g=16

(2,3,4)
g=29

(3) =14; g=26

(2,4) =25; g=34

=23;

(4) =18; g=30

(5) =15; g=27

(2,5)=23; g=32

=11;

(2,3,5)
g=17

Cc nhnh ny b loi v c cn
(2,3,4,5)
g=44

=41;

Hnh trnh ( 1, 2, 3,4, 5,1)


chi ph 53. t

=16;

(2,3,5,4)
g=19

f = 53

di g >

f = 22

Hnh trnh ( 1, 2, 3, 5,4, 1)


chi ph 25(K lc mi) . t

f = 22

Hnh 2.2. Cy tm kim li gii bi ton ngi du lch.

Chng trnh gii bi ton theo thut ton nhnh cn c th hin nh sau:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#define MAX 20
int n, P[MAX], B[MAX], C[20][20], count=0;
int A[MAX], XOPT[MAX];
int can, cmin, fopt;
void Read_Data(void){
int i, j;FILE *fp;
fp = fopen("dulich.in","r");
fscanf(fp,"%d", &n);
printf("\n So thanh pho: %d", n);
printf("\n Ma tran chi phi:");

41

Chng 2: Duyt v qui


for (i=1; i<=n; i++){
printf("\n");
for(j=1; j<=n; j++){
fscanf(fp,"%d",&C[i][j]);
printf("%5d", C[i][j]);
}
}
}
int Min_Matrix(void){
int min=1000, i, j;
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if (i!=j && min>C[i][j])
min=C[i][j];
}
}
return(min);
}
void Init(void){
int i;
cmin=Min_Matrix();
fopt=32000;can=0; A[1]=1;
for (i=1;i<=n; i++)
B[i]=1;
}
void Result(void){
int i;
printf("\n Hanh trinh toi uu %d:", fopt);
printf("\n Hanh trinh:");
for(i=1; i<=n; i++)
printf("%3d->", XOPT[i]);
printf("%d",1);
}
void Swap(void){
int i;
for(i=1; i<=n;i++)
XOPT[i]=A[i];
}
void Update_Kyluc(void){
int sum;
sum=can+C[A[n]][A[1]];

42

Chng 2: Duyt v qui


if(sum<fopt) {
Swap();
fopt=sum;
}
}
void Try(int i){
int j;
for(j=2; j<=n;j++){
if(B[j]){
A[i]=j; B[j]=0;
can=can+C[A[i-1]][A[i]];
if (i==n) Update_Kyluc();
else if( can + (n-i+1)*cmin< fopt){
count++;
Try(i+1);
}
B[j]=1;can=can-C[A[i-1]][A[i]];
}
}
}
void main(void){
clrscr();Read_Data();Init();
Try(2);Result();
getch();
}

43

Chng 2: Duyt v qui

NHNG NI DUNG CN GHI NH

9 Khi khng cn cch no gii quyt vn th c th s dng cch duyt gii


quyt.
9 Tuy phng php nh ngha bng qui & gii thut qui tng i ngn gn
v d hiu nhng khng nn qu lm dng n trong khi vit chng trnh.
9 Cn phi hiu r khi no th php sinh k tip mi c p dng.
9 Qu trnh quay lui ch thc s ng khi ta kim sot c cc bc trc .
9 hn ch cc php duyt nn s dng phng php nhnh cn (nu c th).

44

Chng 2: Duyt v qui

BI TP CHNG 2

Bi 1. Duyt mi tp con ca tp hp 1, 2, . . ., n. D liu vo cho bi file tapcon.in, kt


qu ghi li trong file bai11.out. V d sau s minh ha cho file tapcon.in v tapcon.out.
tapcon.in

tapcon.out

1
2
2

3
3

Bi 2. Tm tp con di nht c th t tng dn, gim dn. Cho dy s a1, a2, . . ., an.
Hy tm dy con di nht c sp xp theo th t tng hoc gim dn. D liu vo
cho bi file tapcon.in, dng u tin ghi li s t nhin n (n100), dng k tip ghi li
n s, mi s c phn bit vi nhau bi mt hoc vi k t rng. Kt qu ghi li
trong file tapcon.out. V d sau s minh ha cho file tapcon.in v tapcon.out.
tapcon.in

tapcon.out

7 1 3 8 9 6 12

1 3 8 9 12

Bi 3. Duyt cc tp con tho mn iu kin. Cho dy s a1, a2, . . ., an v s M. Hy tm


tt c cc dy con dy con trong dy s a1, a2, . . ., an sao cho tng cc phn t trong
dy con ng bng M. D liu vo cho bi file tapcon.in, dng u tin ghi li hai s
t nhin N v s M (N100), dng k tip ghi li N s mi s c phn bit vi nhau
bi mt v du trng. Kt qu ghi li trong file tapcon.out. V d sau s minh ha cho
file tapcon.in v tapcon.out
tapcon.in
7

50

10

15

20

25

tapcon.out
20

30

45

30

35

Chng 2: Duyt v qui


15

35

10

15

25

20

25

15

30

10

35

10

15

20

Bi 4. Cho li hnh ch nht gm (nm) hnh vung n v. Hy lit k tt c cc ng


i t im c ta (0, 0) n im c ta (nm). Bit rng, im (0, 0) c coi
l nh di ca hnh vung di nht gc bn tri, mi bc i ch c php thc
hin hoc ln trn hoc xung di theo cnh ca hnh vung n v. D liu vo cho
bi file bai14.inp, kt qu ghi li trong file bai14.out. V d sau s minh ha cho file
bai14.in v bai14.out.
bai14.in
2

bai14.out
0

Bi 5. Duyt mi tp con k phn t t tp gm n phn t. D liu vo cho bi file


tapcon.in, kt qu ghi li trong file tapcon.out. V d sau s minh ha cho tapcon.in v
tapcon.out.
tapcon.in
5

tapcon.out
1

5
46

Chng 2: Duyt v qui


2

Bi 6. Duyt cc tp con k phn t tha mn iu kin. Cho dy s a1, a2, . . ., an v s M.


Hy tm tt c cc dy con dy con k phn t trong dy s a1, a2, . . ., an sao cho tng
cc phn t trong dy con ng bng M. D liu vo cho bi file tapcon.in, dng u
tin ghi li s t nhin n , k v s M, hai s c vit cch nhau bi mt vi k t
trng, dng k tip ghi li n s mi s c vit cch nhau bi mt hoc vi k t
trng. Kt qu ghi li trong file tapcon.out. V d sau s minh ha cho file tapcon.in
v tapcon.out.
tapcon.in
7

50

10

15

20

25

30

35

tapcon.out
5

10

35

15

35

20

25

10 15

25

Bi 7. Duyt mi hon v ca t COMPUTER. D liu vo cho bi file hoanvi.in, kt qu


ghi li trong file hoanvi.out.
Bi 8. Duyt mi ma trn cc hon v. Cho hnh vung gm n n (n 5, n l) hnh vung
n v. Hy in cc s t 1, 2, . . ., n vo cc hnh vung n v sao cho nhng iu
kin sau c tho mn:
c theo hng ta nhn c n hon v khc nhau ca 1, 2, . . ., n;
c theo ct ta nhn c n hon v khc nhau ca 1, 2, . . ., n;
c theo hai ng cho ta nhn c 2 hon v khc nhau ca 1, 2, . . ., n;
Hy tm t nht 1 (hoc tt c) cc hnh vung tho mn 3 iu kin trn. D liu vo
cho bi file hoanvi.in, kt qu ghi li trong file hoanvi.out. V d sau s minh ha cho file
input & output ca bi ton.
hoanvi.in
5
hoanvi.out
5 3

2
47

Chng 2: Duyt v qui


1 2

3 4

2 5

4 1

Bi 9. Duyt mi cch chia s t nhin n thnh tng cc s nguyn nh hn. D liu vo


cho bi file chiaso.in, kt qu ghi li trong file chiaso.out. V d sau s minh ha cho
file input & output ca bi ton.
chiaso.in
4
chiaso.out
4
3

Bi 10. Duyt mi b gi tr trong tp cc gi tr ri rc. Cho k tp hp cc s thc A1,


A2, . . ., Ak(k 10) c s cc phn t tng ng l N1, N2, . . ., Nk ( cc tp c th c
nhng phn t ging nhau). Hy duyt tt c cc b k phn t a=(a1, a2, . . ., ak) sao
cho aiAi(i=1, 2, . . ., k). D liu vo cho bi file chiaso.in, dng u tin ghi li k+1
s t nhin, mi s c phn bit vi nhau bi mt vi du trng l gi tr ca n, N1,
N2, . . ., Nk; k dng k tip ghi li cc phn t ca tp hp A1, A2, . . ., Ak. Kt qu ghi
li trong file chiaso.out, mi phn t c phn bit vi nhau bi mt vi du trng.
V d sau s minh ha cho file input & output ca bi ton.
Chiaso.inp
3

chiaso.out
1

48

Chng 2: Duyt v qui


2

Bi 11. Tm b gi tr ri rc trong bi 21 hm mc tiu sin(x1+x2 + . . .+ xk) t gi tr


ln nht. D liu vo cho bi file bai22.inp, kt qu ghi li trong file bai22.out.
Bi 12. Duyt mi php ton trong tnh ton gi tr biu thc. Vit chng trnh nhp t bn
phm hai s nguyn M, N. Hy tm cch thay cc du ? trong biu thc sau bi cc
php ton +, -, *, %, / (chia nguyn) sao cho gi tr ca biu thc nhn c bng
ng N:
( (((M?M) ?M)?M)?M)?M)?M
Nu khng c hy a ra thng bo l khng th c.
Bi 13. Bi ton ci ti vi s lng vt khng hn ch. Mt nh thm him em theo
mt ci ti c trng lng khng qu b. C n vt cn em theo, vt th i c
trng lng tng ng l mt s ai v gi tr s dng ci (1in). Hy tm cch b cc
vt vo ti sao cho tng gi tr s dng cc vt l ln nht. Bit rng s lng
cc vt l khng hn ch. D liu vo cho bi file caitui.in, dng u tin ghi li s
t nhin n v s thc b hai s c vit cch nhau bi mt du trng, hai dng k tip
ghi n s trn mi dng, tng ng vi vector gi tr s dng ci v vector trng lng
ai. Kt qu ghi li trong file caitui.out trn 3 dng, dng u ghi li gi tr s dng ti
u, dng k tip ghi li loi vt cn em theo, dng cui cng ghi li s lng ca
mi loi vt. V d sau s minh ha cho file input & output ca bi ton.
caitui.in
4

10

caitui.out
15

49

Chng 2: Duyt v qui


Bi 14. Bi ton ci ti vi s lng vt hn ch. Mt nh thm him em theo mt ci
ti c trng lng khng qu b. C n vt cn em theo, vt th i c trng lng
tng ng l mt s ai v gi tr s dng ci (1in). Hy tm cch b cc vt vo ti
sao cho tng gi tr s dng cc vt l ln nht. Bit rng s lng mi vt l 1.
D liu vo cho bi file caitui.in, dng u tin ghi li s t nhin n v s thc b hai
s c vit cch nhau bi mt du trng, hai dng k tip ghi n s trn mi dng,
tng ng vi vector gi tr s dng ci v vector trng lng ai. Kt qu ghi li trong
file caitui.out trn 2 dng, dng u ghi li gi tr s dng ti u, dng k tip ghi li
loi vt cn em theo. V d sau s minh ho cho file input & output ca bi ton.
caitui.in
4

caitui.out
14
1

Bi 15. Bi ton ngi du lch. Mt ngi du lch mun i tham quan ti n thnh ph khc
nhau. Xut pht ti mt thnh ph no , ngi du lch mun i qua tt c cc thnh
ph cn li mi thnh ph ng mt ln ri quay tr li thnh ph ban u. Bit Cij l
chi ph i li t thnh ph th i n thnh ph th j. Hy tm hnh trnh c chi ph thp
nht cho ngi du lch. D liu vo cho bi file dulich.in, dng u tin ghi li s t
nhin n, n dng k tip ghi li ma trn chi ph Cij. Kt qu ghi li trong file dulich.out,
dng u tin ghi li chi ph ti u, dng k tip ghi li hnh trnh ti u. V d sau s
minh ha cho file input & output ca bi ton.
dulich.in
5
00

48

43

54

31

20

00

30

63

22

29

64

00

04

17

06

19

02

00

08

01

28

07

18

00

dulich.out
81
1

50

Chng 3: Ngn xp, hng i v danh sch mc ni

CHNG 3: NGN XP, HNG I V DANH


SCH MC NI (STACK, QUEUE, LINK LIST)

Ni dung chnh ca chng ny nhm lm r cc phng php, k thut biu din,


php ton v ng dng ca cc cu trc d liu tru tng. Cn c bit lu , ng dng
cc cu trc d liu ny khng ch ring cho lp trnh ng dng m cn ng dng trong biu
din b nh gii quyt nhng vn bn trong ca cc h iu hnh. Cc k thut lp
trnh trn cu trc d liu tru tng c cp y bao gm:
9 K thut lp trnh trn ngn xp.
9 K thut lp trnh trn hng i.
9 K thut lp trnh trn danh sch lin kt n.
9 K thut lp trnh trn danh sch lin kt kp.
Bn c c th tm thy nhng ci t v ng dng c th trong ti liu [1].

3.1. KIU D LIU NGN XP V NG DNG


3.1.1. nh ngha v khai bo
Ngn xp (Stack) hay b xp chng l mt kiu danh sch tuyn tnh c bit m php b
xung phn t v loi b phn t lun lun c thc hin mt u gi l nh (top).
C th hnh dung stack nh mt chng a c xp vo hp hoc mt bng n
c np vo khu sng lin thanh. Qu trnh xp a hoc np n ch c thc hin
mt u, chic a hoc vin n cui cng li chim v tr nh u tin cn a u hoc
vin n u li y ca hp (bottom), khi ly ra th a cui cng hoc vin n cui
cng li c ly ra trc tin. Nguyn tc vo sau ra trc ca stack cn c gi di
mt tn khc LIFO (Last- In- First- Out).
Stack c th rng hoc bao gm mt s phn t. C hai thao tc chnh trn stack l
thm mt nt vo nh stack (push) v loi b mt nt ti nh stack (pop). Khi mun thm
mt nt vo stack th trc ta phi kim tra xem stack y (full) hay cha, nu ta
mun loi b mt nt ca stack th ta phi kim *tra stack c rng hay khng. Hnh 4.1
minh ha s thay i ca stack thng qua cc thao tc thm v bt nh trong stack.
Gi s ta c mt stack S lu tr cc k t. Trng thi bt u ca stack c m t
trong hnh a l trng thi rng, hnh e m t trng thi y. Cc thao tc:
push(S,A)

(hnh b)

push(S,B)

(hnh c)

51

Chng 3: Ngn xp, hng i v danh sch mc ni


push(S,C)

(hnh d)

push(S,D)

(hnh e)

pop(S)

(hnh f)

pop(S)

(hnh g)

B
A

A
(a)

(b)

C
B
A

D
C
B
A

(d)

(e)

(c)

C
B
A

B
A

(f)

(g)

Hnh 3.1. Cc thao tc trn Stack

C th lu tr stack di dng mt vector S gm n thnh phn lin tip nhau. Nu T


l a ch ca phn t nh stack th T s c gi tr bin i khi stack hot ng. Ta gi phn
t u tin ca stack l phn t th 0, nh vy stack rng khi T c gi tr nh hn 0 ta qui
c l -1. Stack trn khi T c gi tr l n-1. Mi khi mt phn t c thm vo stack, gi tr
ca T c tng ln 1 n v, khi mt phn t b loi b khi stack gi tr ca T s gim i
mt n v.
TOP

T
S1

S2

S3

...

ST

BOOTTOM
...

Hnh 3.2. Vector S lu tr Stack

khai bo mt stack, chng ta c th dng mt mng mt chiu. Phn t th 0 l


y stack, phn t cui ca mng l nh stack. Mt stack tng qut l mt cu trc gm hai
trng, trng top l mt s nguyn ch nh stack. Trng node: l mt mng mt chiu
gm MAX phn t trong mi phn t l mt nt ca stack. Mt nt ca stack c th l
mt bin n hoc mt cu trc phn nh tp thng tin v nt hin ti. V d, khai bo stack
dng lu tr cc s nguyn.
#define

TRUE 1

#define

FALSE 0

#define

MAX

typedef struct

100
{

int

top;

int

nodes[MAX];

} stack;

52

Chng 3: Ngn xp, hng i v danh sch mc ni


3.1.2. Cc thao tc vi stack
Trong khi khai bo mt stack dng danh sch tuyn tnh, chng ta cn nh ngha
MAX ln c th lu tr c mi nh ca stack. Mt stack b trn (TOP = MAX1) th n khng th thm vo phn t trong stack, mt stack rng th n khng th a ra
phn t. V vy, chng ta cn xy dng thm cc thao tc kim tra stack c b trn hay
khng (full) v thao tc kim tra stack c rng hay khng (empty).
Thao tc Empty: Kim tra stack c rng hay khng:
int

Empty(stack *ps) {
if (ps ->top == -1)
return(TRUE);
return(FALSE);

Thao tc Push: Thm nt mi x vo nh stack v thay i nh stack.


void

Push (stack *ps, int x) {


if ( ps ->top == -1) {
printf(\n stack full);
return;
}
ps -> top = ps ->top + 1;
ps -> nodes[ps->top] = x;

Thao tc Pop : Loi b nt ti nh stack.


int

Pop ( stack *ps) {


if (Empty(ps) {
printf(\n stack empty);
return(0);
}
return( ps -> nodes[ps->top --]);

3.1.3. ng dng ca stack


Stack c nng dng biu din nhiu thut gii phc tp khc nhau, c bit i
vi nhng bi ton cn s dng n cc li gi qui. Di y l mt s cc v d in
hnh ca vic ng dng stack.
o ngc xu k t: Qu trnh o ngc mt xu k t ging nh vic a vo
(push) tng k t trong xu vo stack, sau a ra (pop) cc k t trong stack ra cho ti khi
stack rng ta c mt xu o ngc.
Chuyn i s t h thp phn sang h c s bt k: chuyn i mt s h
thp phn thnh s h c s bt k, chng ta ly s chia cho c s cn chuyn i, lu

53

Chng 3: Ngn xp, hng i v danh sch mc ni


tr li phn d ca php chia, sau o ngc li dy cc s d ta nhn c s cn
chuyn i, vic lm ny ging nh c ch LIFO ca stack.
Tnh gi tr mt biu thc dng hu t:Xt mt biu thc dng hu t ch cha cc
php ton cng (+), tr (-), nhn (*), chia (/), ly tha ($). Cn phi nhc li rng, nh logic
hc Lewinski chng minh c rng, mi biu thc u c th biu din di dng hu
t m khng cn dng thm cc k hiu ph.
23+5*2$ = ( (2 + 3) *5 ) 2 = 625

V d :

tnh gi tr ca biu thc dng hu t, chng ta s dng mt stack lu tr biu


thc qu trnh tnh ton c thc hin nh sau:
Ly ton hng 1 ( 2 ) -> Ly ton hng 2 ( 3 ) -> Ly php ton + -> Ly ton hng 1
cng ton hng 2 v y vo stack (5) -> Ly ton hng tip theo (5), ly php ton tip theo
(*), nhn vi ton hng 1 ri y vo stack (25), ly ton hng tip theo (2), ly php ton tip
theo ($) v thc hin, ly lu tha ri y vo stack. Cui cng ta nhn c 25 2= 625.
Di y l chng trnh o ngc xu k t s dng stack. Nhng v d khc, bn
c c th tm thy trong cc ti liu [1], [2].
V d 3.1. Chng trnh o ngc xu k t.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#define

MAX

100

#define

TRUE 1

#define

FALSE 0

typedef

struct{
int top;
char node[MAX];

} stack;
/* nguyen mau cua ham*/
int

Empty(stack *);

void Push(stack *, char);


char Pop(stack *);
/* Mo ta ham */
int Empty(stack *ps){
if (ps->top==-1)
return(TRUE);
return(FALSE);
}
void Push(stack *ps, char x){

54

Chng 3: Ngn xp, hng i v danh sch mc ni


if (ps->top==MAX-1 ){
printf("\n Stack full");
delay(2000);
return;
}
(ps->top)= (ps->top) + 1;
ps->node[ps->top]=x;
}
char Pop(stack *ps){
if (Empty(ps)){
printf("\n Stack empty");
delay(2000);return(0);
}
return( ps ->node[ps->top--]);
}
void main(void){
stack s;
char c, chuoi[MAX];
int i, vitri,n;s.top=-1;clrscr();
printf("\n Nhap String:");gets(chuoi);
vitri=strlen(chuoi);
for (i=0; i<vitri;i++)
Push(&s, chuoi[i]);
while(!Empty(&s))
printf("%c", Pop(&s));
getch();
}

3.2. HNG I (QUEUE)


3.2.1. nh ngha v khai bo
Khc vi stack, hng i (queue) l mt danh sch tuyn tnh m thao tc b sung
phn t c thc hin mt u gi l li vo (rear). Php loi b phn t c thc hin
mt u khc gi l li ra (front). Nh vy, c ch ca queue ging nh mt hng i, i
vo mt u v i ra mt u hay FIFO (First- In- First- Out).
Ta c th khai bo hng i nh mt danh sch tuyn tnh gm MAX phn t mi
phn t l mt cu trc, hai bin front, rear tr li vo v li ra trong queue. V d di y
nh ngha mt hng i ca cc sn phm gm hai thuc tnh m hng (mahang) v tn
hng (ten).
typedef

struct{
int mahang;

55

Chng 3: Ngn xp, hng i v danh sch mc ni


char ten[20];
} hang;
typedef struct {
int front, rear;
hang node[MAX];
} q;

truy nhp vo hng i, chng ta s dng hai bin con tr front ch li trc v
rear ch li sau. Khi li trc trng vi li sau (q.rear = q.rear) th queue trng thi rng
(hnh a), thm d liu vo hng i cc phn t A, B, C c thc hin thng qua thao
tc insert(q,A), insert(q,B), insert(q,C) c m t hnh b, thao tc loi b phn t khi
hng i Remove(q) c m t hnh c, nhng thao tc tip theo c m t ti hnh d, e.

Hnh a. Trng thi rng ca hng i.


q.rear=2
C

q.front=0
B

q.rear=2 q.front=1
C
q.rear=3
D
q.rear=3
D

Hnh c. remove(q).

B
q.front=1

Hnh b. insert(Q,A);insert(Q,B), insert(Q,C)

Hnh d. insert(q,D).

B
q.front=2

Hnh e. remove(q).

C
Hnh 3.3. Cc thao tc trn Hng i (Queue)

Cch t chc ny s dn ti trng hp cc phn t di chuyn khp khng gian nh


khi thc hin b sung v loi b. Trong nhiu trng hp, khi thc hin thm hoc loi b
phn t ca hng i chng ta cn xt ti mt th t u tin no , khi hng i c
gi l hng i c u tin ( Priority Queue ). Vi priority queue, th nt no c u
tin cao nht c thc hin loi b trc nht, cn vi thao tc thm phn t vo hng i
tr thnh thao tc thm phn t vo hng i c xt ti u tin.

56

Chng 3: Ngn xp, hng i v danh sch mc ni


3.2.2. ng dng hng i
Mi vn ca thc t lin quan ti c ch FIFO nh c ch gi tin, rt tin trong
ngn hng, t v my bay u c th ng dng c bng hng i. Hng i cn c
nhng ng dng trong vic gii quyt cc bi ton ca H iu hnh v chng trnh dch
nh bi ton iu khin cc qu trnh, iu khin np chng trnh vo b nh hay bi ton
lp lch. Bn c c th tham kho thm trong cc ti liu [1], [2]. Di y, chng ta a
ra mt ng dng ca hng i gii quyt bi ton Nh sn xut v Ngi tiu dng.
V d 3.2- Gii quyt bi ton Ngi sn xut v nh tiu dng vi s cc vng m
hn ch.
Chng ta m t qu trnh sn xut v tiu dng nh hai qu trnh ring bit v thc
hin song hnh, ngi sn xut c th sn xut ti a n mt hng. Ngi tiu dng ch c
php s dng trong s n mt hng. Tuy nhin, ngi sn xut ch c th lu tr vo kho
khi v ch khi kho cha b y. Ngc li, nu kho hng khng rng (kho c hng) ngi
tiu dng c th tiu dng nhng mt hng trong kho theo nguyn tc hng no nhp vo
kho trc c tiu dng trc ging nh c ch FIFO ca queue. Sau y l nhng thao
tc ch yu trn hng i gii quyt bi ton:
Ta xy dng hng i nh mt danh sch tuyn tnh gm MAX phn t mi phn t
l mt cu trc, hai bin front, rear tr n li vo v li ra trong queue:
typedef

struct{
int mahang;
char ten[20];

} hang;
typedef struct {
int front, rear;
hang node[MAX];
} queue;

Thao tc Initialize: thit lp trng thi ban u ca hng i. trng thi ny, font
v rear c cng mt gi tr MAX-1.
void Initialize ( queue *pq){
pq->front = pq->rear = MAX -1;
}

Thao tc Empty: kim tra hng i c trng thi rng hay khng. Hng i rng
khi front == rear.
int Empty(queue *pq){
if (pq->front==pq->rear)
return(TRUE);
return(FALSE);
}

57

Chng 3: Ngn xp, hng i v danh sch mc ni


Thao tc Insert: thm X vo hng i Q. Nu vic thm X vo hng i c thc
hin u hng, khi rear c gi tr 0, nu rear khng phi u hng i th gi tr ca
n c tng ln 1 n v.
void Insert(queue *pq, hang x){
if (pq->rear==MAX-1 )
pq->rear=0;
else
(pq->rear)++;
if (pq->rear ==pq->front){
printf("\n Queue full");
delay(2000);return;
}
else
pq->node[pq->rear]=x;
}

Thao tc Remove: loi b phn t v tr front khi hng i. Nu hng i trng


thi rng th thao tc Remove khng th thc hin c, trong trng hp khc front c
tng ln mt n v.
hang

Remove(queue *pq){
if (Empty(pq)){
printf("\n Queue Empty");
delay(2000);
}
else {
if (pq->front ==MAX-1)
pq->front=0;
else
pq->front++;
}
return(pq->node[pq->front]);

Thao tc Traver: Duyt tt c cc nt trong hng i.


void Traver( queue *pq){
int i;
if(Empty(pq)){
printf("\n Queue Empty");
return;
}
if (pq->front ==MAX-1)
i=0;

58

Chng 3: Ngn xp, hng i v danh sch mc ni


else
i = pq->front+1;
while (i!=pq->rear){
printf("\n %11d % 15s", pq->node[i].mahang, pq->node[i].ten);
if(i==MAX-1)
i=0;
else
i++;
}
printf("\n %11d % 15s", pq->node[i].mahang, pq->node[i].ten);
}

Di y l ton b vn bn chng trnh:


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <math.h>
#define

MAX

50

#define

TRUE 1

#define

FALSE 0

typedef

struct{
int mahang;
char ten[20];

} hang;
typedef struct {
int front, rear;
hang node[MAX];
} queue;
/* nguyen mau cua ham*/
void

Initialize( queue *pq);

int

Empty(queue *);

void Insert(queue *, hang x);


hang Remove(queue *);
void

Traver(queue *);

/* Mo ta ham */
void Initialize ( queue *pq){
pq->front = pq->rear = MAX -1;
}
int Empty(queue *pq){
if (pq->front==pq->rear)

59

Chng 3: Ngn xp, hng i v danh sch mc ni


return(TRUE);
return(FALSE);
}
void Insert(queue *pq, hang x){
if (pq->rear==MAX-1 )
pq->rear=0;
else
(pq->rear)++;
if (pq->rear ==pq->front){
printf("\n Queue full");
delay(2000);return;
}
else
pq->node[pq->rear]=x;
}
hang

Remove(queue *pq){
if (Empty(pq)){
printf("\n Queue Empty");
delay(2000);
}
else {
if (pq->front ==MAX-1)
pq->front=0;
else
pq->front++;
}
return(pq->node[pq->front]);

}
void Traver( queue *pq){
int i;
if(Empty(pq)){
printf("\n Queue Empty");
return;
}
if (pq->front ==MAX-1)
i=0;
else
i = pq->front+1;
while (i!=pq->rear){
printf("\n %11d % 15s", pq->node[i].mahang, pq->node[i].ten);
if(i==MAX-1)

60

Chng 3: Ngn xp, hng i v danh sch mc ni


i=0;
else
i++;
}
printf("\n %11d % 15s", pq->node[i].mahang, pq->node[i].ten);
}
void main(void){
queue q;
char chucnang, front1; char c; hang mh;
clrscr();
Initialize(&q);
do {
clrscr();
printf("\n NGUOI SAN XUAT/ NHA TIEU DUNG");
printf("\n 1- Nhap mot mat hang");
printf("\n 2- Xuat mot mat hang");
printf("\n 3- Xem mot mat hang");
printf("\n 4- Xem hang moi nhap");
printf("\n 5- Xem tat ca");
printf("\n 6- Xuat toan bo");
printf("\n Chuc nang chon:");chucnang=getch();
switch(chucnang){
case 1:
printf("\n Ma mat hang:"); scanf("%d", &mh.mahang);
printf("\n Ten hang:");scanf("%s", mh.ten);
Insert(&q,mh);break;
case 2:
if (!Empty(&q)){
mh=Remove(&q);
printf("\n %5d %20s",mh.mahang, mh.ten);
}
else {
printf("\n Queue Empty");
delay(1000);
}
break;
case 3:
front1=(q.front==MAX-1)?0:q.front+1;
printf("\n Hang xuat");
printf("\n%6d%20s",q.node[front1].mahang,q.node[front1].ten);
break;

61

Chng 3: Ngn xp, hng i v danh sch mc ni


case 4:
printf("\n Hang moi nhap");
printf("\n%5d%20s",q.node[q.rear].mahang,q.node[q.rear].ten);
break;
case 5:
printf("\ Hang trong kho");
Traverse(&q);delay(2000);break;
}
} while(chucnang!=0);
}

3.3. DANH SCH LIN KT N


3.3.1. Gii thiu v nh ngha
Mt danh sch mc ni, hoc ngn gn hn, mt danh sch, l mt dy c th t cc
phn t c gi l nh. Danh sch c im bt u, gi l tiu hay nh u, mt im
cui cng gi l nh cui. Mi nh trong danh sch u c cng kiu ngay c khi kiu
ny c nhiu dng khc nhau.
Bn cht ng l mt trong nhng tnh cht chnh ca danh sch mc ni. C th
thm hoc bt nh trong danh sch vo mi lc, mi v tr. V s nh ca danh sch khng
th d kin trc c, nn khi thc hin, chng ta phi dng con tr m khng dng c
mng bo m vic thc hin hiu qu v tin cy.
Mi nh trong danh sch u gm hai phn. Phn th nht cha d liu. D liu c
th ch l mt bin n hoc l mt cu trc (hoc con tr cu trc) c kiu no . Phn
th hai ca nh l mt con tr ch vo a ch ca nh tip theo trong danh sch. V vy c
th d dng s dng cc nh ca danh sch qua mt cu trc t tr hoc qui.
Danh sch mc ni n gin di y xy dng mi nh ca danh sch ch lu gi
mt bin nguyn.
/*nh ca danh sch n ch cha mt s nguyn*/
struct don {
int phantu;
struct don *tiep;
};
typedef struct don don_t;

Trong trng hp ny, bin nguyn phantu ca tng nh cha d liu cn bin con
tr tiep cha a ch ca nh tip theo. S biu din danh sch mc ni n c biu
din nh hnh di y:
Phn_t

Phn_t

Phn_t

Hnh 3.4. Danh sch mc ni n

62

....

Chng 3: Ngn xp, hng i v danh sch mc ni


Tng qut hn, mi nh ca danh sch c th cha nhiu phn t d liu. Trong
trng hp ny, hp l hn c l nh ngha mt kiu cu trc tng ng vi d liu cn
lu gi ti mi nh. Phng php ny c s dng trong nh ngha kiu sau y:
/*nh ca danh sch tng qut */
struct tq {
thtin_t phantu;
struc tq*tiep;
};
typedef struct tq tq_t;

Kiu cu trc thtin_t phi c nh ngha trc tng ng vi cc d liu s


c lu tr ti tng nh. Danh sch c to nn t kiu nh ny ging nh s
trong Hnh 3.4, ngoi tr vic mi phantu l mt bin nguyn.
3.3.2. Cc thao tc trn danh sch mc ni
Cc thao tc trn danh sch mc ni bao gm vic cp pht b nh cho cc nh v
gn d liu cho con tr. danh sch c to nn ng n, ta biu din phn t cui
danh sch l mt con tr NULL. Con tr NULL l tn hiu thng bo khng cn phn t
no tip theo trong danh sch na.
Tin hn c l chng ta nh ngha mt con tr ti danh sch nh sau:
struct node {
int infor;
struct node *next;
};
typedef struct node *NODEPTR; // Con tr ti node

Cp pht b nh cho mt node:


NODEPTR Getnode(void) {
NODEPTR p;
P = (NODEPTR) malloc(sizeof( struct node));
Return(p);
}

Gii phng b nh ca mt node


NODEPTR Freenode( NODEPTR p){
free(p);
}

Chn mt phn t mi vo u danh sch:


Cc bc chn mt phn t mi vo u danh sch cn thc hin l:
9 Cp khng gian b nh lu gi mt nh mi;
9 Gn cc gi tr con tr thch hp cho nh mi;

63

Chng 3: Ngn xp, hng i v danh sch mc ni


9 Thit lp lin kt vi nh mi.
S biu din php thm mt nh mi vo u danh sch c th hin nh trn
hnh 3.5.
infor

next

infor

infor

next

infor

next

next
Node cn chn vo u danh sch mc ni.

Hnh 3.5. Thm nh mi vo u danh sch mc ni n


void Push_Top( NODEPTR *plist, int x) {
NODEPTR p;
p= Getnode(); // cp khng gian nh cho nh mi
p -> infor = x; // gn gi tr thch hp cho nh mi
p ->next = *plist;
*plist = p; // thit lp lin kt
}

Thm mt phn t mi vo cui danh sch:


thm mt node vo cui danh sch, ta cn thc hin qua cc bc sau:
9 Cp pht b nh cho node mi;
9 Gn gi tr thch hp cho node mi;
9 Di chuyn con tr ti phn t cui danh sch;
9 Thit lp lin kt cho node mi.
S th hin php thm mt phn t mi vo cui danh sch c th hin nh
trong hnh 3.6

infor

next

infor

next

infor

infor

next

Hnh 3.6. Thm node mi vo cui danh sch.


64

next

NULL

Chng 3: Ngn xp, hng i v danh sch mc ni


void Push_Bottom( NODEPTR *plist, int x) {
NODEPTR p, q;
p= Getnode(); // cp pht b nh cho node mi
p->infor = x; // gn gi tr thng tin thch hp
q = *plist; // chuyn con tr ti cui danh sch
while (q-> next != NULL)
q = q -> next;
// q l node cui cng ca danh sch lin kt
q -> next = p; //node cui by gi l node p;
p ->next = NULL; // lin kt mi ca p
}

Thm node mi q vo gia danh sch trc node p:


thm node q vo trc node p, chng ta cn lu node p phi c thc trong danh
sch. Gi s node p l c thc, khi xy ra hai tnh hung: hoc node p l node cui cng
ca danh sch lin kt tc p->next =NULL, hoc node p cha phi l cui cng hay p->next
!= NULL. Trng hp th nht, chng ta ch cn gi ti thao tc Push_Bottom(). Trng
hp th 2, chng ta thc hin theo cc bc nh sau:
9 Cp pht b nh cho node mi;
9 Gn gi tr thch hp cho node;
9 Thit lp lin kt node q vi node k tip p;
9 Thit lp lin kt node node p vi node q;
void Push_Before( NODEPTR p, int x ){
NODEPTR q;
if (p->next==NULL)
Push_Bottom(p, x);
else {
q= Getnode(); // cp pht b nh cho node mi
q -> infor = x; // gn gi tr thng tin thch hp
q-> next = p-> next; // thit lp lin kt node q vi node k tip p;
p->next = q; // thit lp lin kt node p vi node k tip q;
}
}

S thm node vo gia danh sch c th hin nh sau:

65

Chng 3: Ngn xp, hng i v danh sch mc ni


p
infor

next

infor

next

infor

next

q
infor

next

NULL

Hnh 3.7. Php thm phn t vo gia danh sch lin kt n.

Xo mt node ra khi u danh sch:


Khi loi b node khi u danh sch lin kt, chng ta cn ch rng nu danh sch ang
rng th khng th thc hin vic loi b. Trong trng hp cn li, ta thc hin nh sau:
9 Dng node p tr ti u danh sch;
9 Dch chuyn v tr u danh sch ti node tip theo;
9 Loi b lin kt vi p;
9 Gii phng node p;
void Del_Top( NODEPTR *plist) {
NODEPTR p;
p = *plist; // node p tr ti u danh sch;
if (p==NULL) return; // danh sch rng
(*plist) = (*plist) -> next; // dch chuyn node gc ln node k tip
p-> next = NULL; //loi b lin kt vi p
Freenode(p); // gii phng p;
}

Loi b node cui danh sch:


Mt node cui danh sch c th xy ra ba tnh hung sau:
9 Danh sch rng: ta khng cn thc hin loi b;
9 Danh sch ch c ng mt node: ng vi trng hp loi b node gc;
Trng hp cn li danh sch c nhiu hn mt node, khi ta phi dch chuyn ti
node gn node cui cng nht thc hin loi b.
void Del_Bottom(NODEPTR *plist) {
NODEPTR p, q;
if (*plist==NULL) return; //khng lm g
else if ( (*plist)->next==NULL)) // danh sch c mt node
Del_Top(plist);
else {

66

Chng 3: Ngn xp, hng i v danh sch mc ni


p = *plist;
while (p->next!=NULL){
q = p;
p = p->next; // q l node sau node p;
}
// p l node cui danh sch;
q->next =NULL; //node cui cng l q
Freenode(p); //gii phng p;
}
}

Loi b node gia danh sch (trc node p):


Cn rng, nu trc node p l NULL (p->next==NULL) th ta khng thc hin
loi b c. Trng hp cn li chng ta thc hin nh sau:
9 Dng node q tr ti node trc node p;
9 Loi b lin kt ca q;
9 Gii phng q.
void Del_before(NODEPTR p){
NODEPTR q;
if (p->next==NULL) return; // khng lm g
q = p ->next;
p->next = q->next;
Freenode(q);
}

Bn c c th tm thy nhng ci t c th ca danh sch lin kt n trong cc ti


liu [1], [2].

3.4. DANH SCH LIN KT KP


Mi khi thao tc trn danh sch, vic duyt danh sch theo c hai chiu t ra thun
tin hn cho ngi s dng. i khi chng ta phi di chuyn trong danh sch t node cui
ln node u hoc ngc li bng cch i qua mt lot cc con tr. iu ny c th d dng
gii quyt c nu ta tng thng tin cha ti tng nh ca danh sch. Ngoi con tr cha
a ch nh tip theo, ta thm con tr trc cha a ch ng sau nh ny. Lm nh
vy, chng ta thu c mt cu trc d liu mi gi l danh sch lin kt kp.
struct node {
int infor;
struct node *right;// con tr ti node sau
struct node *left; // con tr ti node k tip
};
typedef struct node *NODEPTR; // nh ngha con tr ti node

67

Chng 3: Ngn xp, hng i v danh sch mc ni

Null

Null

Hnh 3.8. M t mt danh sch lin kt kp.


Cc thao tc trn danh sch lin kt kp cng tng t nh danh sch lin kt n.
Nhng cn ch rng, mi node p ca danh sch lin kt kp c hai ng lin kt l p->
left v p->right;
Thao tc thm node mi vo u danh sch lin kt kp:
9 Cp pht b nh cho node mi;
9 Gn gi tr thch hp cho node mi;
9 Thit lp lin kt cho node mi;
void Push_Top(NODEPTR *plist, int x){
NODEPTR p;
p = Getnode(); //cp pht b nh cho node
p ->infor = x; //gn gi tr thch hp;
p -> right = *plist; // thit lp lin kt phi
(*plist) ->left = p; // thit lin kt vi *plist
p-> left = NULL;// thit lp lin kt tri
*plist = p;
}

Thao tc thm node vo cui danh sch:


9 Nu danh sch rng th thao tc ny trng vi thao tc thm node mi vo u
danh sch.
9 Nu danh sch khng rng chng ta thc hin nh sau:

Cp pht b nh cho node;

Gn gi tr thch hp cho node;

Chuyn con tr ti node cui trong danh sch;

Thit lp lin kt tri;

Thit lp lin kt phi;

void Push_Bottom(NODEPTR *plist, int x){


NODEPTR p, q;
if (*plist ==NULL)
Push_Top(plist, x);
else {
p= Getnode();// cp pht b nh cho node
p->infor =x; //gn gi tr thch hp
//chuyn con tr ti node cui danh sch

68

Chng 3: Ngn xp, hng i v danh sch mc ni


q = *plist;
while (q->right!=NULL)
q = q->right;
//q l node cui cng trong danh sch
q -> right =p; // lin kt phi
p->left = q; // lin kt tri
p->right =NULL; //lin kt phi
}
}

Thm node vo trc node p:


Mun thm node vo trc node p th node p phi tn ti trong danh sch. Nu node
p tn ti th c th xy ra hai trng hp: hoc node p l node cui cng ca danh sch hoc
node p l node cha phi l cui cng. Trng hp th nht ng vi thao tc Push_Bottom.
Trng hp th hai, chng ta lm nh sau:
9 Cp pht b nh cho node;
9 Gn gi tr thch hp;
9 Thit lp lin kt tri cho node mi;
9 Thit lp lin kt phi cho node mi;
Qu trnh c m t bi th tc sau:
void Push_Before(NODEPTR p, int x){
NODEPTR q;
if (p==NULL) return; //khng lm g
else if (p->next==NULL)
Push_Bottom(p, x);
else {
q = Getnode(); // cp pht b nh cho node mi
q ->infor = x; //gn gi tr thng tin thch hp
q ->right = p->right; //thit lp lin kt phi
(p ->right) ->left =q;
q -> left = p; //thit lp lin kt tri
p ->right = q;
}
}

Loi b node u danh sch:


9 Nu danh sch rng th khng cn loi b;
9 Dng node p tr ti u danh sch;
9 Chuyn gc ln node k tip;

69

Chng 3: Ngn xp, hng i v danh sch mc ni


9 Loi b lin kt vi node p;
9 Gii phng p;
void Del_Top(NODEPTR *plist){
NODEPTR p;
if ( (*plist)==NULL) return; //khng lm g
p = *plist; //p l node u tin trong danh sch
(*plist) = (*plist) -> right; // chuyn node gc ti node k tip
p ->right =NULL; // ngt lin kt phi ca p;
(*plist) ->left ==NULL;//ngt lin kt tri vi p
Freenode(p); //gii phng p
}

Loi b node cui danh sch:


9 Nu danh sch rng th khng cn loi b;
9 Nu danh sch c mt node th n l trung hp loi phn t u danh
sch;
9 Nu danh sch c nhiu hn mt node th:

Chuyn con tr ti node cui cng;

Ngt lin kt tri ca node;

Ngt lin kt phi ca node;

Gii phng node.

void Del_Bottom(NODEPTR *plist) {


NODEPTR p, q;
if ((*plist)==NULL) return; //khng lm g
else if ( (*plist) ->right==NULL) Del_Top(plist);
else {
p = *plist; // chuyn con tr ti node cui danh sch
while (p->right!=NULL)
p =p->right;
// p l node cui ca danh sch
q = p ->left; //q l node sau p;
q ->right =NULL; //ngt lin kt phi ca q
p -> left = NULL; //ngt lin kt tri ca p
Freenode(p); //gii phng p
}
}

Loi node trc node p


9 Nu node p khng c thc th khng th loi b;

70

Chng 3: Ngn xp, hng i v danh sch mc ni


9 Nu node p l node cui th cng khng th loi b;
9 Trng hp cn li c thc hin nh sau:

Ngt lin kt tri vi node p ng thi thit lp lin kt phi vi node


(pright)right;

Ngt lin kt phi vi node p ng thi thit lp lin kt tri vi node


(pright)right;

Gii phng node pright.

void Del_Before(NODEPTR p){


NODEPTR q, r;
if (p==NULL || p->right==NULL) return;
/*khng lm g
nu node p l khng c thc hoc l node cui cng */
q = (p->right)->right; //q l node trc node p ->right
r = p->right; // r l node cn loi b
r -> left =NULL; //ngt lin kt tri ca r
r->right ==NULL;//ngt lin kt phi ca r
p->right =q; //thit lp lin kt phi mi cho p
q ->left = p; // thit lp lin kt tri mi cho p
Freenode(r); //gii phng node
}

71

Chng 3: Ngn xp, hng i v danh sch mc ni

NHNG NI DUNG CN GHI NH

9 Cc phng php nh ngha stack, khi no dng stack & vai tr ca stack i vi
cc gii thut qui.
9 Phng php nh ngha hng i, cc thao tc trn hng i v ng dng ca
hng i.
9 Bn cht ng l tnh cht c bn nht ca danh sch lin kt n v lin kt kp.
9 S khc bit c bn ca danh sch lin kt n v danh sch lin kt kp l cc
con tr left v right.
9 Nhng ng dng ln thng c ci t trn cc cu trc d liu ng.
9 Ch gii phng b nh cho con tr trong khi lp trnh.

72

Chng 3: Ngn xp, hng i v danh sch mc ni

BI TP CHNG 3

Bi 1. Xu thun nghch c l xu bt nh phn c di n m khi o xu ta vn nhn


c chnh xu . Hy lit k tt c cc xu thun nghch c c di n v ghi li
nhng xu vo File thuang.out theo tng dng, dng u tin ghi li gi tr ca n,
cc dng tip theo l nhng xu thun nghch c c di n. V d: vi n=4, ta c
c nhng xu thun nghch c c dng sau:
4
0

Bi 2. Vit chng trnh qun l im thi ca sinh vin bng single (double) link list bao
gm nhng thao tc sau:
- Nhp d liu;
- Hin th d liu theo lp, xp loi . . .;
- Sp xp d liu;
- Tm kim d liu;
- In n kt qu.
Trong , thng tin v mi sinh vin c nh ngha thng qua cu trc sau:
typedef struct {
int

masv; // m sinh vin;

char

malop[12]; //m lp

char

hoten[30]; //h tn sinh vin

float

diemki; // im tng kt k 1

float

diemkii;// im tng kt k 2

float

diemtk; // im tng kt c nm

char

xeploai[12]; // xp loi

} sinhvien;

Bi 3. Biu din biu thc theo c php Ba Lan. Biu thc nguyn l mt dy c thnh
lp t cc bin kiu nguyn ni vi nhau bng cc php ton hai ngi ( cng: + , tr : , nhn : *) v cc du m ngoc n (, ng ngoc n ). Nguyn tc t tn bin
v th t thc hin cc php ton c thc hin nh sau:
-

Qui tc t tn bin: L dy cc k t ch in thng hoc k t s


di khng qu 8, k t bt u phi l mt ch ci.
73

Chng 3: Ngn xp, hng i v danh sch mc ni


-

Qui tc thc hin php ton: Biu thc trong ngoc n c tnh
trc, php ton nhn * c u tin cao hn so vi hai php ton
cng v tr. Hai php ton cng + v tr c cng u tin. V d :
a * b + c phi c hiu l: (a * b) + c.

Dng vit khng ngoc Ba Lan cho biu thc nguyn c nh ngha nh sau:
-

Nu e l tn bin th dng vit Ba Lan ca n chnh l e,

Nu e1 v e2 l hai biu thc c dng vit Ba Lan tng ng l d1 v


d2 th dng vit Ba Lan ca e1 + e2 l d1 d2+, ca e1 - e2 l d1 d2-,
ca e1*e2 l d1 d2* ( Gia d1 v d2 c ng mt du cch, trc du
php ton khng c du cch),

Nu e l biu thc c dng vit Ba Lan l d th dng vit Ba Lan ca


biu thc c ngoc n (e) chnh l d ( khng cn du ngoc na) . V
d: Biu thc (c+b*(f-d)) c dng vit Ba Lan l : c b f d-*+.

Cho file d liu balan.in c t chc thnh tng dng, mi dng khng di qu 80
k t l biu din ca biu thc nguyn A. Hy dch cc biu thc nguyn A thnh dng
vit Ba Lan ca A ghi vo file balan.out theo tng dng. V d: vi file balan.in di y s
cho ta kt qu nh sau:
balan.in

balan.out

a+b

a b+

a-b

a b-

a*b

a b*

(a - b) +c

a b- c+

(a + b) * c

a b+ c*

(a + (b-c))

a b c-+

( a + b*(c-d))

a b c d-*+

( (a + b) *c- ( d + e) * f)

a b+c* d e+f*-

Bi 4. Tnh ton gi tr biu thc Ba Lan. Cho file d liu balan.in gm 2 * n dng trong
, dng c s th t l (1, 3, 5, . . ) ghi li mt xu l biu din Ba Lan ca biu thc
nguyn A, dng c s th t chn (2,4,6, . .) ghi li gi tr ca cc bin xut hin trong
A. Hy tnh gi tr ca biu thc A, ghi li gi tr ca A vo file balan.out tng dng
theo th t: Dng c th t l ghi li biu thc Ba Lan ca A sau khi thay th cc
gi tr tng ng ca bin trong A, dng c th t chn ghi li gi tr ca biu thc A.
V d vi file balan.in di y s cho ta kt qu nh sau:
balan.in

balan.out

a b+

3 5+

74

Chng 3: Ngn xp, hng i v danh sch mc ni


35

a b-

7 3-

73

a b*

43*

43

12

c a b-+

3 4 5-+

345

Bi 5. Lp lch vi mc u tin. lp lch cho CPU p ng cho cc qu trnh ang


i ca h thng, ngi ta biu din mi qu trnh bng mt bn ghi bao gm nhng
thng tin : s qu trnh(Num) l mt s t nhin nh hn 1024, tn qu trnh (Proc) l
mt xu k t di khng qu 32 khng cha du trng gia, u tin qu trnh
l mt s nguyn dng (Pri) nh hn 10, thi gian thc hin ca qu trnh (Time) l
mt s thc. Cc qu trnh ang i trong h c CPU p ng thng qua mt hng
i c gi l hng i cc qu trnh, hng i cc qu trnh vi u tin c xy
dng sao cho nhng iu kin sau c tho mn:
-

Cc qu trnh c sp theo th t u tin;

i vi nhng qu trnh c cng u tin th qu trnh no c thi


gian thc hin t nht c xp ln trc nht.

Cho file d liu lich.in c t chc nh sau:


-

Dng u tin ghi li mt s t nhin n l s cc qu trnh;

n dng k tip, mi dng ghi li thng tin v mt qu trnh ang i.

Hy xy dng hng i cc qu trnh vi u tin. Ghi li th t cc qu trnh m


CPU p ng trn mt dng ca file lich.out, mi qu trnh c phn bit vi nhau bi
mt hoc vi k t trng, dng k tip ghi li s gi cn thit m CPU cn p ng cho cc
qu trnh. V d vi file lich.in di y s cho ta kt qu nh sau:
lich.in
7
1 Data_Processing

10

2 Editor_Program

20

3 System_Call

0.5

4 System_Interative

5 System_Action 3

6 Writing_Data

7 Reading_Data 2

10

20

75

Chng 3: Ngn xp, hng i v danh sch mc ni


lich.out
3

63.5
Bi 6. Thut ton RR (Round Robin): Thut ton SJF p ng c ti a cc qu trnh
hot ng trong h, tuy nhin s c nhiu qu trnh c chi ph thi gian ln phi i
nhiu qu trnh c chi ph thi gian nh thc hin. Vi thut ton SJF , tnh cng bng
ca h b vi phm. khc phc iu trn, thut ton Round Robin thc hin chn
mt lng t thi gian thch hp, sau p ng cho mi qu trnh theo tng vng
vi lng t thi gian chn. u im ca RR l tnh cng bng ca h c m
bo, s cc qu trnh c CPU p ng trn mt n v thi gian chp nhn c.
Nhc im ln nht ca thut ton l vic la chn lng t thi gian p ng cho
mi qu trnh sao cho ti u khng phi l n gin. Hy vit chng trnh m phng
thut ton lp lch RR.

76

Chng 4: Cu trc d liu cy (Tree)

CHNG 4: CU TRC D LIU CY (TREE)

Cy l mt trong nhng cu trc d liu ri rc c ng dng quan trng trong biu


din tnh ton, biu din tri thc & biu din cc i tng d liu phc tp. Trng tm
chnh ca chng ny nhm cung cp cho bn c nhng khi nim v thao tc c bn trn
cy nh phn, bao gm:
9 Khi nim v cy, cy nh phn, cy nh phn tm kim.
9 Khi nim node gc (root), node l (leaf), mc (level) & su ca cy.
9 Phng php biu din v cc thao tc trn cy nh phn.
9 Cc thao tc duyt cy: duyt theo th t trc, duyt theo th t gia & duyt
theo th t sau.
9 Phng php biu din v cc thao tc trn cy nh phn tm kim.
Bn c c th tm hiu su hn v cy nhiu nhnh, cy cn bng v cy nh phn
hon ton cn bng trong ti liu [1].

4.1. NH NGHA V KHI NIM


Cy l mt tp hp hu hn cc node c cng chung mt kiu d liu, trong c
mt node c bit gi l node gc (root). Gia cc node c mt quan h phn cp gi l
quan h cha con. C th nh ngha mt cch qui v cy nh sau:

Mt node l mt cy. Node cng l gc (root) ca cy y.

Nu n l mt node v T1, T2, . .., Tk l cc cy vi n1, n2, . . , nk ln lt l gc th mt


cy mi T s c to lp bng cch cho node n tr thnh cha ca cc node n1, n2, . . ,
nk hay node n tr thnh gc v T1, T2, . ., Tk l cc cy con (subtree) ca gc.

V d: cu trc t chc th mc (directory) ca dos l mt cu trc cy.


4

4.1

4.1.1

4.1.2

4.2

4.3

4.3.1

4.4

4.3.2

Hnh 4.1. V d v mt cy th mc

77

4.4.1

4.4.2

Chng 4: Cu trc d liu cy (Tree)


Mt cy c gi l rng nu n khng c bt k mt node no. S cc node con ca
mt node c gi l cp (degree) ca node . V d: trong cy 4.2 sau, cp ca node A l
3, cp ca node B l 2, cp ca node D l 3, cp ca node H l 2.
A
B

Hnh 4.2. m t cp ca cy
Node c cp bng 0 c gi l l (leaf) hay node tn cng (terminal node). V d:
cc node E, F, C, G, I, J, K c gi l l. Node khng l l c gi l node trung gian hay
node nhnh (branch node). V d node B, D, H l cc node nhnh.
Cp cao nht ca node trn cy gi l cp ca cy, trong trng hp cy trong hnh
4.2 cp ca cy l 3.
Gc ca cy c s mc l 1. Nu node cha c s mc l i th node con c s mc l
i+1. V d gc A c s mc l 1, D c s mc l 2, G c s mc l 3, J c s mc l 4.
Chiu cao (height) hay chiu su (depth) ca mt cy l s mc ln nht ca node
trn cy . Cy 4.2 c chiu cao l 4.
ng i t node n1 n nk l dy cc node n1, n2, . ., nk sao cho ni l node cha ca
node ni+1 (1<=i<k), di ca ng i (path length) c tnh bng s cc node trn
ng i tr i 1 v n phi tnh t node bt u v node kt thc. V d: trong cy 4.2
ng i t node A ti node G l 2, ng i t node A n node K l 3.
Mt cy c gi l c th t nu chng ta xt n th t cc cy con trong cy
(ordered tree), ngc li l cy khng c th t (unordered tree). Thng thng cc cy con
c tnh theo th t t tri sang phi.

4.2. CY NH PHN
Cy nh phn l mt dng quan trng ca cu trc cy c c im l mi node trn
cy ch c ti a l hai node con. Cy con bn tri ca cy nh phn c gi l left subtree,
cy con bn phi ca cy c gi l right subtree. i vi cy nh phn, bao gi cng
c phn bit cy con bn tri v cy con bn phi. Nh vy, cy nh phn l mt cy c
th t. V d trong hnh 4.3 u l cc cy nh phn:

78

Chng 4: Cu trc d liu cy (Tree)


A

E
Hnh 4.3. Cy nh phn

Cc cy nh phn c dng c bit bao gm:

Cy nh phn lch tri (hnh 4.4a): l cy nh phn ch c cc node bn tri.

Cy nh phn lnh phi (hnh 4.4b): l cy ch bao gm cc node phi.

Cy nh phn zic zc (hnh 4.4 c, 4.4d): node tri v node phi ca cy an


xen nhau thnh mt hnh zic zc.

Cy nh phn hon chnh ( strictly binary tree: hnh 4.4e) : Mt cy nh phn


c gi l hon chnh nu nh node gc v tt c cc node trung gian u c
hai con.

Cy nh phn y (complete binary tree : hnh 4.4f): Mt cy nh phn


c gi l y vi chiu su d th n phi l cy nh phn hon chnh v
tt c cc node l u c chiu su l d.
A
B

A
B
B

B
C

E
E

E
Hnh 4.4a

Hnh 4.4b

Hnh 4.4c

79

E
Hnh

4.4d

Chng 4: Cu trc d liu cy (Tree)


A
B
D

C
E

G
D

C
E

I
Hnh 4.4 e

Hnh 4.4f

Cy nh phn hon ton cn bng (hnh 4.5): l cy nh phn m tt c cc node


ca n s node trn nhnh cy con bn tri v s node trn nhnh cy con bn phi chnh
lnh nhau khng qu 1. Nu ta gi Nl l s node ca nhnh cy con bn tri v Nr l s node
ca nhnh cy con bn phi, khi cy nh phn hon ton cn bng ch c th l mt trong
3 trng hp:

S node nhnh cy con bn tri bng s node nhnh cy con bn phi bng
(Nl = Nr ) (hnh 4.5a).

S node nhnh cy con bn tri bng s node nhnh cy con bn phi cng 1
(Nl = Nr+1) (hnh 4.5b)

S node nhnh cy con bn tri bng s node nhnh cy con bn phi tr 1


(Nl = Nr-1) (hnh 4.5c).
A
B

Hnh 4.5a

C
D

Hnh 4.5b

Hnh 4.5c

Cy nh phn tm kim: l mt cy nh phn hoc b rng hoc tt c cc node trn


cy tha mn iu kin sau:

Ni dung ca tt c cc node thuc nhnh cy con bn tri u nh hn ni


dung ca node gc.

Ni dung ca tt c cc node thuc nhnh cy con bn phi u ln hn ni


dung ca node gc.

80

Chng 4: Cu trc d liu cy (Tree)

Cy con bn tri v cy con bn phi cng t nhin hnh thnh hai cy nh


phn tm kim.
10

20

12
8

30
25

15

10

22

37

10

19

29

40

28

39

Hnh 4.6. V d v cy nh phn tm kim

4.3. BIU DIN CY NH PHN


4.3.1. Biu din cy nh phn bng danh sch tuyn tnh
Trong trng hp cy nh phn y , ta c th d dng biu din cy nh phn bng
mt mng lu tr k tip. Trong node gc l phn t u tin ca mng (phn t th 1),
node con th i>=1 ca cy nh phn l phn t th 2i, 2i + 1 hay cha ca node th j l [j/2].
Vi qui tc , cy nh phn c th biu din bng mt vector V sao cho ni dung ca node
th i c lu tr trong thnh phn V[i] ca vector V. Ngc li, nu bit a ch ca phn
t th i trong vector V chng ta cng hon ton xc nh c ngc li a ch ca node
cha, a ch node gc trong cy nh phn.
V d: cy nh phn trong hnh 4.7 s c lu tr k tip nh sau:

30
25

22

V[0]

V[1] V[2]

30

25

37

V[3]
22

V[4]

V[5] V[6]

28

35

40

37

28

35

40

Hnh 4.7. Lu tr k tip ca cy nh phn


i vi cy nh phn khng y , vic lu tr bng mng t ra khng hiu qu v
chng ta phi b trng qu nhiu phn t gy lng ph b nh nh trong v d sau:

81

Chng 4: Cu trc d liu cy (Tree)


30

37

25

22

V[0]

V[1]

V[2]

V[3]

V[4] V[5] V[6]

30

25

37

22

35

35

Hnh 4.8- Lu tr k tip ca cy nh phn khng y


4.3.2. Biu din cy nh phn bng danh sch mc ni
Trong cch lu tr cy nh phn bng danh sch mc ni, mi node c m t bng
ba loi thng tin chnh : left l mt con tr tr ti node bn tri ca cy nh phn; infor : l
thng tin v node, infor c th l mt bin n hoc mt cu trc; right l mt con tr tr ti
node bn phi ca cy nh phn. Trong trng hp node l node l th con tr left v con tr
right c tr ti con tr NULL. i vi node lch tri, con tr right s tr ti con tr
NULL, ngc li i vi node lch phi, con tr left cng s tr ti con tr NULL. Cu trc
ca mt node c m t trong hnh 4.9.
Left

Infor

Right

Hnh 4.9. m t mt node ca cy nh phn.


V d: cy nh phn trong hnh 4.10 s c biu din bng danh sch lin kt nh
sau:
Left

30

right

30
25
22

37

35

Left

25

NULL

22

right

NULL

Left

NULL

Hnh 4.10. Biu din cy nh phn bng danh sch mc ni .

82

37

35

NULL

NULL

Chng 4: Cu trc d liu cy (Tree)

4.4. CC THAO TC TRN CY NH PHN


4.4.1. nh ngha cy nh phn bng danh sch tuyn tnh
Mi node trong cy c khai bo nh mt cu trc gm 3 trng: infor, left, right.
Ton b cy c th coi nh mt mng m mi phn t ca n l mt node. Trng infor
tng qut c th l mt i tng d liu kiu c bn hoc mt cu trc. V d: nh ngha
mt cy nh phn lu tr danh sch cc s nguyn:
#define

MAX

100

#define

TRUE 1

#define

FALSE 0

struct

node {
int

infor;

int

left;

int

right;

typedef struct

node

};
node[MAX];

4.4.2. nh ngha cy nh phn theo danh sch lin kt:


struct

node {
int

infor;

struct

node

*left;

struct

node

*right;

struct

node *NODEPTR

}
typedef

4.4.3. Cc thao tc trn cy nh phn


Cp pht b nh cho mt node mi ca cy nh phn:
NODEPTR

Getnode(void) {

NODEPTR

p;

p= (NODEPTR) malloc(sizeof(struct node));


return(p);
}

Gii phng node c cp pht


void

Freenode( NODEPTR p){


free(p);

Khi ng cy nh phn
void Initialize(NODEPTR *ptree){
*ptree=NULL;
}

83

Chng 4: Cu trc d liu cy (Tree)


Kim tra tnh rng ca cy nh phn:
int

Empty(NODEPTR

*ptree){

if (*ptree==NULL)
return(TRUE);
return(FALSE);
}

To mt node l cho cy nh phn:

Cp pht b nh cho node;

Gn gi tr thng tin thch hp cho node;

To lin kt cho node l;

NODEPTR

Makenode(int

NODEPTR

x){

p;

p= Getnode();// cp pht b nh cho node


p ->infor = x; // gn gi tr thng tin thch hp
p ->left = NULL; // to lin kt tri ca node l
p ->right = NULL;// to lin kt phi ca node l
return(p);
}

To node con bn tri ca cy nh phn:


to c node con bn tri l node l ca node p, chng ta thc hin nh sau:

Nu node p khng c thc (p==NULL), ta khng th to c node con bn


tri ca node p;

Nu node p c node con bn tri (p->left!=NULL), th chng ta cng


khng th to c node con bn tri node p;

Nu node p cha c node con bn tri, th vic to node con bn tri chnh l
thao tc make node c xy dng nh trn;

void Setleft(NODEPTR

p, int x ){

if (p==NULL){
// nu node p khng c thc th khng th thc hin c
printf(\n Node p khng c thc);
delay(2000); return;
}
// nu node p c thc v tn ti l con bn tri th cng khng thc hin c
else if ( p ->left !=NULL){
printf(\n Node p c node con bn tri);
delay(2000); return;
}
// nu node c thc v cha c node tri

84

Chng 4: Cu trc d liu cy (Tree)


else
p ->left = Makenode(x);
}

To node con bn phi ca cy nh phn:


to c node con bn phi l node l ca node p, chng ta lm nh sau:

Nu node p khng c thc (p==NULL), th ta khng th thc hin c thao


tc thm node l vo node phi node p;

Nu node p c thc (p!=NULL) v c node con bn phi th thao tc cng


khng th thc hin c;

Nu node p c thc v cha c node con bn phi th vic to node con bn


phi node p c thc hin thng qua thao tc Makenode();

void Setright(NODEPTR

p, int x ){

if (p==NULL){ // Nu node p khng c thc


printf(\n Node p khng c thc);
delay(2000); return;
}
// Nu node p c thc & c node con bn phi
else if ( p ->right !=NULL){
printf(\n Node p c node con bn phi);
delay(2000); return;
}
// Nu node p c thc & cha c node con bn phi
else
p ->right = Makenode(x);
}

Thao tc xo node con bn tri cy nh phn


Thao tc loi b node con bn tri node p c thc hin nh sau:

Nu node p khng c thc th thao tc khng th thc hin;

Nu node p c thc (p==NULL) th kim tra xem p c node l bn tri hay


khng;
9 Nu node p c thc v p khng c node l bn tri th thao tc cng khng
th thc hin c;
9 Nu node p c thc (p!=NULL) v c node con bn tri l q th:
- Nu node q khng phi l node l th thao tc cng khng th thc hin
c (q->left!=NULL || q->right!=NULL);
- Nu node q l node l (q->left==NULL && q->right==NULL) th:
o Gii phng node q;
85

Chng 4: Cu trc d liu cy (Tree)


o Thit lp lin kt mi cho node p;
Thut ton c th hin bng thao tc Delleft() nh di y:
int

Delleft(NODEPTR p) {

NODEPTR q; int x;
if ( p==NULL)
printf(\n Node p khng c thc);delay(2000);
exit(0);
}
q = p ->left; // q l node cn xo;
x = q->infor; //x l ni dung cn xo
if (q ==NULL){ // kim tra p c l bn tri hay khng
printf(\n Node p khng c l bn tri);
delay(2000); exit(0);
}
if (q->left!=NULL || q->right!=NULL) {
// kim tra q c phi l node l hay khng
printf(\n q khng l node l);
delay(2000); exit(0);
}
p ->left =NULL; // to lin kt mi cho p
Freenode(q); // gii phng q
return(x);
}

Thao tc xo node con bn phi cy nh phn:


Thao tc loi b node con bn phi node p c thc hin nh sau:

Nu node p khng c thc th thao tc khng th thc hin;

Nu node p c thc (p==NULL) th kim tra xem p c node l bn phi hay


khng;
9 Nu node p c thc v p khng c node l bn phi th thao tc cng
khng th thc hin c;
9 Nu node p c thc (p!=NULL) v c node con bn phi l q th:
- Nu node q khng phi l node l th thao tc cng khng th thc hin
c (q->left!=NULL || q->right!=NULL);
- Nu node q l node l (q->left==NULL && q->right==NULL) th:
o Gii phng node q;
o Thit lp lin kt mi cho node p;

Thut ton c th hin bng thao tc Delright() nh di y:

86

Chng 4: Cu trc d liu cy (Tree)


int

Delright(NODEPTR p) {
NODEPTR q; int x;
if ( p==NULL)
printf(\n Node p khng c thc);delay(2000);
exit(0);
}
q = p ->right; // q l node cn xo;
x = q->infor; //x l ni dung cn xo
if (q ==NULL){ // kim tra p c l bn phi hay khng
printf(\n Node p khng c l bn phi);
delay(2000); exit(0);
}
if (q->left!=NULL || q->right!=NULL) {
// kim tra q c phi l node l hay khng
printf(\n q khng l node l);
delay(2000); exit(0);
}
p ->right =NULL; // to lin kt cho p
Freenode(q); // gii phng q
return(x);

Thao tc tm node c ni dung l x trn cy nh phn:


tm node c ni dung l x trn cy nh phn, chng ta c th xy dng bng th
tc qui nh sau:

Nu node gc (proot) c ni dung l x th proot chnh l node cn tm;

Nu proot =NULL th khng c node no trong cy c ni dung l x;

Nu ni dung node gc khc x (proot->infor!=x) v proot!=NULL th:


9 Tm node theo nhnh cy con bn tri (proot = proot->left);
9 Tm theo nhnh cy con bn phi;

Thut ton tm mt node c ni dung l x trong cy nh phn c th hin nh sau:


NODEPTR Search( NODEPTR proot, int x) {
NODEPTR

p;

if ( proot ->infor ==x) // iu kin dng


return(proot);
if (proot ==NULL)
return(NULL);
p = Search(proot->left, x); // tm trong nhnh con bn tri
if (p ==NULL) // Tm trong nhnh con bn phi
Search(proot->right, x);

87

Chng 4: Cu trc d liu cy (Tree)


return(p);
}

4.5. CC PHP DUYT CY NH PHN (TRAVERSING BINARY TREE)


Php duyt cy l phng php ving thm (visit) cc node mt cch c h thng sao
cho mi node ch c thm ng mt ln. C ba phng php duyt cy nh phn l:

Duyt theo th t trc (Preorder Travesal);

Duyt theo th t gia (Inorder Travesal);

Duyt theo th t sau (Postorder Travesal).

A
B
D

C
E

Hnh 4.11. m t phng php duyt cy nh phn


4.5.1. Duyt theo th t trc (Preorder Travesal)

Nu cy rng th khng lm g;

Nu cy khng rng th :
9 Thm node gc ca cy;
9 Duyt cy con bn tri theo th t trc;
9 Duyt cy con bn phi theo th t trc;

V d: vi cy trong hnh 4.11 th php duyt Preorder cho ta kt qu duyt theo th


t cc node l :A -> B -> D -> E -> C -> F -> G.
Vi phng php duyt theo th t trc, chng ta c th ci t cho cy c nh
ngha trong mc 4.4 bng mt th tc qui nh sau:
void

Pretravese ( NODEPTR proot ) {


if ( proot !=NULL) { // nu cy khng rng
printf(%d, proot->infor); // duyt node gc
Pretravese(proot ->left); // duyt nhnh cy con bn tri
Pretravese(proot ->right); // Duyt nhnh con bn phi
}

88

Chng 4: Cu trc d liu cy (Tree)


4.5.2. Duyt theo th t gia (Inorder Travesal)

Nu cy rng th khng lm g;

Nu cy khng rng th :
9 Duyt cy con bn tri theo th t gia;
9 Thm node gc ca cy;
9 Duyt cy con bn phi theo th t gia;

V d : cy trong hnh 4.11 th php duyt Inorder cho ta kt qu duyt theo th t


cc node l :D -> B -> E -> A -> F -> C -> G.
Vi cch duyt theo th t gia, chng ta c th ci t cho cy c nh ngha
trong mc 4.4 bng mt th tc qui nh sau:
void

Intravese ( NODEPTR proot ) {


if ( proot !=NULL) { // nu cy khng rng
Intravese(proot ->left); // duyt nhnh cy con bn tri
printf(%d, proot->infor); // duyt node gc
Intravese(proot ->right); // Duyt nhnh con bn phi
}

4.5.3. Duyt theo th t sau (Postorder Travesal)

Nu cy rng th khng lm g;

Nu cy khng rng th :
9 Duyt cy con bn tri theo th t sau;
9 Duyt cy con bn phi theo th t sau;
9 Thm node gc ca cy;
V d: cy trong hnh 4.11 th php duyt Postorder cho ta kt qu duyt theo th t
cc node l :D -> E -> B -> F -> G-> C -> A .
Vi cch duyt theo th t gia, chng ta c th ci t cho cy c nh ngha
trong mc 4.4 bng mt th tc qui nh sau:
void

Posttravese ( NODEPTR proot ) {


if ( proot !=NULL) { // nu cy khng rng
Posttravese(proot ->left); // duyt nhnh cy con bn tri
Posttravese(proot ->right); // duyt nhnh con bn phi
printf(%d, proot->infor); // duyt node gc
}

89

Chng 4: Cu trc d liu cy (Tree)

4.6. CI T CY NH PHN TM KIM


Nhng ci t c th cho cy nh phn v cy nh phn y c trnh by
trong [1]. Di y l mt ci t c th cho cy nh phn tm kim bng danh sch mc
ni.
V cy nh phn tm kim l mt dng c bit ca cy nn cc thao tc nh thit lp
cy, duyt cy vn nh cy nh phn thng thng ring, cc thao tc tm kim , thm node
v loi b node c th c thc hin nh sau:
Thao tc tm kim node (Search): Gi s ta cn tm kim node c gi tr x trn cy
nh phn tm kim, trc ht ta bt u t gc:

Nu cy rng: php tm kim khng tho mn;

Nu x trng vi kho gc: php tm kim tho mn;

Nu x nh hn kho gc th tm sang cy bn tri;

Nu x ln hn kho gc th tm sang cy bn phi;

NODEPTR Search( NODEPTR proot, int x){


NODEPTR p; p=proot;
if ( p!=NULL){
if (x <p->infor)
Search(proot->left, x);
if (x >p->infor)
Search(proot->right, x);
}
return(p);
}

Thao tc chn thm node (Insert): thm node x vo cy nh phn tm kim, ta


thc hin nh sau:

Nu x trng vi gc th khng th thm node

Nu x < gc v cha c l con bn tri th thc hin thm node vo nhnh bn


tri.

Nu x > gc v cha c l con bn phi th thc hin thm node vo nhnh


bn phi.

void Insert(NODEPTR proot, int x){


if (x==proot->infor){
printf("\n Noi dung bi trung");
delay(2000);return;
}
else if(x<proot->infor && proot->left==NULL){
Setleft(proot,x);return;

90

Chng 4: Cu trc d liu cy (Tree)


}
else if (x>proot->infor && proot->right==NULL){
Setright(proot,x);return;
}
else if(x<proot->infor)
Insert(proot->left,x);
else Insert(proot->right,x);
}

Thao tc loi b node (Remove): Vic xo node trn cy nh phn tm kim kh


phc tp. V sau khi xo node, chng ta phi iu chnh li cy n vn l cy nh phn
tm kim. Khi xo node trn cy nh phn tm kim th node cn xo b c th mt trong 3
trng hp sau:
Trng hp 1: nu node p cn xo l node l hoc node gc th vic loi b c
thc hin ngay.
Trng hp 2: nu node p cn xo c mt cy con th ta phi ly node con ca node
p thay th cho p.
Trng hp 3: node p cn xo c hai cy con. Nu node cn xo pha cy con bn
tri th node bn tri nht s c chn lm node th mng, nu node cn xo pha cy
con bn phi th node bn phi nht s c chn lm node th mng. Thut ton loi b
node trn cy nh phn tm kim c th hin nh sau:
NODEPTR Remove(NODEPTR p){
NODEPTR rp,f;
if(p==NULL){
printf("\n Nut p khong co thuc");
delay(2000);return(p);
}
if(p->right==NULL)
rp=p->left;
else {
if (p->left==NULL)
rp = p->right;
else {
f=p;
rp=p->right;
while(rp->left!=NULL){
f=rp;
rp=rp->left;
}
if(f!=p){
f->left =rp->right;

91

Chng 4: Cu trc d liu cy (Tree)


rp->right = p->right;
rp->left=p->left;
}
else
rp->left = p->left;
}
}
Freenode(p);
return(rp);
}

Ci t c th cc thao tc trn cy nh phn tm kim c th hin nh di y.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <dos.h>
#define

TRUE 1

#define

FALSE 0

#define

MAX

struct node

100
{

int infor;
struct node *left;
struct node *right;
};
typedef struct node *NODEPTR;
NODEPTR Getnode(void){
NODEPTR p;
p=(NODEPTR)malloc(sizeof(struct node));
return(p);
}
void Freenode(NODEPTR p){
free(p);
}
void Initialize(NODEPTR *ptree){
*ptree=NULL;
}
NODEPTR Makenode(int x){
NODEPTR p;
p=Getnode();
p->infor=x;

92

Chng 4: Cu trc d liu cy (Tree)


p->left=NULL;
p->right=NULL;
return(p);
}
void Setleft(NODEPTR p, int x){
if (p==NULL)
printf("\n Node p khong co thuc");
else {
if (p->left!=NULL)
printf("\n Node con ben trai da ton tai");
else
p->left=Makenode(x);
}
}
void Setright(NODEPTR p, int x){
if (p==NULL)
printf("\n Node p khong co thuc");
else {
if (p->right!=NULL)
printf("\n Node con ben phai da ton tai");
else
p->right=Makenode(x);
}
}
void Pretrav(NODEPTR proot){
if (proot!=NULL){
printf("%5d", proot->infor);
Pretrav(proot->left);
Pretrav(proot->right);
}
}
void Intrav(NODEPTR proot){
if (proot!=NULL){
Intrav(proot->left);
printf("%5d", proot->infor);
Intrav(proot->right);
}
}
void Postrav(NODEPTR proot){
if (proot!=NULL){
Postrav(proot->left);

93

Chng 4: Cu trc d liu cy (Tree)


Postrav(proot->right);
printf("%5d", proot->infor);
}
}
void Insert(NODEPTR proot, int x){
if (x==proot->infor){
printf("\n Noi dung bi trung");
delay(2000);return;
}
else if(x<proot->infor && proot->left==NULL){
Setleft(proot,x);return;
}
else if (x>proot->infor && proot->right==NULL){
Setright(proot,x);return;
}
else if(x<proot->infor)
Insert(proot->left,x);
else Insert(proot->right,x);
}
NODEPTR Search(NODEPTR proot, int x){
NODEPTR p;p=proot;
if (p!=NULL) {
if (x <proot->infor)
p=Search(proot->left,x);
else if(x>proot->infor)
p=Search(proot->right,x);
}
return(p);
}
NODEPTR Remove(NODEPTR p){
NODEPTR rp,f;
if(p==NULL){
printf("\n Nut p khong co thuc");
delay(2000);return(p);
}
if(p->right==NULL)
rp=p->left;
else {
if (p->left==NULL)
rp = p->right;
else {

94

Chng 4: Cu trc d liu cy (Tree)


f=p;
rp=p->right;
while(rp->left!=NULL){
f=rp;
rp=rp->left;
}
if(f!=p){
f->left =rp->right;
rp->right = p->right;
rp->left=p->left;
}
else
rp->left = p->left;
}
}
Freenode(p);
return(rp);
}
void Cleartree(NODEPTR proot){
if(proot!=NULL){
Cleartree(proot->left);
Cleartree(proot->right);
Freenode(proot);
}
}
void main(void){
NODEPTR ptree, p;
int noidung, chucnang;
Initialize(&ptree);
do {
clrscr();
printf("\n CAY NHI PHAN TIM KIEM");
printf("\n 1-Them nut tren cay");
printf("\n 2-Xoa node goc");
printf("\n 3-Xoa node con ben trai");
printf("\n 4-Xoa node con ben phai");
printf("\n 5-Xoa toan bo cay");
printf("\n 6-Duyet cay theo NLR");
printf("\n 7-Duyet cay theo LNR");
printf("\n 8-Duyet cay theo LRN");
printf("\n 9-Tim kiem tren cay");

95

Chng 4: Cu trc d liu cy (Tree)


printf("\n 0-Thoat khoi chuong trinh");
printf("\n Lua chon chuc nang:");
scanf("%d", &chucnang);
switch(chucnang){
case 1:
printf("\n Noi dung nut moi:");
scanf("%d",&noidung);
if(ptree==NULL)
ptree=Makenode(noidung);
else
Insert(ptree,noidung);
break;
case 2:
if (ptree==NULL)
printf("\n Cay bi rong");
else
ptree=Remove(ptree);
break;
case 3:
printf("\n Noi dung node cha:");
scanf("%d", &noidung);
p=Search(ptree,noidung);
if (p!=NULL)
p->left = Remove(p->left);
else
printf("\n Khong co node cha");
break;
case 4:
printf("\n Noi dung node cha:");
scanf("%d", &noidung);
p=Search(ptree,noidung);
if (p!=NULL)
p->right = Remove(p->right);
else
printf("\n Khong co node cha");
break;
case 5:
Cleartree(ptree);
break;
case 6:
printf("\n Duyet cay theo NLR");

96

Chng 4: Cu trc d liu cy (Tree)


if(ptree==NULL)
printf("\n Cay rong");
else
Pretrav(ptree);
break;
case 7:
printf("\n Duyet cay theo LNR");
if(ptree==NULL)
printf("\n Cay rong");
else
Intrav(ptree);
break;
case 8:
printf("\n Duyet cay theo NRN");
if(ptree==NULL)
printf("\n Cay rong");
else
Postrav(ptree);
break;
case 9:
printf("\n Noi dung can tim:");
scanf("%d",&noidung);
if(Search(ptree,noidung))
printf("\n Tim thay");
else
printf("\n Khong tim thay");
break;
}
delay(1000);
} while(chucnang!=0);
Cleartree(ptree); ptree=NULL;
}

97

Chng 4: Cu trc d liu cy (Tree)

NHNG NI DUNG CN GHI NH

nh ngha cy, cy nh phn, cy cn bng v cy hon ton cn bng. Cc khi


nim mc, su ca cy.

Cc phng php duyt cy: duyt theo th t trc, duyt theo th t gia v
duyt theo th t sau.

Phn bit c nhng thao tc ging nhau v khc nhau cy nh phn tm kim
v cy nh phn thng thng.

Tm hiu thm v cy nhiu nhnh trong cc ti liu [1], [2].

Tm hiu thm v cy quyt nh v ng dng ca n trong biu din tri thc.

98

Chng 4: Cu trc d liu cy (Tree)

BI TP CHNG 4

Bi 1. Mt cy nh phn c gi l cy nh phn ng nu node gc ca cy v cc node


trung gian u c hai node con (ngoi tr node l). Chng minh rng, nu cy nh
phn ng c n node l th cy ny c tt c 2n-1 node. Hy to lp mt cy nh phn
bt k, sau kim tra xem nu cy khng phi l cy nh phn ng hy tm cch b
sung vo mt s node cy tr thnh cy hon ton ng. Lm tng t nh trn vi
thao tc loi b node.
Bi 2. Mt cy nh phn c gi l cy nh phn y vi chiu su d (d nguyn dng)
khi v ch khi mc i (0id) cy c ng 2i node. Hy vit chng trnh kim tra
xem mt cy nh phn c phi l mt cy y hay khng? Nu cy cha phi l cy
nh phn y, hy tm cch b xung mt s node vo cy nh phn n tr thnh cy
nh phn y.
Bi 3. Mt cy nh phn c gi l cy nh phn gn y vi su d nu vi mi mc i
(0id-1) n c ng 2i node. Cho cy nh phn bt k, hy kim tra xem n c phi
l cy nh phn gn y hay khng ?
Bi 4. Hy xy dng cc thao tc sau trn cy nh phn:
-

To lp cy nh phn;

m s node ca cy nh phn;

Xc nh chiu su ca cy nh phn;

Xc nh s node l ca cy nh phn;

Xc nh s node trung gian ca cy nh phn;

Xc nh s node trong tng mc ca cy nh phn;

Xy dng tp thao tc tng t nh trn i vi cc nhnh cy con;

Thm mt node vo node phi ca mt node;

Thm node vo node tri ca mt node;

Loi b node phi ca mt node;

Loi b node tri ca mt node;

Loi b c cy;

Duyt cy theo th t trc;

Duyt cy theo th gia;

Duyt cy theo th t sau;

99

Chng 4: Cu trc d liu cy (Tree)


Bi 5. Cho file d liu cay.in c t chc thnh tng dng, trn mi dng ghi li mt t
l ni dung node ca mt cy nh phn tm kim. Hy xy dng cc thao tc sau cho
cy nh phn tm kim:
-

To lp cy nh phn tm kim vi node gc l t u tin trong file d liu


cay.in.

Xc nh s node trn cy nh phn tm kim;

Xc nh chiu su ca cy nh phn tm kim;

Xc nh s node nhnh cy bn tri;

Xc nh s node nhnh cy con bn phi;

Xc nh s node trung gian;

Xc nh s node l;

Tm node c di ln nht;

Thm node;

Loi b node;

Loi b c cy;

Duyt cy theo th t trc;

Duyt cy theo th t gia;

Duyt cy theo th t sau;

Cho cy nh phn bt k hy xy dng chng trnh xc nh xem:

Cy c phi l cy nh phn ng hay khng?

Cy c phi l cy nh phn y hay khng ?

Cy c phi l cy nh phn gn y hay khng?

Cy c phi l cy nh phn hon ton cn bng hay khng?

Cy c phi l cy nh phn tm kim hay khng ?

Bi 6. Cho tam gic s c biu din nh hnh di y. Hy vit chng trnh tm dy


cc s c tng ln nht trn con ng t nh v kt thc ti u y. Bit rng,
mi bc i c th i cho xung pha tri hoc cho xung pha phi. S lng hng
trong tam gic l ln hn 1 nhng nh hn 100; cc s trong tam gic u l cc s t
0 . .99.

100

Chng 4: Cu trc d liu cy (Tree)

7
3

2
4

D liu vo cho bi file cay.in, dng u tin ghi li s t nhin n l s lng hng
trong tam gic, n hng tip theo ghi li tng hng mi phn t c phn bit vi nhau bi
mt hoc vi du trng. Kt qu ghi li trong file cay.out dng u tin ghi li tng s ln
nht tm c, dng k tip ghi li dy cc s c tng ln nht. V d vi hnh trn file
input & output nh sau:
cay.in
5
7
2

cay.out
30
7

Bi 7. Cho cy nh phn s hon ton cn bng:(s node bn nhnh cy con bn tri ng


bng s node nhnh cy con bn phi, mc th i c ng 2i node) nh hnh sau:
7
9
0

2
6

Bi 8. Hy tm dy cc node xut pht t gc ti mt node l no sao cho tng gi tr


ca cc node l ln nht, bit rng mi bc i ch c php i cho sang node tri
hoc cho theo node phi. D liu vo cho bi file cay.in, dng u tin ghi li s t
nhin n 50 l s cc mc ca cy, n dng k tip mi dng ghi li dy cc s l cc
101

Chng 4: Cu trc d liu cy (Tree)


node trn mi mc. Kt qu ghi li trong file cay.out theo th t, dng u l tng ln
nht ca hnh trnh, dng k tip l dy cc node trong hnh trnh. V d: vi hnh trn
file input & output c t chc nh sau:
cay.in
3
7
9

cay.out
22
7

102

Chng 5: th (Graph)

CHNG 5: TH (GRAPH)

th l mt cu trc d liu ri rc nhng li c ng dng hin i. th c th


dng biu din cc s ca mt mch in, biu din ng i ca h thng giao thng
hay cc loi mng my tnh. Nm bt c nhng thut ton trn th gip chng ta gii
quyt c nhiu bi ton ti u quan trng nh bi ton qui hoch mng, bi ton phn
lung trn mng hay phn lung giao thng, bi ton tm ng i ngn nht hoc cc tiu
ho chi ph cho cc hot ng sn xut kinh doanh. Nhng ni dung c trnh by bao
gm:
9 nh ngha th, phn loi d th v nhng khi nim c bn lin quan.
9 Cc phng php biu din th trn my tnh.
9 Cc thut ton tm kim trn th.
9 th Euler & th hamilton.
9 Bi ton tm cy bao trm nh nht.
9 Bi ton tm ng i ngn nht
Bn c c th tm thy nhng ci t c th v nhng kin thc su hn v L thuyt
th trong ti liu [1] & [3].

5.1. NHNG KHI NIM C BN CA TH


5.1.1. Cc loi th
L thuyt th l lnh vc nghin cu tn ti t nhng nm u ca th k 18
nhng li c nhng ng dng hin i. Nhng t tng c bn ca l thuyt th c
nh ton hc ngi Thu S Leonhard Euler xut v chnh ng l ngi dng l thuyt
th gii quyt bi ton ni ting Cu Konigsberg.
th c s dng gii quyt nhiu bi ton thuc cc lnh vc khc nhau.
Chng hn, ta c th dng th biu din nhng mch vng ca mt mch in, dng
th biu din qu trnh tng tc gia cc loi trong th gii ng thc vt, dng th
biu din nhng ng phn ca cc hp cht polyme hoc biu din mi lin h gia cc
loi thng tin khc nhau. C th ni, l thuyt th c ng dng rng ri trong tt c cc
lnh vc khc nhau ca thc t cng nh nhng lnh vc tru tng ca l thuyt tnh ton.
th (Graph) l mt cu trc d liu ri rc bao gm cc nh v cc cnh ni cc
cp nh ny. Chng ta phn bit th thng qua kiu v s lng cnh ni gia cc cp
nh ca th. minh chng cho cc loi th, chng ta xem xt mt s v d v cc

103

Chng 5: th (Graph)
loi mng my tnh bao gm: mi my tnh l mt nh, mi cnh l nhng knh in thoi
c ni gia hai my tnh vi nhau. Hnh 5.1 l s ca mng my tnh loi 1.

San Francisco

Detroit

Chicago

New York

Denver
Los Angeles

Washington
Hnh 5.1. Mng my tnh n knh thoi.

Trong mng my tnh ny, mi my tnh l mt nh ca th, mi cnh v hng


biu din cc nh ni hai nh phn bit, khng c hai cp nh no ni cng mt cp nh.
Mng loi ny c th biu din bng mt n th v hng.
nh ngha 1. n th v hng G = <V, E> bao gm V l tp cc nh, E l tp
cc cp c th t gm hai phn t khc nhau ca V gi l cc cnh.
Trong trng hp gia hai my tnh no thng xuyn truyn ti nhiu thng tin,
ngi ta ni hai my tnh bi nhiu knh thoi khc nhau. Mng my tnh a knh thoi c
th c biu din nh hnh 5.2.
San Francisco

Detroit

Chicago

New York

Denver
Los Angeles

Washington
Hnh 5.2. Mng my tnh a knh thoi.

Trn hnh 5.2, gia hai my tnh c th c ni vi nhau bi nhiu hn mt knh


thoi. Vi mng loi ny, chng ta khng th dng n th v hng biu din. th
loi ny l a th v hng.
nh ngha 2. a th v hng G = <V, E> bao gm V l tp cc nh, E l h
cc cp khng c th t gm hai phn t khc nhau ca V gi l tp cc cnh. e1, e2 c
gi l cnh lp nu chng cng tng ng vi mt cp nh.

104

Chng 5: th (Graph)
R rng, mi n th u l a th, nhng khng phi a th no cng l n
th v gia hai nh c th c nhiu hn mt cnh ni gia chng vi nhau. Trong nhiu
trng hp, c my tnh c th ni nhiu knh thoi vi chnh n. Vi loi mng ny, ta
khng th dng a th biu din m phi dng gi th v hng. Gi th v
hng c m t nh trong hnh 5.3.
nh ngha 3. Gi th v hng G = <V, E> bao gm V l tp nh, E l h cc
cp khng c th t gm hai phn t (hai phn t khng nht thit phi khc nhau) trong V
c gi l cc cnh. Cnh e c gi l khuyn nu c dng e =(u, u), trong u l nh
no thuc V.
San Francisco

Detroit

Chicago

New York

Denver
Los Angeles

Washington

Hnh 5.3. Mng my tnh a knh thoi c khuyn.


Trong nhiu mng, cc knh thoi ni gia hai my tnh c th ch c php truyn
tin theo mt chiu. Chng hn my tnh t ti San Francisco c php truy nhp ti my
tnh t ti Los Angeles, nhng my tnh t ti Los Angeles khng c php truy nhp
ngc li San Francisco. Hoc my tnh t ti Denver c th truy nhp c ti my tnh
t ti Chicago v ngc li my tnh t ti Chicago cng c th truy nhp ngc li my
tnh ti Denver. m t mng loi ny, chng ta dng khi nim n th c hng.
n th c hng c m t nh trong hnh 5.4.
San Francisco

Detroit

Chicago

New York

Denver
Los Angeles

Washington
Hnh 5.4. Mng my tnh c hng.

nh ngha 4. n th c hng G = <V, E> bao gm V l tp cc nh, E l tp


cc cp c th t gm hai phn t ca V gi l cc cung.

105

Chng 5: th (Graph)
th c hng trong hnh 5.4 khng cha cc cnh bi. Nn i vi cc mng a
knh thoi mt chiu, th c hng khng th m t c m ta dng khi nim a th
c hng. Mng c dng a th c hng c m t nh trong hnh 5.5.
San Francisco

Detroit

Chicago

New York

Denver
Los Angeles

Washington
Hnh 5.5. Mng my tnh a knh thoi mt chiu.

nh ngha 5. a th c hng G = <V, E> bao gm V l tp nh, E l cp c


th t gm hai phn t ca V c gi l cc cung. Hai cung e1, e2 tng ng vi cng mt
cp nh c gi l cung lp.
T nhng dng khc nhau ca th k trn, chng ta thy s khc nhau gia cc loi
th c phn bit thng qua cc cnh ca th c th t hay khng c th t, cc cnh
bi, khuyn c c dng hay khng.
5.1.2. Mt s thut ng c bn ca th
nh ngha 1. Hai nh u v v ca th v hng G =<V, E> c gi l k nhau
nu (u,v) l cnh thuc th G. Nu e =(u, v) l cnh ca th G th ta ni cnh ny lin
thuc vi hai nh u v v, hoc ta ni cnh e ni nh u vi nh v, ng thi cc nh u v
v s c gi l nh u ca cnh (u,v).
nh ngha 2. Ta gi bc ca nh v trong th v hng l s cnh lin thuc vi
n v k hiu l deg(v).

Hnh 5.6 th v hng G.


V d 1. Xt th trong hnh 5.6, ta c
deg(a) = 2, deg(b) =deg(c) = deg(f) = 4, deg(e) = 3, deg(d) = 1, deg(g)=0.

106

Chng 5: th (Graph)
nh bc 0 c gi l nh c lp. nh bc 1 c gi l nh treo. Trong v d
trn, nh g l nh c lp, nh d l nh treo.
nh ngha 3. Nu e=(u,v) l cung ca th c hng G th ta ni hai nh u v v l
k nhau, v ni cung (u, v) ni nh u vi nh v hoc cng ni cung ny i ra khi nh u
v i vo nh v. nh u (v) s c gi l nh u (cui) ca cung (u,v).
5.1.3. ng i, chu trnh, th lin thng
nh ngha 1. ng i di n t nh u n nh v trn th v hng
G=<V,E> l dy x0, x1, . . ., xn-1, xn trong n l s nguyn dng, x0=u, xn =v, (xi, xi+1)E,
i =0, 1, 2,. . ., n-1.
ng i nh trn cn c th biu din thnh dy cc cnh
(x0, x1), (x1,x2) , . . ., (xn-1, xn).
Ta gi nh u l nh u, nh v l nh cui ca ng i. ng i c nh u
trng vi nh cui (u=v) c gi l chu trnh. ng i hay chu trnh c gi l n nu
nh khng c cnh no lp li.
V d 3. Tm cc ng i, chu trnh trong th v hng nh trong hnh 5.7.
D dng nhn thy (a, d, c, f, e) l ng i n di 4, (d, e, c, a) khng l ng
i v (e,c) khng phi l cnh ca th. Dy (b, c, f, e, b) l chu trnh di 4. ng i
(a, b, e, d, a, b) c di 5 khng phi l ng i n v cnh (a,b) c mt hai ln.
a

Hnh 5.7. ng i trn th.


Khi nim ng i v chu trnh trn th c hng c nh ngha hon ton
tng t, ch c iu khc bit duy nht l ta phi ch ti cc cung ca th.
nh ngha 3. th v hng (c hng) c gi l lin thng nu lun tm c
ng i gia hai nh bt k ca n.

5.2. BIU DIN TH TRN MY TNH


5.2.1. Ma trn k, ma trn trng s
lu tr th v thc hin cc thut ton khc nhau, ta cn phi biu din th trn
my tnh, ng thi s dng nhng cu trc d liu thch hp m t th. Vic chn cu
trc d liu no biu din th c tc ng rt ln n hiu qu thut ton. V vy, la chn
cu trc d liu thch hp biu din th s ph thuc vo tng bi ton c th.
107

Chng 5: th (Graph)
Xt n th v hng G =<V, E>, vi tp nh V = {1, 2, . . ., n}, tp cnh E =
{e1, e2, . . ., em}. Ta gi ma trn k ca th G l ma trn c cc phn t hoc bng 0 hoc
bng 1 theo qui nh nh sau:
A = { aij: aij = 1 nu (i, j) E, aij = 0 nu (i,j) E; i, j =1, 2, . . ., n}.
V d 1. Biu din th trong hnh 5.8 di y bng ma trn k.
2

Hnh 5.8. th v hng G

1
0

2
1

3
1

4
0

5
0

6
0

Ma trn k c nhng tnh cht sau:


a. Ma trn k ca th v hng l ma trn i xng A[i,j] = A[j, i]; i, j = 1, 2, . . . n.
Ngc li, mi (0, 1) ma trn cp n ng cu vi mt n th v hng n nh;
b. Tng cc phn t theo dng i ( ct j) ca ma trn k chnh bng bc nh i (nh j);
c. Nu k hiu

aijp , i, j = 1,2,..., n l cc phn t ca ma trn


Ap = A.A. . . A (p ln) khi aijp , i, j = 1,2,..., n ,
cho ta s ng i khc nhau t nh i n nh j qua p-1 nh trung gian.
Ma trn k ca th c hng cng c nh ngha hon ton tng t, chng ta
ch cn lu ti hng ca cnh. Ma trn k ca th c hng l khng i xng.
V d 2. Tm ma trn k ca th c hng trong hnh 5.9.

3
4
Hnh 5.9. th c hng G

1
2

0
0

1
0

1
0

0
1

0
1

5 4

108

Chng 5: th (Graph)
Trong rt nhiu ng dng khc nhau ca l thuyt th, mi cnh e =(u,v) ca n
c gn bi mt s c(e) = d(u,v) gi l trng s ca cnh e. th trong trng hp nh
vy gi l th trng s. Trong trng hp , ma trn k ca th c thay bi ma trn
trng s c= { c[i,j], i, j= 1, 2, . . ., n. c[i,j] = d(i,j) nu (i, j) E, c[i,j] = nu (i, j) E.
Trong , nhn cc gi tr: 0, , - tu theo tng tnh hung c th ca thut ton.
V d 3. Ma trn k ca th c trng s trong hnh 5.10.
2

6 2

Hnh 5.10. th trng s G. 5

6
6

4
8

1
7

9
3

u im ca phng php biu din th bng ma trn k (hoc ma trn trng s) l


ta d dng tr li c cu hi: Hai nh u, v c k nhau trn th hay khng v chng ta
ch mt ng mt php so snh. Nhc im ln nht ca n l bt k th c bao nhiu
cnh ta u mt n2 n v b nh lu tr th.
5.2.2. Danh sch cnh (cung )
Trong trng hp th tha ( th c s cnh m 6n), ngi ta thng biu din
th di dng danh sch cnh. Trong php biu din ny, chng ta s lu tr danh sch
tt c cc cnh (cung) ca th v hng (c hng). Mi cnh (cung) e(x, y) c tng
ng vi hai bin dau[e], cuoi[e]. Nh vy, lu tr th, ta cn 2m n v b nh.
Nhc im ln nht ca phng php ny l nhn bit nhng cnh no k vi cnh no
chng ta cn m php so snh trong khi duyt qua tt c m cnh (cung) ca th. Nu l
th c trng s, ta cn thm m n v b nh lu tr trng s ca cc cnh.
V d 4. Danh sch cnh (cung) ca th v hng, th c hng, th trng s:
Dau
1
1
2
2
3
4
4
5

Cuoi
2
3
3
4
5
5
6
6

Danh sch cnh cung hnh

Dau
1
1
2
2
3
5

Cuoi
2
3
4
5
4
1

th c hng
109

Dau
1
1
2
2
3
4
4
5

Cuoi
2
3
3
4
5
5
6
6

Trongso
3
7
6
6
3
8
5
9

Danh sch trng s

Chng 5: th (Graph)
5.2.3. Danh sch k
Trong rt nhiu ng dng, cch biu din th di dng danh sch k thng c
s dng. Trong biu din ny, vi mi nh v ca th chng ta lu tr danh sch cc nh
k vi n m ta k hiu l Ke(v), ngha l
Ke(v) = { u V: (u, v)E},
Vi cch biu din ny, mi nh i ca th, ta lm tng ng vi mt danh sch tt
c cc nh k vi n v c k hiu l List(i). biu din List(i), ta c th dng cc kiu
d liu kiu tp hp, mng hoc danh sch lin kt.
V d 5. Danh sch k ca th v hng trong hnh 5.8, th c hng trong hnh
5.9 c biu din bng danh sch k nh sau:
List(i)
nh

List(i)

nh

5.3. CC THUT TON TM KIM TRN TH


5.3.1 Thut ton tm kim theo chiu su
Rt nhiu thut ton trn th c xy dng da trn vic duyt tt c cc nh ca
th sao cho mi nh c ving thm ng mt ln. Nhng thut ton nh vy c gi l
thut ton tm kim trn th. Chng ta cng s lm quen vi hai thut ton tm kim c bn,
l duyt theo chiu su (Depth First Search) v duyt theo chiu rng (Breath First Search).
T tng c bn ca thut ton tm kim theo chiu su l bt u ti mt nh v0 no
, chn mt nh u bt k k vi v0 v ly n lm nh duyt tip theo. Cch duyt tip
theo c thc hin tng t nh i vi nh v0.
kim tra vic duyt mi nh ng mt ln, chng ta s dng mt mng gm n
phn t (tng ng vi n nh), nu nh th i c duyt, phn t tng ng trong
mng c gi tr FALSE. Ngc li, nu nh cha c duyt, phn t tng ng trong
mng c gi tr TRUE. Thut ton tm kim theo chiu su bt u t nh v no s duyt
tt c cc nh lin thng vi v. Thut ton c th c m t bng th tc qui DFS()
trong : chuaxet - l mng cc gi tr logic c thit lp gi tr TRUE
void DFS(int v){

110

Chng 5: th (Graph)
Thm_nh(v); chuaxet[v] = FALSE;
for u ke(v) {
if (chuaxet[u] )
DFS( v);
}
}

Th tc DFS() s thm tt c cc nh cng thnh phn lin thng vi v mi nh


ng mt ln. m bo duyt tt c cc nh ca th (c th c nhiu thnh phn lin
thng), chng ta ch cn thc hin :
for( i=1; in; i++)
chuaxet[i] = TRUE;
for( i:=1;i n; i++)
if (chuaxet[i] )
DFS( i);

Ch : Thut ton tm kim theo chiu su d dng p dng cho th c hng. i vi


th c hng, chng ta ch cn thay cc cnh v hng bng cc cung ca th c hng.
V d 1. p dng thut ton tm kim theo chiu su vi th trong hnh sau:
2

6
8
7

10

11

12

13
Hnh 5.11. th v hng G

Kt qu duyt:

1, 2, 4 , 3, 6, 7, 8, 10, 5, 9, 13, 11, 12

5.3.2. Thut ton tm kim theo chiu rng (Breadth First Search)
rng, vi thut ton tm kim theo chiu su, nh thm cng mun s tr thnh
nh sm c duyt xong. l kt qu tt yu v cc nh thm c np vo stack trong
th tc qui. Khc vi thut ton tm kim theo chiu su, thut ton tm kim theo chiu
rng thay th vic s dng stack bng hng i queue. Trong th tc ny, nh c np
vo hng i u tin l v, cc nh k vi v l v1, v2, . . ., vk c np vo queue k tip.
Qu trnh c thc tng t vi cc nh trong hng i. Thut ton dng khi ta duyt
ht cc nh k vi nh trong hng i. Chng ta c th m t thut ton bng th tc BFS
nh di y.

111

Chng 5: th (Graph)
chuaxet- mng kim tra cc nh xt hay cha;
queue hng i lu tr cc nh s c duyt ca th;
void BFS(int u){
queue = ;
u <= queue; (*np u vo hng i*)
chuaxet[u] = false;
while (queue ){
queue<=p; (* ly p ra t stack*)
Thm_nh(p);
for v ke(p) {
if (chuaxet[v] ) {
v<= queue; (*np v vo hng i*)
chuaxet[v] = false;
}
}
}

Th tc BFS s thm tt c cc nh dng thnh phn lin thng vi u. thm tt c


cc nh ca th, chng ta ch cn thc hin gi ti th tc BFS().
for( u=1; un; u++)
chuaxet[u] = TRUE;
for(u=1; un; u++)
if (chuaxet[u])
BFS(u);

V d. p dng thut ton tm kim theo chiu rng vi th trong hnh 5.11 ta nhn
c kt qu nh sau:
1, 2, 3, 11, 4, 6, 12, 13, 7, 8, 9, 10, 5;
5.3.3. Kim tra tnh lin thng ca th
Mt th c th lin thng hoc c th khng lin thng. Nu th l lin thng (s
thnh phn lin thng l 1), chng ta ch cn gi ti th tc DFS() hoc BFS() mt ln. Nu
th l khng lin thng, khi s thnh phn lin thng ca th chnh bng s ln gi
ti th tc BFS() hoc DFS(). xc nh s cc thnh phn lin thng ca th, chng ta
s dng mt bin mi solt nghi nhn cc nh cng mt thnh phn lin thng trong
mng chuaxet:
- Nu nh i cha c duyt, chuaxet[i] c gi tr 0;
- Nu nh i c duyt thuc thnh phn lin thng th j=solt, ta ghi nhn
chuaxet[i]=solt;
- Cc nh cng thnh phn lin thng nu chng c cng gi tr trong mng chuaxet.
void BFS(int u){

112

Chng 5: th (Graph)
queue= ;
u <= queue; (*np u vo hng i*)
solt = solt+1; chuaxet[u] = solt;(*solt l bin ton cc thit lp gi tr 0*)
while (queue ) {
queue<=p; (* ly p ra t stack*)
Thm_nh(p);
for v ke(p) {
if (chuaxet[v] ){
v<= queue; (*np v vo hng i*)
chuaxet[v] = solt;
}
}
}
}

5.3.4. Tm ng i gia hai nh bt k ca th


Th tc BFS(s) hoc DFS(s) cho php ta duyt cc nh cng mt thnh phn lin
thng vi nh s. Nh vy, nu trong s cc nh lin thng vi s cha t th chc chn c
ng i t nh s n nh t. Nu trong s cc nh lin thng vi nh s khng cha nh t
th khng tn ti ng i t nh s n nh t. Do vy, chng ta ch cn gi ti th tc
DFS(s) hoc BFS(s) v kim tra xem nh t c thuc thnh phn lin thng vi s hay khng.
Di y l ton vn chng trnh tm ng i gia hai nh ca th.
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <stdlib.h>
#include <dos.h>
#define MAX

100

#define TRUE

#define FALSE

0int n, truoc[MAX], chuaxet[MAX], queue[MAX];

int A[MAX][MAX]; int s, t;


/* Breadth First Search */
void Init(void){
FILE *fp; int i, j;
fp=fopen("lienth.IN", "r");
if(fp==NULL){
printf("\n Khong co file input");
delay(2000);return;
}
fscanf(fp,"%d", &n);
printf("\n So dinh do thi:%d",n);

113

Chng 5: th (Graph)
printf("\n Ma tran ke cua do thi:");
for(i=1; i<=n;i++){
printf("\n");
for(j=1; j<=n;j++){
fscanf(fp,"%d", &A[i][j]);
printf("%3d", A[i][j]);
}
}
for(i=1; i<=n;i++){
chuaxet[i]=TRUE;
truoc[i]=0;
}
}
void Result(void){
printf("\n\n");
if(truoc[t]==0){
printf("\n Khong co duong di tu %d den %d",s,t);
getch();
return;
}
printf("\n Duong di tu %d den %d la:",s,t);
int j = t;printf("%d<=", t);
while(truoc[j]!=s){
printf("%3d<=",truoc[j]);
j=truoc[j];
}
printf("%3d",s);
}
void In(void){
printf("\n\n");
for(int i=1; i<=n; i++)
printf("%3d", truoc[i]);
}
void BFS(int s) {
int dauQ, cuoiQ, p, u;printf("\n");
dauQ=1;cuoiQ=1; queue[dauQ]=s;chuaxet[s]=FALSE;
while (dauQ<=cuoiQ){
u=queue[dauQ]; dauQ=dauQ+1;
printf("%3d",u);
for (p=1; p<=n;p++){

114

Chng 5: th (Graph)
if(A[u][p] && chuaxet[p]){
cuoiQ=cuoiQ+1;queue[cuoiQ]=p;
chuaxet[p]=FALSE;truoc[p]=u;
}
}
}
}
void duongdi(void){
int chuaxet[MAX], truoc[MAX], queue[MAX];
Init();BFS(s);Result();
}
void main(void){
clrscr();
printf("\n Dinh dau:"); scanf("%d",&s);
printf("\n Dinh cuoi:"); scanf("%d",&t);
Init();printf("\n");BFS(s);
n();getch();
Result();getch();
}

5.4. NG I V CHU TRNH EULER


Chu trnh n trong th G i qua mi cnh ca th ng mt ln c gi l chu
trnh Euler. ng i n trong G i qua mi cnh ca n ng mt ln c gi l ng
i Euler. th c gi l th Euler nu n c chu trnh Euler. th c ng i Euler
c gi l na Euler.
R rng, mi th Euler u l na Euler nhng iu ngc li khng ng.
V d 1. Xt cc th G1, G2, G3 trong hnh 5.12.
a

c
G1

d
G2

G3

Hnh 5.12. th v hng G1, G2, G3.


th G1 l th Euler v n c chu trnh Euler a, e, c, d, e, b, a. th G3 khng
c chu trnh Euler nhng cha ng i Euler a, c, d, e, b, d, a, b v th G3 l na Euler.
G2 khng c chu trnh Euler cng nh ng i Euler.

115

Chng 5: th (Graph)
nh l. th v hng lin thng G=<V, E> l th Euler khi v ch khi mi
nh ca G u c bc chn. th v hng lin thng G=<V, E> l th na Euler khi
v ch khi n khng c qu hai nh bc l.
tm mt chu trnh Euler, ta thc hin theo thut ton sau:

To mt mng CE ghi ng i v mt stack xp cc nh ta s xt.


Xp vo mt nh tu u no ca th, ngha l nh u s c xt
u tin.

Xt nh trn cng ca ngn xp, gi s nh l nh v; v thc hin:


9 Nu v l nh c lp th ly v khi ngn xp v a vo CE;
9 Nu v l lin thng vi nh x th xp x vo ngn xp sau xo b cnh (v, x);

Quay li bc 2 cho ti khi ngn xp rng th dng. Kt qu ng i Euler


c cha trong CE theo th t ngc li.

Th tc Euler_Cycle sau s cho php ta tm chu trnh Euler.


void

Euler_Cycle(int u){
Stack=; CE=;
u=>Stack; { np u vo stack};
while (Stack) {
x= top(Stack); { x l phn t u stack }
if (ke(x) ) {
y = nh u trong danh sch ke(x);
Stack<=y; { np y vo Stack};
Ke(x) = Ke(x) \{y};
Ke(y) = Ke(y)\{x}; {loi cnh (x,y) khi th};
}
else {
x<= Stack; {ly x ra khi stack};
CE <=x; { np x vo CE;}
}

V d. Tm chu trnh Euler trong hnh 5.13.


a

b
4

5
9

10

Hnh 5.13. th v hng G.


116

Chng 5: th (Graph)
Cc bc thc hin theo thut ton s cho ta kt qu sau:
Bc Gi tr trong stack
Gi tr trong CE
Cnh cn li
1
F
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
2
f, a
2, 3, 4, 5, 6, 7, 8, 9, 10
3
f, a, c
3, 4, 5, 6, 7, 8, 9, 10
4
f,a,c,f
3, 4, 5, 6, 7, 9, 10
5
f, a, c
f
3, 4, 5, 6, 7, 9, 10
6
f, a, c, b
f
3, 4, 6, 7, 9, 10
7
f, a, c, b, d
f
3, 4, 7, 9, 10
8
f, a, c, b, d,c
f
3, 4, 7, 10
9
f, a, c, b, d
f, c
3, 4, 7, 10
10
f, a, c, b, d, e
f, c
3, 4, 7
11
f, a, c, b, d, e, b
f, c
3, 4
12
f, a, c, b, d, e, b, a
f, c
3
13
f, a, c, b, d, e, b, a, d
f, c
14
f, a, c, b, d, e, b, a
f, c, d
15
f, a, c, b, d, e, b
f,c,d,a
16
f, a, c, b, d, e
f,c,d,a,b
17
f, a, c, b, d
f,c,d,a,b,e
18
f, a, c, b
f,c,d,a,b,e,d
19
f, a, c
f,c,d,a,b,e,d,b
20
f, a
f,c,d,a,b,e,d,b,c
21
f
f,c,d,a,b,e,d,b,c,a
22
f,c,d,a,b,e,d,b,c,a,f
Mt th khng c chu trnh Euler nhng vn c th c ng i Euler. Khi ,
th c ng hai nh bc l, tc l tng cc s cnh xut pht t mt trong hai nh l s
l. Mt ng i Euler phi xut pht t mt trong hai nh v kt thc nh kia. Nh
vy, thut ton tm ng i Euler ch khc vi thut ton tm chu trnh Euler ch ta phi
xc nh im xut pht ca ng i.
tm tt c cc ng i Euler ca mt th n nh, m cnh, ta c th dng k
thut qui nh sau:
Bc 1. To mng b c di m + 1 nh mt ngn xp cha ng i. t b[0]=1,
i=1 (xt nh th nht ca ng i);
Bc 2. Ln lt cho b[i] cc gi tr l nh k vi b[i-1] m cnh (b[i-1],b[i])
khng trng vi nhng cnh dng t b[0] n b[i-1]. Vi mi gi tr ca b[i], ta
kim tra:
9 Nu i<m th tng i ln 1 n v (xt nh tip theo) v quay li bc 2.
9 Nu i=m th dy b chnh l mt ng i Euler.
117

Chng 5: th (Graph)

5.5. NG I V CHU TRNH HAMILTON


Vi th Euler, chng ta quan tm ti vic duyt cc cnh ca th mi cnh ng
mt ln, th trong mc ny, chng ta xt n mt bi ton tng t nhng ch khc nhau l
ta ch quan tm ti cc nh ca th, mi nh ng mt ln. S thay i ny tng nh
khng ng k, nhng thc t c nhiu s khc bit trong khi gii quyt bi ton.
nh ngha. ng i qua tt c cc nh ca th mi nh ng mt ln c gi
l ng i Hamilton. Chu trnh bt u ti mt nh v no qua tt c cc nh cn li
mi nh ng mt ln sau quay tr li v c gi l chu trnh Hamilton. th c gi
l th Hamilton nu n cha chu trnh Hamilton. th cha ng i Hamilton c
gi l th na Hamilton.
Nh vy, mt th Hamilton bao gi cng l th na Hamilton nhng iu ngc
li khng lun lun ng. V d sau s minh ha cho nhn xt ny.
V d. th thi hamilton G3, na Hamilton G2 v G1.
a

G1

G2

d
G3

Hnh 5.14. th thi hamilton G3, na Hamilton G2 v G1.


Cho n nay, vic tm ra mt tiu chun nhn bit th Hamilton vn cn m,
mc d y l vn trung tm ca l thuyt th. Hn th na, cho n nay cng vn
cha c thut ton hiu qu kim tra mt th c phi l th Hamilton hay khng.
lit k tt c cc chu trnh Hamilton ca th, chng ta c th s dng thut ton sau:
void Hamilton(int k){
(* Lit k cc chu trnh Hamilton ca th bng cch pht trin dy nh
(X[1], X[2], . . ., X[k-1] ) ca th G = (V, E) *)
for y Ke(X[k-1]) {
if ((k==n+1) && (y == v0))
Ghinhan(X[1], X[2], . . ., X[n], v0);
else {
X[k]=y; chuaxet[y] = false;
Hamilton(k+1);
chuaxet[y] = true;
};
}

118

Chng 5: th (Graph)

5.6. CY BAO TRM


5.6.1. Khi nim v nh ngha
nh ngha 1. Ta gi cy l th v hng lin thng khng c chu trnh. th
khng c chu trnh c gi l rng.
Nh vy, rng l th m mi thnh phn lin thng ca n l mt cy.
V d. Rng gm 3 cy trong hnh 5.15.

T1

T2

T3

Hnh 5.15 . Rng gm 3 cy T1, T2, T3.


Cy c coi l dng th n gin nht ca th. nh l sau y cho ta mt s
tnh cht ca cy.
nh l. Gi s G=<V, E> l th v hng n nh. Khi nhng khng nh sau
l tng ng
a. G l mt cy.
b. G l th v hng lin thng khng c chu trnh.
c. G lin thng v c ng n-1 cnh.
d. Gia hai nh bt k ca G c ng mt ng i.
e. G lin thng v mi cnh ca n u l cu.
f. G khng cha chu trnh nhng h c thm vo n mt cnh ta thu
c ng mt chu trnh.
nh ngha 2. Cho G l th v hng lin thng. Ta gi th con T ca G l mt
cy bao trm hay cy khung nu T tho mn hai iu kin:
g. T l mt cy;
h. Tp nh ca T bng tp nh ca G.
i vi cy bao trm, chng ta quan tm ti nhng bi ton c bn sau:
Bi ton 1. Cho G=<V, E> l th v hng lin thng. Hy xy dng mt cy
bao trm ca G.

119

Chng 5: th (Graph)
Bi ton 2. Cho G = <V, E> l th v hng lin thng c trng s. Hy tm cy
bao trm nh nht ca G.
5.6.2. Tm mt cy bao trm trn th
tm mt cy bao trm trn th v hng lin thng, c th s dng k thut tm
kim theo chiu rng hoc tm kim theo chiu su thc hin. Gi s ta cn xy dng
mt cy bao trm xut pht ti nh u no . Trong c hai trng hp, mi khi ta n c
nh v tc (chuaxet[v] = true) t nh u th cnh (u,v) c kt np vo cy bao trm. Hai
k thut ny c th hin trong hai th tc STREE_DFS(u) v STREE_BFS(v) nh sau:
void STREE_DFS( int u){
/* Tm kim theo chiu su, p dng cho bi ton xy dng cy bao trm ca th v hng lin
thng G=(V, E); cc bin chuaxet, Ke, T l ton cc */
chuaxet[u] = true;
for v Ke(u) {
if (chuaxet[v]){
T = T (u,v);
STREE_DFS(v);
}
}
}
void STREE_BFS(int u) {
QUUE=;
QUEUE<= u; /* a u vo hng i*/
chuaxet[u] = false;
while (QUEUE ) {
v<= QUEUE; /* ly v khi hng i */
for p Ke(v) {
if (chuaxet[u]) {
QUEUE<= u;
chuaxet[u] = false;
T = T(v, p);
}
}
}
}
/* Main program */
for u V {
chuaxet[u] = true;
T = ;
STREE_BFS(root);
}

120

Chng 5: th (Graph)
5.6.3. Tm cy bao trm ngn nht
Bi ton tm cy bao trm nh nht l mt trong nhng bi ton ti u trn th c
ng dng trong nhiu lnh vc khc nhau ca thc t. Bi ton c pht biu nh sau:
Cho G=<V, E> l th v hng lin thng vi tp nh V = {1, 2, . . ., n } v tp
cnh E gm m cnh. Mi cnh e ca th c gn vi mt s khng m c(e) c gi l
di ca n. Gi s H = <V, T> l mt cy bao trm ca th G. Ta gi di c(H) ca
cy bao trm H l tng di cc cnh ca n: c( H ) = c(e) . Bi ton c t ra l,
eT

trong s cc cy khung ca th hy tm cy khung c di nh nht ca th.


gii bi ton cy bao trm nh nht, chng ta c th lit k ton b cy bao trm
v chn trong s mt cy nh nht. Phng n nh vy thc s khng kh thi v s cy
bao trm ca th l rt ln c nn-2, iu ny khng th thc hin c vi th vi s
nh c chc.
tm mt cy bao trm chng ta c th thc hin theo cc bc nh sau:

Bc 1. Thit lp tp cnh ca cy bao trm l . Chn cnh e = (i, j) c


di nh nht b sung vo T.

Bc 2. Trong s cc cnh thuc E \ T, tm cnh e = (i1, j1) c di nh nht


sao cho khi b sung cnh vo T khng to nn chu trnh. thc hin
iu ny, chng ta phi chn cnh c di nh nht sao cho hoc i1 T v
j1 T, hoc j1 T v i1 T.

Bc 3. Kim tra xem T n-1 cnh hay cha? Nu T n-1 cnh th n


chnh l cy bao trm ngn nht cn tm. Nu cha n-1 cnh th thc hin
li bc 2.

V d. Tm cy bao trm nh nht ca th trong hnh 5.16.


2

20

33
1

8
18

16

17

14
3

Hnh 5.16. th v hng lin thng G=(V, E)

Bc 1. t T=. Chn cnh (3, 5) c di nh nht b sung vo T.

Buc 2. Sau ba ln lp u tin, ta ln lt b sung vo cc cnh (4,5), (4, 6).


R rng, nu b sung vo cnh (5, 6) s to nn chu trnh v nh 5, 6 c
mt trong T. Tnh hung tng t cng xy ra i vi cnh (3, 4) l cnh tip
theo ca dy. Tip , ta b sung hai cnh (1, 3), (2, 3) vo T.
121

Chng 5: th (Graph)

Buc 3. Tp cnh trong T n-1 cnh: T={ (3, 5


(2,3)} chnh l cy bao trm ngn nht.

), (4,6), (4,5), (1,3),

5.6.4. Thut ton Kruskal


Thut ton xy dng tp cnh T ca cy khung nh nht H=<V, T> theo tng bc
nh sau:
a.

Sp xp cc cnh ca th G theo th t tng dn ca trng s cnh;

b.

Xut pht t tp cnh T=, mi bc, ta s ln lt duyt trong danh sch


cc cnh c sp xp, t cnh c trng s nh n cnh c trng s ln
tm ra cnh m khi b sung n vo T khng to thnh chu trnh trong tp cc
cnh c b sung vo T trc ;

c.

Thut ton s kt thc khi ta thu c tp T gm n-1 cnh.

Thut ton c m t thng qua th tc Kruskal nh sau:


void

Kruskal(void) {
T = ;
While( | T | < (n-1) and (E )) {
Chn cnh e E l cnh c di nh nht;
E = E\ {e};
if (T {e} khng to nn chu trnh )
T = T {e};
}
if ( | T | <n-1)
< th khng lin thng>;

5.6.5. Thut ton Prim


Thut ton Kruskal lm vic km hiu qu i vi nhng th c s cnh khong
m=n(n-1)/2. Trong nhng tnh hung nh vy, thut ton Prim t ra hiu qu hn. Thut
ton Prim cn c mang tn l ngi lng ging gn nht. Trong thut ton ny, bt u
ti mt nh tu s ca th, ni s vi nh y sao cho trng s cnh c[s, y] l nh nht.
Tip theo, t nh s hoc y tm cnh c di nh nht, iu ny dn n nh th ba z v ta
thu c cy b phn gm 3 nh 2 cnh. Qu trnh c tip tc cho ti khi ta nhn c
cy gm n-1 cnh, chnh l cy bao trm nh nht cn tm.
Trong qu trnh thc hin thut ton, mi bc, ta c th nhanh chng chn nh v
cnh cn b sung vo cy khung, cc nh ca th c s c gn cc nhn. Nhn ca
mt nh v gm hai phn, [d[v], near[v]]. Trong , phn th nht d[v] dng ghi nhn
di cnh nh nht trong s cc cnh ni nh v vi cc nh ca cy khung ang xy
dng. Phn th hai, near[v] ghi nhn nh ca cy khung gn v nht. Thut ton Prim c
m t thng qua th tc sau:

122

Chng 5: th (Graph)
void Prim(void) {
(*bc khi to*)
Chn s l mt nh no ca th;
VH = { s }; T = ; d[s] = 0; near[s] = s;
For v V\VH {
D[v] = C[s, v]; near[v] = s;
}
(* Bc lp *)
Stop = False;
While (! stop) {
Tm u V\VH tho mn : d[u] = min { d[v] vi uV\VH};
VH = VH {u}; T = T {u, near[u] };
If (| VH | == n ) {
H = (VH, T) l cy khung nh nht ca th;
Stop := TRUE;
}
Else
For (v V\VH ) {
If (d[v] > C[u, v]) {
D[v] = C[u, v];
Near[v] = u;
}
}
}

5.7. BI TON TM NG I NGN NHT


5.7.1. Pht biu bi ton
Xt th c hng G=<V, E>; trong | V| = n, | E | = m. Vi mi cung (u,v)E,
ta t tng ng vi n mt s thc A(u,v) c gi l trng s ca cung. Ta s t
A[u,v]= nu (u,v)E. Nu dy v0, v1, . . . , vk l mt ng i trn G th

p
i =1

A[vi 1 , vi ]

c gi l di ca ng i.
Bi ton tm ng i ngn nht trn th c hng di dng tng qut c th
c pht biu di dng sau: tm ng i ngn nht t mt nh xut pht sV (nh
ngun) n nh cui tV (nh ch). ng i nh vy c gi l ng i ngn nht t
s n t, di ca ng i d(s,t) c gi l khong cch ngn nht t s n t (trong
trng hp tng qut d(s,t) c th m). Nu nh khng tn ti ng i t s n t th di
ng i d(s,t)=. Nu nh mi chu trnh trong th u c di dng th trong ng
i ngn nht s khng c nh no b lp li, ng i nh vy c gi l ng i c bn.
Nu nh th tn ti mt chu trnh no c di m , th ng i ngn nht c th

123

Chng 5: th (Graph)
khng xc nh, v ta c th i qua chu trnh m mt s ln ln di ca n nh
hn bt k mt s thc cho trc no.
5.7.2. Thut ton Dijkstra
Thut ton tm ng i ngn nht t nh s n cc nh cn li c Dijkstra
ngh p dng cho trng hp th c trng s khng m. Thut ton c thc hin trn
c s gn nhn tm thi cho cc nh. Nhn ca mi nh cho bit cn trn ca di
ng i ngn nht ti nh . Cc nhn ny s c bin i (tnh li) nh mt th tc
lp, m mi bc lp mt s nh s c nhn khng thay i, nhn chnh l di
ng i ngn nht t s n nh . Thut ton c th c m t bng th tc Dijkstra
nh sau:
void Dijkstra(void) {
(*u vo G=(V, E) vi n nh c ma trn trng s A[u,v] 0; sV *)
(*u ra l khong cch nh nht t s n cc nh cn li d[v]: vV.
Truoc[v] ghi li nh trc v trong ng i ngn nht t s n v*)
(* Bc 1: Khi to nhn tm thi cho cc nh*)
for (v=1; vn; v++){
d[v] = A[s,v];
truoc[v]=s;
}
d[s]=0; T = V\{s};(*T l tp nh c nhn tm thi*)
while (T!= ) { (* bc lp *)
Tm nh uT sao cho d[u] = min { d[z] : zT}
T= T\{u}; (*c nh nhn nh u*);
For (vT) { (* Gn li nhn cho cc nh trong T*)
If ( d[v] > d[u] + A[u, v] ) {
d[v] = d[u] + A[u, v];
truoc[v] =u;
}
}
}
}

5.7.3. Thut ton Floy


tm ng i ngn nht gia tt c cc cp nh ca th, chng ta c th s
dng n ln thut ton Ford_Bellman hoc Dijkstra (trong trng hp trng s khng m).
Tuy nhin, trong c hai thut ton c s dng u c phc tp tnh ton ln (ch t l
O(n3)). Trong trng hp tng qut, ngi ta thng dng thut ton Floy c m t nh
sau:
void Floy(){
(* Tm ng i ngn nht gia tt c cc cp nh

124

Chng 5: th (Graph)
Input:

th cho bi ma trn trng s a[i, j], i, j = 1, 2, . . ., n.

Output:- Ma trn ng i ngn nht gia cc cp nh d[i, j], i, j = 1, 2, . . .,n;


d[i,j] l di ngn nht t i n j.
Ma trn ghi nhn ng i p[i, j], i, j = 1, 2, . . ., n
p[i, j] ghi nhn nh i trc nh j trong ng i ngn nht;*)
(*bc khi to*)
for( i=1; i; i++)
for( j =1; jn; j++) {
d[i,j] = a[i, j];
p[i,j] = i;
}
(*bc lp *)
for (k=1; kn; k++)
for( i=1; in; i++)
for (j =1; jn; j++)
if (d[i,j] > d[i, k] + d[k, j]) {
d[i, j] = d[i, k] + d[k, j];
p[i,j] = p[k, j];
}
}

Bn c c th tm thy nhng ci t c th cc thut ton trn th thng qua cc


ti liu [1], [5].

125

Chng 5: th (Graph)

NHNG NI DUNG CN GHI NH

9 Nm vng nhng khi nim v nh ngha c bn ca th.


9 Hiu c cc phng php biu din th trn my tnh.
9 Nm vng c cc thut ton tm kim trn th: thut ton tm kim theo
chiu rng, thut ton tm kim theo chiu su v ng dng ca n trong bi ton
tm ng i gia hai nh ca th cng nh trong tnh ton cc thnh phn
lin thng ca th.
9 Nm vng s khc bit gia th Euler v th Hamilton cng vi thut ton
tm ng i v chu trnh trn cc th Euler & Hamilton.
9 Nm vng bi ton tm cy bao trm & tm cy bao trm nh nht.
9 Hiu & ci t nhun nhuyn cc thut ton tm ng i ngn nht gia cc cp
nh ca th trng s.

126

Chng 5: th (Graph)

BI TP CHNG 5

Bi 1. Cho trc ma trn k ca th. Hy vit chng trnh to ra danh sch k ca


th .
Bi 2. Cho trc danh sch k ca th, hy to nn ma trn k ca th.
Bi 3. Mt bn c 88 c nh s theo cch sau:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

Mi c th coi l mt nh ca th. Hai nh c coi l k nhau nu mt con vua


t ny c th nhy sang kia sau mt bc i. V d : 1 k vi 2, 9, 10, 11 k vi
2, 3, 4, 10, 12, 18, 19, 20. Hy vit chng trnh to ma trn k ca th, kt qu in ra file
king.out.
Bi 4. Bn c 88 c nh s nh bi trn. Mi c th coi l mt nh ca th . Hai
nh c gi l k nhau nu mt con m t ny c th nhy sang kia sau mt
nc i. V d 1 k vi 11, 18, 11 k vi 1, 5, 17, 21, 26, 28. Hy vit chng
trnh lp ma trn k ca th, kt qu ghi vo file ma.out.
Bi 5. Hy lp chng trnh tm mt ng i ca con m trn bn c t s n t (s, t
c nhp t bn phm).
Bi 6. Cho C s d liu ghi li thng tin v N Tuyn bay (N<=100) ca mt hng hng
khng. Trong , thng tin v mi tuyn bay c m t bi: im khi hnh
(departure), im n (destination), khong cch (lenght). Departure, destination l
mt xu k t di khng qu 32, khng cha du trng gia, Length l mt s
nh hn 32767.
Ta gi Hnh trnh bay t im khi hnh A ti im n B l dy cc hnh trnh
[A, A1, n1], [A1, A2, n2] . . .[Ak, B,nk] vi Ai l im n ca tuyn i nhng li l im khi

127

Chng 5: th (Graph)
hnh ca tuyn i +1, ni l khong cch ca tuyn bay th i (1<=i<k). Trong , khong cch
ca hnh trnh l tng khong cch ca cc tuyn m hnh trnh i qua (n1+n2+. .+nk).
Cho file d liu kiu text hanhtrinh.in c ghi theo tng dng, s cc dng trong
file d liu khng vt qu N, trn mi dng ghi li thng tin v mt tuyn bay, trong
departure, destination, length c phn bit vi nhau bi mt hoc vi du trng. Hy tm
gii php tho mn nhu cu ca khch hng i t A n B theo mt s tnh hung sau:
Tm hnh trnh c khong cch b nht t A n B. In ra mn hnh tng im m
hnh trnh qua v khong cch ca hnh trnh. Nu hnh trnh khng tn ti hy a ra
thng bo Hnh trnh khng tn ti.
V d v C s d liu hanhtrinh.in
New_York

Chicago

1000

Chicago

Denver

1000

New_York

Toronto

800

New_York

Denver

1900

Toronto

Calgary

1500

Toronto

Los_Angeles

1800

Toronto

Chicago

500

Denver

Urbana

1000

Denver

Houston

1500

Houston

Los_Angeles

1500

Denver

Los_Angeles

1000

Vi im i : New_York, im n : Los_Angeles ; chng ta s c kt qu sau:


Hnh trnh ngn nht:
New_York to Toronto to Los_Angeles; Khong cch: 2600.
Bi 7. K tc thnh cng vi khi lp phng thn b, Rubik sng to ra dng phng ca
tr chi ny gi l tr chi cc vung thn b. l mt bng gm 8 vung bng
nhau nh hnh 1. Chng ta qui nh trn mi vung c mt mu khc nhau. Cc mu
c k hiu bi 8 s nguyn tng ng vi tm mu c bn ca mn hnh EGA,
VGA nh hnh 1. Trng thi ca bng cc mu c cho bi dy k hiu mu cc
c vit ln lt theo chiu kim ng h bt u t gc trn bn tri v kt thc
gc di bn tri. V d: trng thi trong hnh 1 c cho bi dy cc mu tng ng
vi dy s (1, 2, 3, 4, 5 , 6, 7, 8). Trng thi ny c gi l trng thi khi u.
Bit rng ch cn s dng 3 php bin i c bn c tn l A, B, C di y
bao gi cng chuyn c t trng thi khi u v trng thi bt k:

128

Chng 5: th (Graph)
A : i ch dng trn xung dng di. V d sau php bin i A, hnh 1 s tr
thnh hnh 2:
B : thc hin mt php hon v vng quanh t tri sang phi trn tng dng. V d
sau php bin i B hnh 1 s tr thnh hnh 3:
C : quay theo chiu kim ng h bn gia. V d sau php bin i C hnh 1
tr thnh hnh 4:
Hnh 1

Hnh 2 Hnh 3

Hnh 4

1 2

8 7

8 7

1 2

8 6

Cho file d liu Input.txt ghi li 8 s nguyn trn mt dng, mi s c phn bit
vi nhau bi mt du trng ghi li trng thi ch. Hy tm dy cc php bin i s bn
a trng thi khi u v trng thi ch sao cho s cc php bin i l t nht c th
c.
D liu ra c ghi li trong file Output.txt, dng u tin ghi li s cc php bin
i, nhng dng tip theo ghi li tn ca cc thao tc c bn thc hin, mi thao tc c
bn c vit trn mt dng.
Bn s c thm 20 im nu s dng bng mu thch hp ca mn hnh m t
li cc php bin i trng thi ca tr chi. V d vi trng thi ch di y s cho ta kt
qu nh sau:
Input.txt

Output.txt

2 6 8 4 5 7 3 1

7
B
C
A
B
C
C
B

Bi 8. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip
t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i],
vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2,
. . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2],
A[i2,i3], . . . A[ik-1,ik]. Cho trc hai nt i v j. Hy tm mt ng truyn tin t nt i
n nt j sao cho chi ph truyn thng l thp nht.
129

Chng 5: th (Graph)
D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi ba
s N, i, j, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.
Kt qu thng bo ra file TEXT c tn OUT.NN. Trong , dng th nht ghi chi
ph truyn thng thp nht t nt i n nt j, dng th 2 ghi ln lt cc nt trn ng
truyn tin c chi ph truyn thng thp nht t nt i ti nt j.
Bi 9. Cho mt mng thng tin gm N nt. Trong , ng truyn tin hai chiu trc tip
t nt i n nt j c chi ph truyn thng tng ng l mt s nguyn A[i,j] = A[j,i],
vi A[i,j]>=0, i j. Nu ng truyn tin t nt i1 n nt ik phi thng qua cc nt i2,
. . ik-1 th chi ph truyn thng c tnh bng tng cc chi ph truyn thng A[i1,i2],
A[i2,i3], . . . A[ik-1,ik]. Bit rng, gia hai nt bt k ca mng thng tin u tn ti t
nht mt ng truyn tin.
tit kim ng truyn, ngi ta tm cch loi b i mt s ng truyn tin m
vn m bo c tnh lin thng ca mng. Hy tm mt phng n loi b i nhng
ng truyn tin, sao cho ta nhn c mt mng lin thng c chi ph ti thiu nht
c th c.
D liu vo c cho bi file TEXT c tn INP.NN. Trong , dng th nht ghi s
N, dng th k + 1 ghi k-1 s A[k,1], A[k,2], . . , A[k,k-1], 1<=k<=N.
Kt qu thng bo ra file TEXT c tn OUT.NN trong dng th nht ghi chi ph
truyn thng nh nht trong ton mng. T dng th 2 ghi ln lt cc nt trn ng
truyn tin, mi ng truyn ghi trn mt dng.
Bi 10. Cho file d liu c t chc ging nh bi 6.6. Hy tm tt c cc hnh trnh i t
im s n t.
Bi 11. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n
t sao cho hnh trnh i qua nhiu node nht.
Bi 12. Cho file d liu c t chc ging nh bi 6.6. Hy tm hnh trnh i t im s n
t sao cho hnh trnh i qua t node nht.
Bi 13. Tm hiu thut ton leo i trn th v ng dng ca n trong lnh vc tr tu
nhn to.

130

Chng 6: Sp xp v tm kim (sorting and searching)

CHNG 6: SP XP V TM KIM (SORTING


AND SEARCHING)

Sp xp & tm kim l bi ton c bn nht ca tin hc. C th ni, mi tng tc


gia con ngi v h thng my tnh v bn cht u l tm kim v thu thp thng tin. n
sau cc qu trnh tm kim l vic sp xp cc i tng theo mt trt t no qu trnh
tm kim din ra nhanh nht, chnh xc v hiu qu nht l ngha c bn ca qu trnh
sp xp. Ni dung chnh ca chng ny tp chung vo cc gii thut sp xp v tm kim
c bn di y:
9 Gii thut Selection Sort, Gii thut Insert Sort, Gii thut Bubble Sort, Gii thut
Shaker Sort, Gii thut Quick Sort, Gii thut Heap Sort, v gii thut Merge
Sort.
9 Tm kim tun t (Sequential), tm kim nh phn (Binary Search) & tm kim
trn cy nh phn (Binary Search).
Bn c c th tm thy nhng ci t c th v nhng kin thc su hn trong ti
liu [1] & [6].

6.1. T BI TON
Sp xp l qu trnh b tr li cc phn t ca mt tp i tng no theo mt th
t n nh tng dn (increasing), hoc gim dn (decreasing). Bi ton sp xp xut hin
trong bt k lnh vc no ca tin hc, phc v nhng ng dng ring ca h thng, t
nhng ng dng n bn trong ca H iu hnh nh bi ton iu khin qu trnh ( Proccess
Control Problem), bi ton lp lch cho CPU (CPU Schedulling), bi ton qun l b nh
(Memory Management) . . . cho ti nhng ng dng thng thng nh sp xp dy s, sp
xp cc t, cc cu, cc bn ghi theo th t u c lin quan ti qu trnh sp xp.
Tp i tng cn c sp xp c th xut hin di nhiu dng khc nhau, cc i
tng c th l cc i tng d liu kiu c bn nh sp xp dy s, sp xp k t, sp
xp string hoc l cc i tng tng qut nh mt cu trc bao gm mt s trng thng
tin phn nh i tng. Chng ta qui c i tng cn c sp xp l cc cu trc, v qu
trnh sp xp c thc hin trn mt trng no gi l trng kho.
C nhiu thut ton sp xp khc nhau sp xp cc i tng. Tuy nhin, la
chn mt thut ton sp xp tt, chng ta cn nh gi thut ton theo cc hai kha cnh:
l s chim dng b nh khi p dng gii thut v thi gian thc hin gii thut. i vi
thi gian thc hin gii thut, chng ta cng cn nh gi chi ph thi gian trong trng hp
tt nht, trung bnh v xu nht i vi ngun d liu vo. Chng ta cng ch a ra nhng

131

Chng 6: Sp xp v tm kim (sorting and searching)


k thut lp trnh, thng qua gii thut v kt qu nh gi thut ton m khng chng
minh li nhng kt qu , v n c trnh by trong mt chuyn khc ca tin hc.
Nhng thut ton sp xp v tm kim s c bn lun trong chng ny bao gm
cc thut ton sp xp n gin nh : chn trc tip (Selection), thut ton si bt (Bubble),
thut ton chn trc tip (Insertion), cc thut ton sp xp nhanh nh quick sort, merge
sort, heap sort. Trong tt c cc v d minh ha cho gii thut sp xp v tm kim, chng ta
s s dng tp cc s nguyn di y lm v d sp xp. Dy s nguyn ny s khng
c nhc li trong khi gii thch mi thut ton sp xp.
42

23

74

11

65

58

94

36

99

87

6.2. GII THUT SELECTION SORT


Ni dung ca Selection Sort l ln lt chn phn t nh nht trong dy ch s k1, k2,.
. ., kn vi i = 0, 1, . .,n; ki< k i+1 < . . ., kn v i ch cho phn t th ki. Nh vy, sau j =n-1
ln chn, chng ta s s dy kho c sp xp theo th t tng dn. i vi dy s trn,
chng ta s thc hin nh sau:

Ln chn th 0: Tm trong khong t 0 n n-1 bng cch thc hin n- 1 ln so


snh xc nh phn t min0 v i ch cho phn t v tr 0.

Ln chn th 1: Tm trong khong t 1 n n-1 bng cch thc hin n- 2 ln so


snh xc nh phn t min1 v i ch cho phn t v tr 1.

..........................................................

Ln chn th i: Tm trong khong t i n n-1 bng cch thc hin n- i ln so


snh xc nh phn t mini v i ch cho phn t v tr i.

Ln chn th n-2: Tm trong khong t n-2 n n-1 bng cch thc hin 1 ln so
snh xc nh phn t minn-2 v i ch cho phn t v tr n-2.

phc tp tnh ton ca gii thut Selection Sort l:


Cmin=Cmax=Ctb = n (n-1)/2
Qu trnh sp xp dy s c minh ha thng qua bng sau:
i

ki

42

11

11

11

11

11

11

11

11

11

23

23

23

23

23

23

23

23

23

23

74

74

74

36

36

36

36

36

36

36

11

42

42

42

42

42

42

42

42

42

65

65

65

65

65

58

58

58

58

58

58

58

58

58

58

65

65

65

65

65

132

Chng 6: Sp xp v tm kim (sorting and searching)


6

94

94

94

94

94

94

74

74

74

74

36

36

36

74

74

74

94

87

87

87

99

99

99

99

99

99

99

99

94

94

87

87

87

87

87

87

87

94

99

99

Chng trnh c ci t nh sau:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Select(int *, int);
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Select(int *A, int n){
register i,j,temp;
for(i=0;i<n-1;i++){
for (j=i+1;j<n;j++){
if(A[i]>A[j]){
temp=A[i];
A[i]=A[j];
A[j]=temp;
}
}
In(A,n);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);

133

Chng 6: Sp xp v tm kim (sorting and searching)


delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Select(A,n);
free(A);
}

6.3. GII THUT INSERTION SORT


Gii thut Insert Sort c thc hin da trn kinh nghim ca nhng ngi chi bi.
Khi c i-1 l bi c sp xp ang trn tay, nay ta thm l bi th i th l bi c
so snh vi l bi i-1, i-2, . . tm c v tr thch hp v chn vo qun bi th i.
Vi nguyn tc sp bi nh vy, gii thut c thc hin nh sau:

Ly phn t u tin i0, ng nhin tp mt phn t l tp c sp xp.

Ly tip phn t th i1 chn v tr thch hp ca phn t th i1 trong tp hai


phn t v thc hin i ch.

...........................................................

Ly tip phn t th ik chn v tr thch hp ca phn t th ik trong tp hai ik1 phn t v thc hin i ch, dy s c sp xp hon ton sau n-1 ln
chn phn t vo v tr thch hp.

phc tp b nht ca thut ton l: Cmin = ( n-1);


phc tp ln nht ca thut ton l: n(n-1)/2 = O(n2)
phc tp trung bnh ca thut ton l: (n2 +n- 2)/4 = O(n2)
Qu trnh sp xp theo Insertion Sort c m t nh sau:
Lt

...

10

Kho

42

23

74

11

...

36

99

87

42

23

23

11

...

11

11

11

42

42

23

...

23

23

23

74

42

...

42

36

36

74

...

58

42

42

...

65

58

58

...

74

65

65

2
3
4

134

Chng 6: Sp xp v tm kim (sorting and searching)


7

...

74

74

...

94

87

...

99

95

10

...
Thut ton c ci t nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Insert(int *, int);
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Insert(int *A, int n){
register i,j,temp;
for (i=1;i<n;i++){
temp=A[i];
for(j=i-1;j>=0 && temp<A[j];j--)
A[j+1]=A[j];
A[j+1]=temp;
printf("\n");
In(A,i+1);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}

135

94

99

Chng 6: Sp xp v tm kim (sorting and searching)


void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Insert(A,n);
free(A);
}

6.4. GII THUT BUBBLE SORT


Gii thut Bubble Sort c thc hin bng cch i ch lin tip hai phn t k cn
khi chng ngc th t. Qu trnh thc hin c duyt t y ln nh. Nh vy, sau ln
duyt th nht, phn t ln nht s c xp ng v tr th n-1, ln duyt th k th k
phn t ln nht c xp ng v tr n-1, n-2, . ., n-k+1. Sau ln duyt th n-1, ton b
n phn t s c sp xp. Vi phng php ny, cc phn t c gi tr nh c ni dn
ln nh nc si bt nh n c tn gi phng php si bt.
phc tp ca thut ton Bubble Sort l:
Cmin = Cmax = Ctb = n(n-1)/2.
Chng trnh m t thut ton Bubble Sort c ci t nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Bubble(int *, int);
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Bubble(int *A, int n){
register i,j,temp;
for (i=1; i<n; i++){
for (j=n-1; j>=i; j--){
if (A[j-1]>A[j]){

136

Chng 6: Sp xp v tm kim (sorting and searching)


temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
}
}
printf("\n Ket qua lan:%d", i);
In(A,n);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Bubble(A,n);
free(A);
}

6.5. GII THUT SHARER SORT


Thut ton Shaker Sort l ci tin ca thut ton Bubble Sort. Trong , sau mi ln
duyt i xp ng v tr phn t ln nht, chng ta thc hin duyt li sp ng v tr
phn t nh nht. Dy s c sp sau [n/2] + 1 ln duyt. Chng trnh m t thut ton
Shaker Sort c thc hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Shaker(int *, int);
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);

137

Chng 6: Sp xp v tm kim (sorting and searching)


printf("%5d",A[i]);
}
delay(1000);
}
void Shaker(int *A, int n){
register i,j,temp, exchange;
do {
exchange=0;
for (i=n-1; i>0; i--){
if (A[i-1]>A[i]){
temp=A[i-1];
A[i-1]=A[i];
A[i]=temp;
exchange=1;
}
}
for(j=1; j<n;j++){
if (A[j-1]>A[j]){
temp=A[j-1];
A[j-1]=A[j];
A[j]=temp;
exchange=1;
}
}
printf("\n Ket qua lan:");
In(A,n);
}while(exchange);
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Shaker(A,n);
free(A);
}

138

Chng 6: Sp xp v tm kim (sorting and searching)

6.6. GII THUT QUICK SORT


Phng php sp xp kiu phn on l mt ci tin ca phng php Selection Sort.
y l mt phng php tt do C.A.R. Hoare a ra v t tn cho n l gii thut Quick
Sort.
Ni dung ch o ca phng php ny l chn ngu nhin mt phn t no ca
dy lm kho cht. Tnh t kho cht, cc phn t nh hn kho phi c xp vo trc
cht (u dy), mi phn t sau cht c xp vo sau cht (cui dy). lm c vic
, cc phn t trong dy s c so snh vi kho cht v tro i v tr cho nhau, hoc
cho kho cht nu phn t ln hn cht m li nm trc cht hoc nh hn cht nhng
li nm sau cht. Khi vic i ch ln u tin thc hin xong th dy hnh thnh hai
on: mt on bao gm cc phn t nh hn cht, mt on gm cc phn t ln hn cht,
cn cht chnh l v tr ca phn t trong dy c sp xp.
p dng k thut nh trn cho mi on trc cht v sau cht cho ti khi cc on
cn li hai phn t th vic ghi nh khng cn cn thit na. Dy s c sp xp khi tt c
cc on c x l xong. V d vi dy :
42

23

74

11

65

58

94

36

99

87

Ta chn cht u tin l 42. pht hin ra hai kho cn i ch cho nhau, ta dng
hai bin i, j vi gi tr ban u i=2, j=10. Nu ki < 42 th tip tc tng i v lp li cho ti khi
gp phn t th ki >42. Duyt cc phn t th kj vi 42 nu kj > 42 th j gim i mt, cho
ti khi gp phn t th kj <42 th phn t th ki v kj c i ch cho nhau. Qu trnh s
c lp li vi ki v kj cho ti khi i=j chnh l v tr dnh cho kho 42. Cui cng chng ta
i ch 42 cho kho cho kj.
42

23

74

11

65

58

94

36

99

87

42

23

74

11

65

58

94

36

99

87

42

23

36

11

65

58

94

74

99

87

42

23

36

11

65

58

94

74

99

87

42

23

36

11

65

58

94

74

99

87 (i>j)

11

23

36

42

65

58

94

74

99

87

Nh vy, kt thc ln th nht, chng ta c hai on c phn bit bi kho 42


nh sau:
(11

23

36)

[42]

(65

58

94

74

99

87)

Qu trnh c lp li tng t cho tng phn on cho ti khi dy c sp xp


hon ton. Chng ta c th ci t gii thut bng vic s dng stack hoc qui.
phc tp tnh ton ca gii thut Quick Sort:
Trng hp tt nht Cmax = Ctb = O (n log2n)
Trung hp xu nht Cmin= k.O(n2)
139

Chng 6: Sp xp v tm kim (sorting and searching)


Sau y l chng trnh ci t gii thut Quick Sort bng phng php qui.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void qs(int *, int ,int);
void Quick(int *,int );
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Quick(int *A, int n){
qs(A,0,n-1);
}
void qs(int *A, int left,int right) {
register i,j;int x,y;
i=left; j=right;
x= A[(left+right)/2];
do {
while(A[i]<x && i<right) i++;
while(A[j]>x && j>left) j--;
if(i<=j){
y=A[i];A[i]=A[j];A[j]=y;
i++;j--;
}
} while (i<=j);
if (left<j) qs(A,left,j);
if (i<right) qs(A,i,right);
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);

140

Chng 6: Sp xp v tm kim (sorting and searching)


delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *)malloc(n*sizeof(int));
Init(A,n);Quick(A,n);printf("\n");
In(A,n);getch();
free(A);
}

6.7. GII THUT HEAP SORT


Heap l mt cy nh phn c biu din bng mt mng, mng biu din mt cy
nh phn hon chnh sao cho kha node cha bao gi cng ln hn kho ca node con ca
n.
Sp xp kiu Heap Sort c tin hnh qua hai giai on. Giai on u tin cy nh
phn biu din bng kho c bin i a v mt heap. Nh vy, i vi heap, nu j
l ch s ca node con th [j/2] l ch s ca node cha. Theo nh ngha ca heap th node
con bao gi cng nh hn node cha. Nh vy, node gc ca heap l kha c gi tr ln nht
trong mi node. V d cy ban u l cy 6.1a th heap ca n l 6.1b.
42
23
11

36

99

74
65

58

99
94

87

94

36

87
23

11

Hnh 6.1a

65

58

74

42
Hnh 6.1b

chuyn cy nh phn 6.1a thnh cy nh phn 6.1b l mt heap, chng ta thc hin
duyt t di ln (bottom up). Node l ng nhin l mt heap. Nu cy con bn tri v
cy con bn phi u l mt heap th ton b cy cng l mt heap. Nh vy, to thnh
heap, chng ta thc hin so snh ni dung node bn tri, ni dung node bn phi vi node
cha ca n, node no c gi tr ln hn s c thay i lm ni dung ca node cha. Qu
trnh ln ngc li cho ti khi gp node gc, khi ni dung node gc chnh l kho c gi
tr ln nht.
Giai on th hai ca gii thut l a ni dung ca node gc v v tr cui cng v
ni dung ca node cui cng c thay vo v tr node gc, sau coi nh node cui cng
nh b loi b v thc t node cui cng l gi tr ln nht trong dy s.
141

Chng 6: Sp xp v tm kim (sorting and searching)


Cy mi c to ra (khng k phn t loi b) khng phi l mt heap, chng ta li
thc hin vun thnh ng v thc hin tng t nh trn cho ti khi ng cn mt phn t
l phn t b nht ca dy.
phc tp thut ton ca Heap Sort
Cmax = Ctb = O (n log2n )
Gii thut Heap Sort c ci t nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
void Heap(int *, int );
void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Heap(int *A, int n) {
int k,x,s,f,ivalue;
for(k=1;k<n;k++){
x=A[k];
s=k; f=(s-1)/2;
while(s>0 && A[f]<x){
A[s]=A[f];
s=f; f=(s-1)/2;
}
A[s]=x;
}
for(k=n-1;k>0;k--){
ivalue=A[k];
A[k]=A[0];
f=0;
if(k==1)
s=-1;

142

Chng 6: Sp xp v tm kim (sorting and searching)


else
s=1;
if(k>2 && A[2]>A[1])
s=2;
while(s>=0 && ivalue<A[s]){
A[f]=A[s];
f=s;s=2*f +1;
if (s+1<=k-1 && A[s]<A[s+1])
s=s+1;
if (s>k-1)
s=-1;
}
A[f]=ivalue;
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Heap(A,n);printf("\n");
In(A,n);getch();
free(A);
}

6.8. GII THUT MERGE SORT


Sp xp theo Merge Sort l phng php sp xp bng cch trn hai danh sch
c sp xp thnh mt danh sch c sp xp. Phng php Merge Sort c tin
hnh thng qua cc bc nh sau:
Bc 1: Coi danh sch l n danh sch con mi danh sch con gm mt phn t, nh
vy cc danh sch con c sp xp. Trn tng cp hai danh sch con k cn
thnh mt danh sch c hai phn t c sp xp, chng ta nhn c n/2 danh
sch con c sp xp.
Bc 2: Xem danh sch cn sp xp nh n/2 danh sch con c sp xp. Trn
cp hai danh sch k cn thnh tng danh sch c 4 phn t c sp xp, chng
ta nhn c n/4 danh sch con.
143

Chng 6: Sp xp v tm kim (sorting and searching)


......................................................
Bc th i: Lm tng t nh bc i- 1. Qu trnh c tip tc khi chng ta nhn
c danh sch c n phn t c sp xp. V d vi dy:
42

23

74

11

68

58

94

36

ln 1: [23

42]

[11

74]

[58

68]

[94

36]

ln 2: [11

23

42

74]

[36

58

68

94]

ln 3: [11

23

42

36

58

68

74

94]

Chng trnh ci t gii thut Merge Sort c thc hin nh sau:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
#define

MAX

10

void Merge(int *, int );


void Init(int *, int);
void In(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Merge(int *A, int n) {
int i,j,k,low1,up1,low2,up2,size;
int *dstam;size=1;dstam=(int *) malloc(n*sizeof(int));
while(size<n){
low1=0;k=0;
while(low1 +size <n){
low2=low1+size; up1=low2-1;
if (low2+size-1< n)
up2=low2+size-1;
else
up2=n-1;
for(i=low1, j=low2; i<=up1 && j<=up2; k++){
if(A[i]<=A[j])

144

Chng 6: Sp xp v tm kim (sorting and searching)


dstam[k]=A[i++];
else
dstam[k] =A[j++];
}
for(;i<=up1;k++)
dstam[k]=A[i++];
for(;j<=up2;k++)
dstam[k]=A[j++];
low1=up2+1;
}
for (i=low1; k<n;i++)
dstam[k++]=A[i];
for(i=0;i<n;i++)
A[i]=dstam[i];
size*=2;
}
printf("\n Ket qua:");
In(A,n);free(dstam);
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Merge(A,n);printf("\n");
free(A);
}

6.9. TM KIM (SEARCHING)


Tm kim l cng vic quan trng i vi cc h thng tin hc v c lin quan mt
thit vi qu trnh sp xp d liu. Bi ton tm kim tng qut c th c pht biu nh
sau:
Cho mt bng gm n bn ghi R1, R2, . ., Rn. Vi mi bn ghi Ri c tng ng vi
mt kho ki (trng th i trong record). Hy tm bn ghi c gi tr ca kho bng X cho
trc.

145

Chng 6: Sp xp v tm kim (sorting and searching)


Nu chng ta tm c bn ghi c gi tr kha l X th php tm kim c tho
(successful). Nu khng c gi tr kha no l X th qu trnh tm kim l khng tho
(unsuccessful). Sau qu trnh tm kim, c th xut hin yu cu b xung thm bn ghi mi
c gi tr kha l X th gii thut c gi l gii thut tm kim b sung.
6.9.1. Tm kim tun t (Sequential Searching)
Tm kim tun t l k thut tm kim c in trn mt danh sch cha c sp xp.
Ni dung c bn ca phng php tm kim tun t l duyt t bn ghi th nht cho ti bn
ghi cui cng, v so snh ln lt gi tr ca kho vi gi tr X cn tm. Trong qu trnh
duyt, nu c bn ghi trng vi gi tr X th chng ta a ra v tr ca bn ghi trong dy, nu
duyt ti cui dy m khng c bn ghi no c gi tr ca kho trng vi X th qu trnh tm
kim tr li gi tr -1 (-1 c hiu l gi tr kho X khng thuc dy). Chng trnh ci t
phng php tm kim tun t c thc hin nh sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
int Sequential(int *, int, int);
void Init(int *, int);
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
int Bubble(int *A, int x, int n){
register i,temp;
for (i=0; i<n ; i ++){
if (A[i] == X)
return(i);
}
return(-1);
}
void main(void){
int *A,n, x, k;clrscr();
printf("\n Nhap n="); scanf("%d",&n);
printf(\n S x cn tm:); scanf(%d, &x);

146

Chng 6: Sp xp v tm kim (sorting and searching)


A=(int *) malloc(n*sizeof(int));
k= Sequential(A,x,n);
if ( k>=0)
printf(\n %d v tr %d, x,k);
else
printf(\n %d khng thuc dy);
free(A); getch();
}

6.9.2. Tm kim nh phn (Binary Searching)


Tm kim nh phn l phng php tm kim ph bin c thc hin trn mt dy
c sp th t. Ni dung ca gii thut c thc hin nh sau: ly kha cn tm kim X
so snh vi ni dung ca kha ca phn t gia, v tr ca phn t gia l mid = (low +
hight )/ 2, trong cn di low =0, cn trn hight = n-1. V dy c sp xp nn nu
ni dung ca kha ti v tr gia ln hn X th phn t cn tm thuc khong [mid+1, hight],
nu ni dung ca kha ti v tr gia nh hn X th phn t cn tm thuc khong [low, mid1], nu ni dung ca kha ti v tr gia trng vi X th chnh l phn t cn tm. bc
tip theo, nu ni dung ca kha ti v tr gia ln hn X th ta dch chuyn cn di low
ln v tr mid+ 1, nu ni dung ca kha ti v tr gia nh hn X th ta dch chuyn cn
trn v v tr mid- 1. Qu trnh c lp li cho ti khi gp kha c ni dung trng vi X
hoc cn di vt qu cn trn hay X khng thuc dy. Thut ton tm kim nh phn
c minh ha nh sau:
int

Binary_Search( int *A, int X, int n){


int mid, low=0, hight = n-1;
while ( low<=hight ){ // lp nu cn di vn nh hn cn trn
mid = (low + hight) /2; // xc nh v tr phn t gia
if (X > A[mid] ) low = mid +1; // X thuc [mid+1, hight]
else if (X < A[mid] ) hight = mid- 1; // X thuc [low, mid-1]
else

return(mid);

}
return(-1); // X khng thuc dy
}

Chng trnh c th c ci t nh sau:


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <dos.h>
int

Binary_Search( int *, int, int);

void Bubble(int *, int);


void Init(int *, int);

147

Chng 6: Sp xp v tm kim (sorting and searching)


int

Binary_Search( int *A, int X, int n) {


int mid, low = 0, hight = n-1;
while (low<=hight){
mid = (low +hight)/2;
if (X >A[mid] ) low = mid +1;
else if (X<A[mid] ) hight = mid -1;
else

return (mid);

}
return(-1);
}
void Init(int *A, int n){
int i;
printf("\n Tao lap day so:");
for (i=0; i<n;i++){
A[i]=random(1000);
printf("%5d",A[i]);
}
delay(1000);
}
void Bubble(int *A, int n){
register 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;
}
}
printf("\n Ket qua lan:%d", i);
In(A,n);
}
}
void In(int *A, int n){
register int i;
for(i=0;i<n;i++)
printf("%5d",A[i]);
delay(1000);
}
void main(void){
int *A,n, X, k;clrscr();

148

Chng 6: Sp xp v tm kim (sorting and searching)


printf("\n Nhap n="); scanf("%d",&n);
printf(\n S cn tm X=); scanf(%d,&X);
A=(int *) malloc(n*sizeof(int));
Init(A,n);Bubble(A,n); k= Binary_Search(A, X, n);
if ( k>0)
printf (\n %d v tr s %d, X, k);
else
printf(\n %d khng thuc dy);
getch();
free(A);
}

149

Chng 6: Sp xp v tm kim (sorting and searching)

NHNG NI DUNG CN GHI NH

9 Hiu c ngha vai tr ca bi ton sp xp v tm kim trong tin hc.


9 Ci t nhun nhuyn cc gii thut sp xp v tm kim trn cc cu trc d liu
khc nhau.
9 Gii quyt cc bi tp thc hnh km theo lm thng tin k nng gii quyt bi
ton sp xp & tm kim.

150

Chng 6: Sp xp v tm kim (sorting and searching)

BI TP CHNG 6

Bi 1. Ci t chng trnh theo thut ton Quick Sort khng dng phng php qui m
dng cu trc stack.
Bi 2. Tm hiu v gii thut Shell-Sort l phng php ci tin ca Insertion Sort.
Bi 3. Ci t li gii thut Bubble Sort sao cho cc node nh c y dn v pha trc.
Bi 4. Mt Ternary Heap l cy tam phn gn y c ci t bng mng mt chiu, mi
node c ba node con. Ni dung ca node cha bao gi cng ln hn hoc bng ni
dung ca node con, cc node c nh s t 0 n n-1, node i c 3 con l 3i+1, 3i+2,
3i+3. Hy ci t gii thut Ternary Heap.
Bi 5. Ci t gii thut Bubble Sort trn file.
Bi 6. Ci t gii thut Insertion Sort trn file.
Bi 7. Ci t gii thut Quick Sort trn file.
Bi 8. Ci t cc gii thut sp xp theo nhiu kho khc nhau.
Bi 9. Nghin cu v ci t thut ton tm kim tam phn.
Bi 10. Nghin cu v ci t thut ton sp xp kiu ho nhp thc hin trn file.
Bi 11. Vit chng trnh chuyn i mt file d liu c t chc theo khun dng *.DBF
thnh file kiu text. Ngc li, chuyn i file d liu kiu text thnh mt file d liu
theo khun dng DBF.
Bi 12. Tm hiu cch sp xp v tm kim theo kiu index ca cc h qun tr c s d liu
nh foxprol hoc access.

151

Ti liu tham kho

TI LIU THAM KHO

[1] L Hu Lp - Nguyn Duy Phng. Gio trnh K thut lp trnh. NXB Bu


in, 2002.
[2] Xun Li. Cu trc d liu v gii thut. NXB Khoa Hc K Thut, 2000.
[3] ng Huy Run. L thuyt th. NXB Khoa Hc K Thut, 2003
[4] William Ford, William Topp. Data Structures with C++. Prentice Hall, 1996.
[5] Mark Allen Weiss. Data Structures and Algorithm Analysis In C. Prentice Hall,
1996.
[6] Phan ng Cu. Cu trc d liu v Gii thut (Ti liu ging dyHc Vin
Cng ngh BCVT), 2003.

152

Mc lc

MC LC

Chng 1: I CNG V K THUT LP TRNH CU TRC ..................................3


1.1.

S lc v lch s lp trnh cu trc...............................................................3

1.2.

Cu trc lnh, lnh c cu trc, cu trc d liu ............................................5

1.2.1.

Cu trc lnh (cu trc iu khin) ........................................................5

1.2.2.

Lnh c cu trc .....................................................................................7

1.2.3.

Cu trc d liu......................................................................................7

1.3.

Nguyn l ti thiu .........................................................................................8

1.3.1.

Tp cc php ton ..................................................................................8

1.3.2.

Tp cc lnh vo ra c bn...................................................................11

1.3.3.

Thao tc trn cc kiu d liu c cu trc............................................11

1.4.

Nguyn l a phng ..................................................................................13

1.5.

Nguyn l nht qun.....................................................................................15

1.6.

Nguyn l an ton.........................................................................................16

1.7.

Phng php Top-Down ..............................................................................18

1.8.

Phng php Bottom - Up............................................................................22

Chng 2: DUYT V QUI ..........................................................................................29


2.1.

nh ngha bng qui ................................................................................29

2.2.

Gii thut qui ...........................................................................................30

2.3.

Thut ton sinh k tip .................................................................................31

2.4.

Thut ton quay lui (Back track) .................................................................34

2.5.

Thut ton nhnh cn ...................................................................................37

Chng 3: NGN XP, HNG I V DANH SCH MC NI (STACK, QUEUE,


LINK LIST)...........................................................................................................................51
3.1.

Kiu d liu ngn xp v ng dng..............................................................51

3.1.1.

nh ngha v khai bo ........................................................................51

3.1.2.

Cc thao tc vi stack ..........................................................................53

3.1.3.

ng dng ca stack..............................................................................53

153

Mc lc
3.2.

Hng i (Queue) .........................................................................................55

3.2.1.

nh ngha v khai bo ........................................................................55

3.2.2.

ng dng hng i...............................................................................57

3.3.

Danh sch lin kt n .................................................................................62

3.3.1.

Gii thiu v nh ngha.......................................................................62

3.3.2.

Cc thao tc trn danh sch mc ni....................................................63

3.4.

Danh sch lin kt kp..................................................................................67

Chng 4: CU TRC D LIU CY (TREE).................................................................77


4.1.

nh ngha v khi nim ..............................................................................77

4.2.

Cy nh phn.................................................................................................78

4.3.

Biu din cy nh phn .................................................................................81

4.3.1.

Biu din cy nh phn bng danh sch tuyn tnh ..............................81

4.3.2.

Biu din cy nh phn bng danh sch mc ni .................................82

4.4.

Cc thao tc trn cy nh phn......................................................................83

4.4.1.

nh ngha cy nh phn bng danh sch tuyn tnh............................83

4.4.2.

nh ngha cy nh phn theo danh sch lin kt:...............................83

4.4.3.

Cc thao tc trn cy nh phn .............................................................83

4.5.

Cc php duyt cy nh phn (Traversing Binary Tree)...............................88

4.5.1.

Duyt theo th t trc (Preorder Travesal)........................................88

4.5.2.

Duyt theo th t gia (Inorder Travesal) ...........................................89

4.5.3.

Duyt theo th t sau (Postorder Travesal) .........................................89

4.6.

Ci t cy nh phn tm kim......................................................................90

Chng 5: TH (GRAPH) ............................................................................................103


5.1.

Nhng khi nim c bn ca th............................................................103

5.1.1.

Cc loi th ....................................................................................103

5.1.2.

Mt s thut ng c bn ca th....................................................106

5.1.3.

ng i, chu trnh, th lin thng................................................107

5.2.

Biu din th trn my tnh ....................................................................107

5.2.1.

Ma trn k, ma trn trng s ..............................................................107

5.2.2.

Danh sch cnh (cung )......................................................................109

5.2.3.

Danh sch k ......................................................................................110


154

Mc lc
5.3.

Cc thut ton tm kim trn th ............................................................110

5.3.1.

Thut ton tm kim theo chiu su ...................................................110

5.3.2.

Thut ton tm kim theo chiu rng (Breadth First Search).............111

5.3.3.

Kim tra tnh lin thng ca th.....................................................112

5.3.4.

Tm ng i gia hai nh bt k ca th ....................................113

5.4.

ng i v chu trnh Euler .......................................................................115

5.5.

ng i v chu trnh Hamilton.................................................................118

5.6.

Cy bao trm ..............................................................................................119

5.6.1.

Khi nim v nh ngha ....................................................................119

5.6.2.

Tm mt cy bao trm trn th.......................................................120

5.6.3.

Tm cy bao trm ngn nht...............................................................121

5.6.4.

Thut ton Kruskal.............................................................................122

5.6.5.

Thut ton Prim..................................................................................122

5.7.

Bi ton tm ng i ngn nht ................................................................123

5.7.1.

Pht biu bi ton...............................................................................123

5.7.2.

Thut ton Dijkstra.............................................................................124

5.7.3.

Thut ton Floy ..................................................................................124

Chng 6: SP XP V TM KIM (SORTING AND SEARCHING)..........................131


6.1.

t bi ton ................................................................................................131

6.2.

Gii thut Selection Sort.............................................................................132

6.3.

Gii thut Insertion Sort .............................................................................134

6.4.

Gii thut Bubble Sort................................................................................136

6.5.

Gii thut Shaker Sort ................................................................................137

6.6.

Gii thut Quick Sort..................................................................................139

6.7.

Gii thut Heap Sort ...................................................................................141

6.8.

Gii thut Merge Sort .................................................................................143

6.9.

Tm kim (Searching).................................................................................145

6.9.1.

Tm kim tun t (Sequential Searching) ..........................................146

6.9.2.

Tm kim nh phn (Binary Searching)..............................................147

TI LIU THAM KHO .........................................................................................152


MC LC .................................................................................................................153
155

You might also like