You are on page 1of 130

CTDL&TT NGUYN C NGHA B mn KHMT HBK H ni

Chng 3 Chng 3
CC CU TRC D LIU C BN CC CU TRC D LIU C BN
((Basic Data Structures Basic Data Structures))
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ni dung Ni dung
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-2
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng 3. Cc cu trc d liu c bn Chng 3. Cc cu trc d liu c bn
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-3
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
4
Kiu d liu (Data types) Kiu d liu (Data types)
Kiu d liu (data type) c c trng bi:
tp cc gi tr (a set of values)
cch biu din d liu (data representation) c s
dng chung cho tt c cc gi tr ny v
tp cc php ton (set of operations) c th thc hin
trn tt c cc gi tr
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
BGA
Cc kiu d liu dng sn Cc kiu d liu dng sn
(Built (Built--in in data data types) types)
Trong cc ngn ng lp trnh thng c mt s kiu
d liu nguyn thu c xy dng sn. V d
Kiu s nguyn (Integer numeric types)
byte, char, short, int, long
Kiu s thc du phy ng (floating point numeric types)
float, double
Cc kiu nguyn thu khc (Other primitive types)
boolean
Kiu mng (Array type)
mng cc phn t cng kiu
6
D liu i vi kiu nguyn thu D liu i vi kiu nguyn thu
Type Bits Minimum value Maximum value
byte 8 -128 127
short 16 -32768 32767
char 16 0 65535
int 32 -2147483648 =-2
31
2147483647 =2
31
-1
long 64 -9223372036854775808 9223372036854775807
float 32
double 64
45
10 40 . 1

~
38
10 40 . 3 ~
324
10 94 . 4

~
308
10 80 . 1

~
C th c kiu boolean vi hai gi tr true hoc false
Trong ngn ng lp trnh C
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
BGA
Php ton i vi kiu d liu nguyn thu Php ton i vi kiu d liu nguyn thu
i vi kiu: byte, char, short, int, long
+, - , *, /, %, i thnh xu, ...
i vi kiu: float, double
+, -, *, /, round, ceil, floor, ...
i vi kiu: boolean
kim gi tr true, hay kim gi tr false
Nhn thy rng: Cc ngn ng lp trnh khc nhau
c th s dng m t kiu d liu khc nhau.
Chng hn, PASCAL v C c nhng m t cc d
liu s khc nhau.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
8
Kiu d liu tru tng Kiu d liu tru tng
(Abstract (Abstract Data Data Types) Types)
Kiu d liu tru tng (Abstract Data Type -ADT) bao
gm:
tp ccgitr (set of values) v
tp ccphpton(set of operations) cth thc hin vi tt c
ccgitr ny
Phn no ca kiu d liu (Data Type) b b qua trong
ADT ?
cch biu din d liu (data representation) c s dng
chungchott c ccgitr ny
Vic lmny c ngha lmtru tng hokhi nim kiu
d liu. ADT khng cn ph thuc vo ci t, khng ph
thuc ngnng lp trnh.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Kiu d liu tru tng Kiu d liu tru tng
(Abstract Data Type (Abstract Data Type -- ADT) ADT)
V d:
Chap02-9
ADT i tng
(Object)
Php ton
(Operations)
Danh sch(List) ccnt chn, xo, tm,...
th (Graphs) nh, cnh duyt, ng i, ...
Integer -...,-1, 0, 1,... + +, -, *, v.v...
Real -, ...., + +, -, *, v.v...
Ngn xp ccphn t pop, push,
isEmpty,...
Hngi Ccphn t enqueue,
dequeue,...
Cynh phn ccnt traversal, find,...
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Kiu d liu tru tng Kiu d liu tru tng
((Abstract Data Type Abstract Data Type -- ADT) ADT)
iu d hiu lcc kiu d liu nguynthu mcc ngn
ng lp trnhci t sn cng c coi lthuc vokiu d
liu tru tng. Trn thc t chng l ci t ca kiu d
liu tru tng trnngnng lp trnhc th.
nh ngha. Ta gi vic ci t (implementation) mt
ADT lvic din t bi cc culnh ca mt ngnng lp
trnh m t cc bin trong ADT v cc th tc trong
ngn ng lp trnh thc hin cc php ton ca ADT,
hoc trong cc ngn ng hng i tng, l cc lp
(class) bao gm c d liu (data) vcc phng thc x l
(methods).
Chap02-10
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Kiu d liu Kiu d liu -- Kiu d liu tru tng v Cu trc d liu Kiu d liu tru tng v Cu trc d liu
((Data Types, Data Structures and Abstract Data Types) Data Types, Data Structures and Abstract Data Types)
C th ni nhng thut ng: kiu d liu, kiu d liu tru
tng vcu trc d liu nghert ging nhau, nhng thc
rachngcngha khcnhau.
Trongngnng lp trnh, kiu d liu ca bin ltp ccgi
tr mbin ny c th nhn. V d, bin kiu booleanch c
th nhn gitr ng hoc sai. Cc kiu d liu c bn cth
thay i t ngn ng lp trnh ny sang NNLT khc. Tac
th to nhng kiu d liu phc hp t nhng kiu d liu c
bn. Cchto cng ph thuc vongnng lp trnh.
Kiu d liu tru tng lmhnhtonhc cngvi nhng
phptonxc nh trnm hnhny. Nlkhngph thuc
vongnng lp trnh.
biu din m hnh ton hc trong ADT ta s dng cu
trc d liu.
Chap02-11
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
(Data Structures) (Data Structures)
Cu trc d liu (DataStructures) lmt h cc bin, c
th c kiu d liu khc nhau, c lin kt li theo mt
cchthc no.
Vic ci t ADT i hi la chn cu trc d liu biu
din ADT.
Tas xtxemvic lm c tin hnhnh th no?
(cell) ln v c s cu thnh cu trc d liu. C th
hnh dung nh l ci hp ng gi tr pht sinh t mt
kiu d liu c bn hayphc hp.
Cu trc d liu c to nh t tncho mt nhm cc
vt gitr chomt s mt s linkt gia cc.
Taxt mt s cchto nhm.
Chap02-12
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
(Data Structures) (Data Structures)
Mt trong nhng cch to nhmn gin nht trong cc
ngn ng lp trnh l mng (array). Mng l mt dy
ccccngkiu xcnh no.
V d: Khai bo trong PASCAL (C) sau y
khai bo bin name gm 10 phn t kiu c s nguyn
(integer).
Cth truyxut n phn t ca mng nh ch ratnmng
cngvi ch s ca n.
Tas xtk hn kiu mng trongmc tip theo.
Chap02-13
PASCAL C
name: array[1..10] of integer; intname[10]
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
((Data Structures) Data Structures)
Mt phng phpchungna hay dng nhmcc lcu trc bn
ghi (record structure).
Bn ghi (record) l c to bi mt h cc (gi lcc trng) c
th ckiu rt khcnhau.
Cc bn ghi li thng c nhmli thnhmng; kiu c xc nh
bi vic nhmcc trng ca bn ghi tr thnh kiu ca phn t ca
mng.
V d: Trong PASCAL/C m t
khai bo reclist l mng 100 phn t, mi l mt bn ghi gm 2
trng: data vnext.
Chap02-14
PASCAL C
var
reclist: array[1..100] of record
data: real;
next: integer;
end;
struct record {
float data;
int next; } reclist[100];
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
((Data Structures) Data Structures)
Phng phpth ba nhmcc lfile. File, cng ging
nh mng mt chiu, lmt dy cc gitr cng kiu no
.
Tuy nhin, cc phn t trongfilech c th truy xut c
mt cchtun t, theoth t mchngxut hin trongfile.
Tri li, mng v bn ghi l cc cu trc trc truy
("random-access"), ngha lthi gian truy xut n cc
thnhphn ca mng (hay bn ghi) lkhngph thuc vo
ch s mng (haytrng c la chn).
Bncnh cn nhn mnh mt u im ca kiu filels
phn t ca nlkhngb gii hn!
Chap02-15
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
(Data Structures) (Data Structures)
Khi la chn cu trc d liu ci t ADT mt vn cn
c quantmlthi gianthc hin cc phptoni vi
ADT s nh th no. Bi v, cc cchci t khc nhauc
th dn n thi gianthc hin phptonkhcnhau.
V d: Xt ci t ADT t in (DictionaryADT)
ADT t in baogm:
Cn lu tr tp cccp <key, value>, tmkim valuetheo
key. Mi keyckhngqumt value.
Ccphptonc bn:
insert(k,v) : chncp (k,v) vot in
find(k): Nu (k,v) ctrongt in th tr li v, tri li tr v 0;
remove(k) : Xob cp (k,v) trongt in
Chap02-16
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu Cu trc d liu
(Data Structures) (Data Structures)
Xt ba phng php ci t t in:
Danh sch mc ni (Linked list);
Mng sp xp (Sorted array);
Cy tm kim (Search tree).
Bng di y cho nh gi thi gian ca vic thc hin
cc php ton:
Chap02-17
Ci t Insert Find Remove
Linked List O(n) O(n) O(n)
SortedArray O(n) O(log n) O(n)
SearchTree O(log n) O(log n) O(log n)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Con tr Con tr
((Pointer) Pointer)
Mt trongnhng u th ca phng phpnhmcc trongcc NNLT
ltacth biu din mi quanh gia ccnh s dng contr.
nh ngha. Con tr (pointer) lmgitr ca nch ramt khc.
Khi v cc cu trc d liu, th hin A lcontr n B, tas s
dng mi tnhng t A n B.
V d: to bin con tr ptr tr n c kiu cho trc, chng
hn celltype, tacth khai bo:
Chap02-18
Trong PASCAL Trong C
var
ptr: ^celltype;
celltype *ptr
A
B
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn loi cc cu trc d liu Phn loi cc cu trc d liu
Trong nhiu ti liu v CTDL thng s dng
phnloi cu trcd liu sauy:
Cu trc d liu c s (Basedatastructures).
V d: trongPascal: integer, char, real, boolean, ...;
trongC: int, char, float, double,...
Cu trc d liu tuyn tnh (Linear datastructures).
V d: Mng (Array), Danhschlinkt (Linkedlist),
Ngn xp (Stack), Hngi (Queue),
Cu trc d liu phi tuyn (Nonlinear datastructures).
V d: Cy (trees), th (graphs), bng bm (hash
tables),...
Chap03-19
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng 3. Cc cu trc d liu c bn Chng 3. Cc cu trc d liu c bn
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-20
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.2. Mng 3.2. Mng
3.2.1. Kiu d liu tru tng mng
3.2.2. Phn b b nh cho mng
3.2.3. Cc thao tc vi mng
Chap03-21
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Mng c nh ngha nh kiu d liu tru tng nh sau:
i tng (object): tp cc cp <index, value>trong vi
mi gitr ca index cmt gitr t tp item. Index ltp c
th t mt chiu haynhiu chiu, chng hn, {0, , n-1}i
vi mt chiu, {(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0),
(2,1), (2,2)}i vi 2chiu, v.v.
Cc hm (Functions):
Vi mi A e Array, i e index, x e item, j, size e integer
Khi to mng:
Array Create(j, list) ::= tr li mng j chiu, trong list l
b j thnh phn vi thnh phn th i l kch thc ca chiu
th i. Item khng c nh ngha.
Kiu d liu tru tng mng
(ADT Array )
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Kiu d liu tru tng mng Kiu d liu tru tng mng (ADT Array ) (ADT Array )
Truy xut phn t: Item Retrieve(A, i)
if (i e index) return itemtng ng vi gitr ch s i trongmng A
else return error
Ct gi phn t: Array Store(A, i, x)
if (i in index) return mng ging ht mng A ngoi tr
cp mi <i, x>c chnvo
else return error
Taxt vic ci t mng trong cc ngn ng lp trnh. Ta
hn ch vic xt mng mt chiu v hai chiu
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cu trc d liu mng Cu trc d liu mng
((Array data structures) Array data structures)
Mng (array) l dy cc thnh phn c nh ch s.
Thng thng mng chim gi mt dy t my lin tip
trongb nh (cchlu tr nyc gi llu tr k tip)
di ca mng c xc nh khi khi to v khng th
thayi.
Mi thnhphn ca mng cmt ch s c nh duynht
Ch s nhn gitr trongkhong t mt cn di n mt
cn trnno
Mi thnhphn ca mng c truyxut nh s dng ch s
ca n
Phptonny c thc hin mt cchhiu qu: vi thi
gianO(1)
Chap02-24
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
25
Mng trong cc ngn ng lp trnh Mng trong cc ngn ng lp trnh
Cc ch s c th ls nguyn (C, J ava) hoc lcc
gitr kiu ri rc (Pascal, Ada)
Cn di l 0 (C, J ava), 1 (Fortran), hoc tu chn
bi ngi lp trnh(Pascal, Ada)
Trong hu ht cc ngn ng, mng l thun nht
(ngha l tt c cc phn t ca mng c cng mt
kiu); trong mt s ngn ng (nh Lisp, Prolog) cc
thnh phn c th l khng thun nht (c cc kiu
khcnhau)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
26
Mng trong cc ngn ng lp trnh Mng trong cc ngn ng lp trnh
Ch : Cngnng (nh PASCAL) thc hin kim trali
vt mng (truy xut n thnh phn vi ch s khng
trongphm vi t cn di n cn trn) vchm dt thc
hin chng trnh nu xy ra li ny. Nhng nhiu ngn
ng khc (C, C++, J AVA) li khng thc hin iu ny.
Trong trng hp xy ra li vt mng, chng trnh c
th tip tc chy, cng c th b dng, tu thuc vo thao
tc truy xut trong tnh hung c th. Nu chng trnh
khngdng th s rt khpht hin li!
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Khai bo mng mt chiu trong PASCAL/C Khai bo mng mt chiu trong PASCAL/C
PASCAL C
<tn bin>:
array[ch _s] of kiu_thnh_phn;
V d: list: array[0..4] of integer
<kiu thnh phn> <tn bin>[size]
V d: int list[5];
Chap03-27
Khai bo trns khai bo bin mng tnnamevi 5phn t
ckiu ls nguyn(2byte).
a ch ca cc phn t trong mng mt chiu
list[0] a ch gc = o
list[1] o +sizeof(int)
list[2] o +2*sizeof(int)
list[3] o +3*sizeof(int)
list[4] o +4*size(int)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d: V d:
Chng trnh trn C sau y a ra a ch ca cc phn t
ca mng mt chiu trn C:
#include <stdio.h>
#include <conio.h>
int main()
{ int one[] = {0, 1, 2, 3, 4};
int *ptr; int rows=5;
/* in a ch ca mng mt chiu nh dng con tr */
int i; ptr= one;
printf("Address Contents\n");
for (i=0; i < rows; i++)
printf("%8u%5d\n", ptr+i, *(ptr+i));
printf("\n");
getch();
}
Chap03-28
Kt qu chy trong TC:
(sizeof(int)=2)
Address Contents
65516 0
65518 1
65520 2
65522 3
65524 4
Kt qu chy trong DEVC
(sizeof(int)=4)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Mng hai chiu Mng hai chiu
Khai bo mng hai chiu trong C:
<element-type><arrayName>[size 1][size2];
V d:
double table[5] [4];
Truy xut n phn t ca mng: table[2] [4];
Khai bo mng hai chiu trong PASCAL:
<arrayName> : array [ch_s1][ch_s2] of <kiu_phn_t>;
V d:
table: array[0..4] [0..5] of real;
Truy xut n phn t ca mng: table[2] [4];
Chap03-29
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn b b nh cho mng hai chiu Phn b b nh cho mng hai chiu
Xt khai bo
int a [4] [3];
Thng thng c th coi n nh mt bng.
Chap03-30
dng 0 a[0,0] a[0,1] a[0,2]
a[1,0] a[1,1] a[1,2]
a[2,0] a[2,1] a[2,2]
a[3,0] a[3,1] a[3,2]
dng 1
dng 2
dng 3
ct 0 ct 1 ct 2
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn b b nh cho mng hai chiu Phn b b nh cho mng hai chiu
Trong b nh (ch c mt chiu) cc hng ca mng hai chiu
c sp xp k tip nhau theo mt trong hai cch sau:
Ht dng ny n dng khc: th t sp xp ny c gi
l th t u tin dng - row major order).
V d: PASCAL v C s dng cch sp xp ny.
Chap03-31
dng 0
a[0][2] a[0][0] a[0][1]
theo chiu tng dn ca a ch b nh
dng 1 dng 2 dng 3
a[1][2] a[1][0] a[1][1]
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn b b nh cho mng hai chiu Phn b b nh cho mng hai chiu
Ht ct ny n ct khc: Th t sp xp ny gi l th
t u tin ct (column major order).
V d FORTRAN, MATLAB s dng cch sp xp ny.
Chap03-32
a[2][0] a[0][0] a[1][0]
theo chiu tng dn ca a ch b nh
a[3][0]
ct 0 ct 1 ct 2
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn b b nh cho mng hai chiu Phn b b nh cho mng hai chiu
Ch : Nu bit a ch ca phn t u tin ca mng, tad
dngtnhc a ch ca phn t tu trongmng.
V d: Xt cch phn b b nh cho bin mng khai bo bi
int a[4] [3];
theo th t u tin dng:
Chap03-33
a[0][2] a[0][0] a[0][1]
theo chiu tng dn ca a ch b nh
dng 0 dng 1 dng 2 dng 3
a[1][2] a[1][0] a[1][1] a[2][2] a[2][0] a[2][1] a[3][2] a[3][0] a[3][1]
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn b b nh cho mng hai chiu Phn b b nh cho mng hai chiu
a ch ca cc phn t trong
mng hai chiu:
int a[4][3]
a[0][0] c a ch l o
a[0][1] o +sizeof(int)
a[0][2] o +2*sizeof(int)
a[1][0] o +3*sizeof(int)
a[1][1] o +4*sizeof(int)
a[1][2] o +5*sizeof(int)
a[2][0] o +6*sizeof(int)
. . .
Chap03-34
Tng qut: Xt khai bo
int a[m][n]
Gi s: a ch ca phn t
u tin ca mng (a[0][0]) l
o.
Khi a ch ca a[i][j] s l
+ (i*n + j)*sizeof(int)
CTDL&TT NGUYN C NGHA B mn KHMT HBK H ni
Cc thao tc vi mng
36
Chn phn t vo mng Chn phn t vo mng
(Inserting (Inserting an element into an an element into an array) array)
Gi s ta mun chn 8 vo mt mng c sp xp (v m bo
dy vn l c sp xp
Ta c th thc hin iu ny nh vic chuyn dch sang phi mt
tt c cc phn t ng sau v tr nh du
Tt nhin, ta phi loi b 30 khi thc hin iu ny
1 3 3 7 12 14 17 19 22 30
Vic dch chuyn tt c cc phn t l mt thao tc chm
(i hi thi gian tuyn tnh i vi kch thc mng)
1 3 3 7 8 12 14 17 19 22
37
Xo b mt phn t Xo b mt phn t
(Deleting (Deleting an element from an an element from an array) array)
Vic xo b (Deleting) mt phn t c thc hin tng
t, taphi dch sangtri tt c ccphn t saun
Php ton xo l php ton chm; vic thc hin thng xuyn
thao tc ny l iu khng mong mun.
Php xo s lm xut hin mt v tr t do cui mng
Chng ta nh du n l t do bng cch no?
Ta cn gi s lng phn t c ct gi trong mng
1 3 3 7 8 12 14 17 19 22
1 3 3 7 12 14 17 19 22 ?
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng 3. Cc cu trc d liu c bn Chng 3. Cc cu trc d liu c bn
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-38
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-39
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch tuyn tnh Danh sch tuyn tnh
nh ngha
Danhschtuyn tnh(Linear List) dygm 0hoc nhiu hn
ccphn t cngkiu chotrc: (a
1
,a
2
,,a
n
), n 0.
a
i
lphn t ca danhsch.
a
1
lphn t u tinva
n
lphn t cui cng.
n l di ca danhsch.
Khi n =0, tacdanhschrng (emptylist).
Cc phn t c sp th t tuyn tnh theo v tr ca chng
trongdanhsch. Tani a
i
i trc a
i+1
, a
i+1
i saua
i
va
i

v tr i.
V d
Danh sch cc sinh vin c sp th t theo tn
Danh sch im thi sp xp theo th t gim dn
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch tuyn tnh Danh sch tuyn tnh
L : danh sch cc i tng c kiu element_type
x : mt i tng kiu element_type
p : kiu v tr
END(L) : hmtr li v tr i sau v tr cui cng trong danh sch L
Chap03-41
a vo k hiu:
Di y ta k ra mt s php ton i vi danh sch tuyn tnh:
0. Creat() Khi to danh sch rng
1. Insert (x, p, L)
Chn x vo v tr p trong danh sch L
Nu p = END(L), chn x vo cui danh sch
Nu L khng c v tr p, kt qu l khng xc nh
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch tuyn tnh: Cc php ton Danh sch tuyn tnh: Cc php ton
2. Locate (x, L)
Tr li v tr ca x trong L
tr li END(L) nu x khng xut hin
3. Retrieve (p, L)
tr li phn t v tr p trong L
khng xc nh nu p khng tn ti hoc p =END(L)
4. Delete (p, L)
xo phn t v tr p trong L . Nu L l a
1
, a
2
, . . . ,a
n
, th L s tr
thnh a
1
, a
2
, . . . , a
p- 1
, a
p+1
, . . . , a
n
.
kt qu l khng xc nh nu L khng c v tr p hoc p =END(L)
5. Next (p, L)
tr li v tr i ngay sau v tr p
Nu p l v tr cui cng trong L, th NEXT(p, L) =END(L). NEXT
khng xc nh nu p l END(L) hoc p khng tn ti.
Chap03-42
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch tuyn tnh: Cc php ton Danh sch tuyn tnh: Cc php ton
6. Prev (p, L)
tr li v tr trc p
Prev l khng xc nh nu p l 1 hoc nu L khng c v tr
p.
7. Makenull (L)
hm ny bin L tr thnh danh sch rng v tr li v tr
END(L)
8. First (L)
tr li v tr u tin trong L. Nu L l rng hm ny tr li
END(L).
9. Printlist (L)
In ra danh sch cc phn t ca L theo th t xut hin.
Chap03-43
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-44
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3.2. Cc cch ci t danh sch tuyn tnh 3.3.2. Cc cch ci t danh sch tuyn tnh
(Implementations of Linear List) (Implementations of Linear List)
Dngmng (Array-based)
Ct gi ccphn t ca danhschvocclintip ca mng
Danhschlinkt (Linkedlist / Pointer-based)
Cc phn t ca danh sch c th ct gi cc ch tu trong b
nh.
Mi phn t ccontr (hoc mcni - link) n phn t tip theo
a ch khngtrc tip (Indirect addressing)
Ccphn t ca danhschcth ct gi ccch tu trongb nh
To bng trong phn t th i ca bng chobit ni lu tr phn t
th i ca danhsch
Mphng contr (Simulatedpointer)
Tng t nh biu din lin kt nhng cc s nguync thay bi
contr ca C++
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-46
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3.2.1. Biu din di dng mng 3.3.2.1. Biu din di dng mng
(Array (Array--based based Representation of Linear Representation of Linear List) List)
Tact gi cc phn t ca danh sch tuyn tnh vo cc (lin
tip) ca mng (array).
Danhschs lcu trcgm hai thnhphn.
Thnhphn 1: lmng ccphn t
Thnh phn 2 : last - cho bit v tr ca phn t cui cng
trongdanhsch
V tr c kiu nguyn (integer) v chy trong khong t 0 n
maxlength-1. HmEND(L) tr li gitr last+1.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Biu din di dng mng Biu din di dng mng -- CC
(Array (Array--based based Representation of Linear Representation of Linear List) List)
# define maxlength 1000
typedef int elementtype; /* elements are integers */
typedef struct list_tag {
elementtype elements [maxlength];
int last;
} list_type;
Hm End(L)
int end (list_type *lp)
{
return (lp->last +1)
}
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t Insert Ci t Insert
Insert (x, p,L): Chnx vo v tr p trong danh sch
void insert (elementtype x , int p , list_type * lp)
{ int v; // running position
if (lp -> last >= maxlength - 1)
{ printf("\n%s ","list is full");
return;
}
if ((p < 0) || (p > lp -> last + 1))
{ printf("\n%s ","position does not exist");
return;
}
else {
for (int q = lp -> last; q <= p; q--)
lp -> elements [q+1] = lp -> elements [q];
lp -> last = lp -> last +1 ;
lp -> elements[p] = x;
}
}
Chap03-49
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t DELETE Ci t DELETE
Delete (p, L): loi phn t v tr p trong danh sch L
void deleteL(int p , list_type * lp)
{
int q; /* running position */
if ((p > lp-> last) || (p < 0))
{ printf("\n%s ","position does not exist");
return;
}
else /* shift elements */ {
lp -> last --;
for (int q = p; q <= lp ->last; q++)
lp -> elements [q] = lp -> elements [q+1];
}
}
Chap03-50
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t LOCATE Ci t LOCATE
Locate (x, L): tr li v tr ca x trong danh sch L
int locate (elementtype x , list_type * lp)
{
int q;
for (q = 0; q <= lp ->last; q++)
if (lp -> elements [q] == x)
return (q);
return (lp -> last + 1); /* if not found */
}
Chap03-51
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-52
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn tch cch biu din di dng mng Phn tch cch biu din di dng mng
(Array (Array--based based Representation of Linear Representation of Linear List) List)
Cth nhn thy mt s u - khuyt im sauy ca cch
t chc lu tr ny:
Cchbiu din nyrt tin chovic truyxut n ccphn t
ca danhsch.
Do danh sch l bin ng, s phn t trong danh sch l
khngbit trc. Nntathng phi khai bokchthc ti
a cho mng d phng (maxlength). iu ny dn n
lngph b nh.
Cc thao tc chnmt phn t vo danhschvxob mt
phn t khi danh sch c thc hin chm (vi thi gian
tuyn tnhi vi kchthc danhsch)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Lu tr mc ni i vi danh sch tuyn tnh Lu tr mc ni i vi danh sch tuyn tnh
((Linked List) Linked List)
Lu tr k tip cnhng nhc im c bn c phn
tch trn: lvic b sungvloi tr phn t lrt tn
kmthi gian, ngoi raphi k n vic s dng mt khng
gianlintc trongb nh. Vic t chc contr (hoc mc
ni) t chc danh sch tuyn tnh - m ta gi l danh
sch mc ni l gii php khc phc nhc im ny, tuy
nhinci gimtaphi tr lb nh dnhchocontr.
Tas xtccccht chc danhschmcni sauy:
Danhschni n (Singlylinkedlist)
Danhschni vng(Circularylinkedlist)
Danh sch ni i (Doubly Linked List)
Chap03-54
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Khi no dng danh sch mc ni Khi no dng danh sch mc ni
Khi khng bit kch thc ca d liu - hy dng
con tr v b nh ng (Unknown data size use
pointers & dynamic storage).
Khi khng bit kiu d liu - hy dng con tr
void (Unknown data type use void pointers).
Khi khng bit s lng d liu - hy dng danh
sch mc ni (Unknown number of data linked
structure).
Chap03-55
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
(Singly linked list) (Singly linked list)
Trong cch biu din ny, danh sch bao gm cc (cc nt -
node), mi cha mt phn t ca danhsch vcon tr n
tip theoca danhsch.
Nu danhschla
1
, a
2
, . . . , a
n
, th lu tr a
i
ccon tr (mi
ni) n lu tr a
i+1
vi i =1, 2, . . . , n-1. lu tr a
n
ccon
tr rng, mtas khiu lnil. Nh vy mi ccu trc:
C mt c bit gi l header tr ra cha phn t u
tintrongdanhsch(a
1
); header khnglu tr phn t noc.
Trong trng hp danh sch rng, con tr ca header lnil, v
khngcnokhc.
Cccth nm v tr bt k trongb nh
Chap03-56
Element Link/Pointer
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
(Singly linked list) (Singly linked list)
Danh sch mc ni c t chc nh trong hnh v sau:
Mi ni ch ra a ch b nh ca nt tip theo trong danh sch
Chap03-57
header
3000 10 5000 8 2000 50 NULL
3000 5000 2000
a ch b nh
a
1
a
2
a
n
. . .
nil
header
list
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
(Singly linked list) (Singly linked list)
M t danh sch ni n trong PASCAL:
Type
DataType = ... {kiu ca d liu}
PointerType = ^Node;
Node = record
Inf: DataType; {lu tr phn t}
Next: PointerType; {tr n nt k tip}
end;
LIST = PointerType; { kiu LIST m t danh sch }
Khai bo trn nh ngha kiu PointerType tr ti Node, trong
Node l kiu bn ghi m t mt nt gm hai trng:
Inf - lu d liu c kiu l DataType c nh ngha, c th gm
nhiu thnh phn
Next thuc kiu PointerType, lu a ch ca nt k tip.
Cn c bin First thuc kiu PointerType lu a ch ca nt u
tin trong danh sch:
Var First: PointerType;
Chap03-58
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
((Singly linked list) Singly linked list)
M t danh sch ni n trong C:
typedef <Kiu d liu phn t> ElementType;
struct NodeType{
ElementType Inf;
NodeType *Next; };
typedef struct NodeType LIST;
Khai bo trn nh ngha kiu NodeType, trong NodeType l
kiu bn ghi m t mt nt gm hai trng:
Inf - lu d liu c kiu l ElementType ( c nh ngha, c
th gm nhiu thnh phn)
Next thuc kiu NodeType, lu a ch ca nt k tip.
Cn c bin con tr First lu a ch ca nt u tin trong danh
sch:
NodeType *First;
Chap03-59
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm END(L) Hm END(L)
function END ( L: LIST ): PointerType;
{ END tr li con tr n cui cng ca L }
var q: PointerType;
begin
q :=L;
while q^.next <>nil do
q :=q^.next;
return (q)
end;
Ch :
Hm ny lm vic khng hiu qu v n phi duyt qua ton b danh sch.
Nu nh thng xuyn phi dng n hm ny ngi ta thng to thm
mt con tr tr n v tr cui cng ca danh sch.
Chap03-60
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p) Hm INSERT(x,p)
Gi s cn chn mt phn t c ni dung d liu lx (c kiu
ElementType) vo danh sch. V tr cn chn c xc nh l
saunt c tr bi contr Pred. Thaotc c tin hnhtheo
ccbc:
(1) Xincp pht mt nt mi chocontr TempNode lu
x,
Ni nt nyvodanhschti v tr cn chn:
(2) TempNode->Next bng Pred->Next
(3) ghi nhn li Pred->Next bng TempNode.
Chap03-61
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p) Hm INSERT(x,p)
S ca thao tc cn lm vi danh sch c minh ho nh sau:
Ch :
Vic chnmt nt khngnh hng n mi linkt ca ccnt ng sau
v tr chn, do khng phi thc hin dn phn t nh trong ci t
mng.
Chap03-62
(1) TempPtr
(3) (2)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p): Ci t trn C Hm INSERT(x,p): Ci t trn C
NodeType *Insert_Middle(NodeType *Pred, ElementType X)
{ Chn mt nt mi vi thng tin X vo sau nt c tr bi Pred }
{ NodeType *TempNode;
TempNode = (NodeType *) malloc(sizeof(NodeType)); //(1)
TempNode->Inf=X; //(1)
TempNode->Next=Pred->Next; //(2)
Pred->Next=TempNode; //(3)
return TempNode;
}
Chap03-63
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p) Hm INSERT(x,p)
64
0x2000
TempPtr
0x3050
0x3080
Pred 0x3080
First
New(TempPtr); { xin cp pht nt mi }
TempPtr^.Inf := x; { ghi nhn d liu }
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p) Hm INSERT(x,p)
65
0x2000
TempPtr
0x3050
0x3080
Pred 0x3080
First
TempPtr^.Next := Pred^.Next;
Danh sch mc ni n Danh sch mc ni n
Hm INSERT(x,p) Hm INSERT(x,p)
66
0x2000
TempPtr
0x3050
0x3080
Pred 0x3080
First
Pred^.Next := TempPtr;
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm DELETE(p) Hm DELETE(p)
Gi s cn loi b nt ng sau nt ang c tr bi
Pred. Vic xo ch tin hnh khi danh sch l khc rng
(Cn phi kim traiu kin ny trc khi thc hin thao
tcxo).
S dng contr TempPtr ghi nhn nt cn xa, thaotc
xoc tin hnhtheoccbc sau:
(1) GnTempPtr bng Pred->Next.
(2) t li Pred->Next bng TempPtr->Next.
(3) Thuhi vngnh c tr bi TempPtr.
Chap03-67
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm DELETE(p) Hm DELETE(p)
S ca thao tc cn lm vi danh sch c minh ho
trong hnh di y:
Chap03-68
(1) TempPtr
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni n Danh sch mc ni n
Hm DELETE(p): Ci t trn C Hm DELETE(p): Ci t trn C
ElementType Delete(NodeType *Pred)
{ Xo nt sau nt c tr bi Pred v tr li gi tr nt b xo }
{ ElementType X; NodeType *TempNode;
TempNode=Pred->Next; //(1)
Pred->Next=Pred->Next->Next; //(2)
X=TempNode->Inf;
free(TempNode); //(3)
return X;
}
Chap03-69
Pred
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t mt s thao tc thng dng khc Ci t mt s thao tc thng dng khc
Chn mt nt vo u danh sch
Chn mt nt vo cui danh sch
Xo nt u danh sch
Xo nt cui danh sch
Kim tra danh sch rng
Hu danh sch
Chap03-70
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chn vo u danh sch Chn vo u danh sch
Procedure ChenVaoDau(Var First : LIST; X : DataType);
{ Chn mt nt vo u danh sch c tr bi First }
Var TempPtr : PointerType;
Begin
New(TempPtr);
TempPtr^.Inf :=X;
TempPtr^.Next :=First;
First :=TempPtr;
End;
Chap03-71
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chn vo cui danh sch Chn vo cui danh sch
Procedure ChenVaoCuoi(Var First : LIST; X : DataType);
{ Chn mt nt vo cui danh sch c tr bi First. Gi s danh sch khc rng }
Var TempPtr, prev, cur : PointerType;
Begin
New(TempPtr); TempPtr^.Inf := X; (* To nt mi cha X *)
prev :=nil; {khi to con tr prev v cur.}
cur :=First;
while (cur <>nil) do {Ln n nt cui danh sch}
begin
prev :=cur; cur :=prev^.next;
end;
TempPtr^.next := cur; {ni nt mi vo cui danh sch }
prev^.next :=TempPtr;
End;
Chap03-72
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Xo phn t u danh sch Xo phn t u danh sch
Procedure XoaDau(Var First : LIST; Var X : DataType);
{ Xo nt u danh sch c tr bi First }
Var TempPtr : PointerType;
Begin
TempPtr :=First;
First :=First^.Next;
X := TempPtr^.Inf; { Ct ni dung ca nt ra X }
Dispose(TempPtr);
End;
Chap03-73
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Xo phn t cui danh sch Xo phn t cui danh sch
procedure DeleteLast (First: LIST; X: DataType);
(* Xo nt cui ca danh sch. Gi s danh sch khc rng *)
var cur, prev: PointerType;
begin
cur := First; {khi to con tr prev v cur.}
prev :=nil;
while (cur^.next <>nil) do {lp n khi cur ch n nt cui danh sch}
begin prev :=cur; cur :=prev^.next; end;
X:= cur^.Inf; { tr li X nt cui }
prev^.next :=nil; { t set the LINK portion of the node pointed by prev}
dispose(cur); { thu hi vng nh cp cho nt cui }
end;
Chap03-74
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Tm kim Tm kim
{Tm kim trn danh sch mc ni c tr bi First. Nu gi tr e c trong danh
sch th cur s ch ra nt v khi prev s ch ra nt i trc. }
procedure Search (First: LIST; var cur, prev: PointerType; e: DataType);
begin
cur :=First; {initialization}
prev :=nil;
while ( cur^.Inf <>e) and (cur^.next <>nil) do
begin prev :=cur;
cur :=cur^.next
end;
end;
Chap03-75
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
IsEmpty v PrintLIST IsEmpty v PrintLIST
{ Hm kim tra danh sch rng }
Function IsEmpty(First : LIST) : Boolean;
Begin
IsEmpty := First = Nil
End;
{a ra ton b thng tin cc nt }
Procedure PrintLIST(First : LIST);
Var TempPtr : U;
Begin
TempPtr := First;
While TempPtr <> Nil Do
Begin
< Print(TempPtr^.Inf )> { a ra ni dung ca nt }
TempPtr := TempPtr^.Next
End;
End;
Chap03-76
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t trn C Ci t trn C
Chap03-77
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chn vo u danh sch Chn vo u danh sch
// Chn mt nt vo u danh sch c tr bi First
NodeType *Insert_ToHead(NodeType *First, ElementType X)
{ NodeType *TempNode;
TempNode = (NodeType *) malloc(sizeof(NodeType));
TempNode->Inf=X; TempNode->Next=First;
First=TempNode;
return First;
}
Chap03-78
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chn vo cui danh sch Chn vo cui danh sch
// Chn mt nt vo cui danh sch c tr bi head. Gi s danh sch khc rng
NodeType *Insert_ToLast(NodeType *head, ElementType X)
{ NodeType *NewNode; NodeType *TempNode;
NewNode = (NodeType *) malloc(sizeof(NodeType));
NewNode->Inf=X; TempNode=head;
while (TempNode->next != NULL) // go to the end of a list
TempNode= TempNode->next;
TempNode->next = NewNode;
return head;
}
Ch : Nu thao tc ny phi thc hin thng xuyn th nn a vo con tr
Last tr n nt cui cng ca danh sch
Chap03-79
head
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Xo phn t u danh sch Xo phn t u danh sch
// Xo nt u danh sch c tr bi First
NodeType *Delete_Head(NodeType *First)
{ NodeType *TempNode;
TempNode=First->Next;
free(First);
return TempNode;
}
Chap03-80
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Xo phn t cui danh sch Xo phn t cui danh sch
// Xo nt cui ca danh sch. Gi s danh sch khc rng
NodeType *Delete_Last(NodeType *First)
{ NodeType *TempNode1, *TempNode2;
TempNode1= First; TempNode2= First;
while (TempNode1->next != NULL) // Go to the end of a list
{ TempNode2 = TempNode1;
TempNode1= TempNode1->next; }
TempNode2->next = NULL;
free(TempNode1);
return First;
}
Ch : Nu thao tc ny phi thc hin thng xuyn th nn a vo con tr
Last tr n nt cui cng ca danh sch
Chap03-81
First
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Tm kim Tm kim
Tm kim trn danh sch mc ni c tr bi head, tr li
con tr n nt cha gi tr e.
NodeType *Search(NodeType *head, ElementType e)
{
while (head->inf != e) head=head->next);
return head;
}
Chap03-82
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
IsEmpty v PrintLIST IsEmpty v PrintLIST
Hm kim tra danh sch rng
int IsEmpty(NodeType *head){
return !head;
}
Hu danh sch
NodeType *MakeNull(NodeType *head){
while (!IsEmpty(head)) head=Delete_Head(head);
return head;
}
a ra ton b thng tin cc nt
void Print(NodeType *head)
{ NodeType *TempNode;
TempNode=head; int count = 0;
while (TempNode) {
printf("%6d", TempNode->Inf); count++;
TempNode=TempNode->Next;
if (count % 12 == 0) printf("\n");
}
printf("\n");
}
Chap03-83
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. Chng trnh minh ho trn C V d 1. Chng trnh minh ho trn C
Xydng chng trnhthc hin cngvic sauy:
To ngu nhin mt danh sch vi cc phn t l cc s
nguyn. Sau:
T danh sch to c xy dng hai danh sch: mt danh
schcha tt c cc s dng cn danhsch kiacha tt c
ccs mca danhschbanu.
Chng trnh di y s xy dng mt s php ton c
bn i vi danh sch mc ni thc hin cc cngvic
t ra.
Chap03-84
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. Chng trnh trn C V d 1. Chng trnh trn C
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef long ElementType;
struct PointerType{
ElementType Inf;
PointerType *Next; };
PointerType *Insert_ToHead(PointerType *First,
ElementType X)
{ PointerType *TempNode;
TempNode = (PointerType *) malloc(sizeof(PointerType));
TempNode->Inf=X; TempNode->Next=First;
First=TempNode;
return First;
}
Chap03-85
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. V d 1.
PointerType *Insert_Middle(PointerType *Pred, ElementType X)
{ PointerType *TempNode;
TempNode = (PointerType *) malloc(sizeof(PointerType));
TempNode->Inf=X;
TempNode->Next=Pred->Next;
Pred->Next=TempNode;
return TempNode;
}
Chap03-86
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. V d 1.
PointerType *Delete_Head(PointerType *First)
{ PointerType *TempNode;
TempNode=First->Next;
free(First);
return TempNode;
}
ElementType Delete(PointerType *Pred)
{ ElementType X;
PointerType *TempNode;
TempNode=Pred->Next;
Pred->Next=Pred->Next->Next;
X=TempNode->Inf; free(TempNode);
return X;
}
Chap03-87
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. V d 1.
void Print(PointerType *First)
{ PointerType *TempNode;
TempNode=First; int count = 0;
while (TempNode) {
printf("%6d", TempNode->Inf); count++;
TempNode=TempNode->Next;
if (count % 12 == 0) printf("\n");
} printf("\n");
}
int IsEmpty(PointerType *First) {
return !First;
}
PointerType *MakeNull(PointerType *First) {
while (!IsEmpty(First)) First=Delete_Head(First);
return First;
}
Chap03-88
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. V d 1.
int main() {
PointerType *S1, *S2, *S3, *V1, *V2, *V3;
ElementType a; int i, n;
clrscr(); randomize(); S1=NULL;
// Tao phan tu dau tien
a=-100+random(201);
S1=Insert_ToHead(S1, a);
printf("Nhap vao so luong phan tu n = ");
scanf("%i", &n); printf("\n");
// Tao ngau nhien danh sach va dua ra man hinh
V1=S1;
for (i=2; i<=n; i++) {
a=-100+random(201);
V1=Insert_Middle(V1, a);
}
printf("====> Danh sach ban dau: \n"); Print(S1);
printf("\n");
Chap03-89
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. V d 1.
V1 = S1; S2 = NULL; S3 = NULL;
while (V1) {
if (V1->Inf > 0)
if (!S2) { S2=Insert_ToHead(S2, V1->Inf); V2 = S2; }
else { Insert_Middle(V2, V1->Inf); V2 = V2->Next; }
if (V1->Inf < 0)
if (!S3) { S3=Insert_ToHead(S3, V1->Inf); V3 = S3;}
else { Insert_Middle(V3, V1->Inf); V3 = V3->Next;}
V1= V1->Next;
}
printf("====> Danh sach so duong: \n"); Print(S2);
printf("\n");
printf("====> Danh sach so am: \n"); Print(S3);
printf("\n");
S1=MakeNull(S1); S2=MakeNull(S2); S3=MakeNull(S3);
getchar(); getchar();
}
Chap03-90
V d 2. V d 2.
#include <stdio.h>
#include <stdlib.h>
struct node
{ int data;
struct node *next;
};
typedef struct node node;
void printlist(node* head);
int main()
{ node a, b, c;
node* pcurr;
node* phead;
node* pnew; node* pdel;
int i;
/*** A: Static Memory Allocation ***/
printf("Static Memory Allocation:\n");
/* initialise nodes */
a.data =1;
b.data =2;
c.data =3;
a.next =b.next =c.next =NULL;
/* link to form list a - b - c */
a.next =&b; b.next =&c;
printlist(&a);
91
V d (tip) V d (tip)
/*** B: Dynamic Memory Allocation ***/
printf("\n\nDynamic Memory Allocation:\n");
/* To nt u tin vi d liu = 10 */
if ((phead =(node*)malloc(sizeof(node))) ==
NULL)
exit(1); // li phn b b nh
phead->data =10;
pcurr =phead; // khi to con tr n nt u tin
/* To tip 5 nt, vi d liu = 20, 30, ... */
for (i=20; i<=60; i+=10)
{ // phn b b nh
if ((pnew =(node*)malloc(sizeof(node))) ==
NULL)
exit(1); // li phn b b nh
// to d liu
pnew->data =i;
// ni nt hin ti vi nt mi,
// v t nt mi thnh nt hin ti
pcurr->next =pnew;
pcurr =pnew;
}
/* phn t cui LIST c next l NULL */
/* Ch l pcurr tr n nt cui ca danh sch */
pcurr->next =NULL;
/* Ta c th in danh sch */
printlist(phead);
/*** C: Insert v Delete Nodes ***/
printf("\n\nInsert and Delete Nodes:\n");
/* Insert a new node (data = 100) after the third one */
// To v gn gi tr nt mi
if ((pnew =(node*)malloc(sizeof(node)))==
NULL)
exit(1);
pnew->data =100;
92
V d (tip) V d (tip)
// Lm nt hin ti tr thnh nt m ta s chn vo sau n
pcurr =phead->next->next;
//Bt nt mi tr n nt c tr bi nt hin ti
pnew->next =pcurr->next;
// t nt hin ti tr n nt mi
pcurr->next =pnew;
/* Loi b nt th hai*/
// Lm nt hin ti tr thnh nt ng trc nt cn xo
pcurr =phead;
pdel =pcurr->next;
// Loi nt bi vic b qua n
pcurr->next =pcurr->next->next;
// Gii phng b nh ca nt b b qua
free(pdel);
/* Li a ra danh sch */
printlist(phead);
return 0;
}
void printlist(node* head)
{
/* duyt qua danh sch, a ra d liu ca mi nt */
node* curr =head; // start at head
while (curr !=NULL)
{
printf(" D liu ca nt hin ti: %d\n", curr-
>data);
curr =curr->next;
}
getchar();
}
93
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-94
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch ni i Danh sch ni i
(Doubly linked list) (Doubly linked list)
Trong nhiu ng dng ta mun duyt danh sch theo c hai
chiu mt cch hiu qa. Hoc cho mt phn t, ta cn xc
nh c phn t i trc ln phn t i saun trongdanhsch
mt cchnhanhchng.
Trongtnhhung nh vy tac th gncho mi trongdanh
schcontr n c phn t i trc ln phn t i sauntrong
danhsch.
Cch t chc ny c gi l danh sch ni i.
Chap03-95
Node* next Item value
Node* prev
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch ni i Danh sch ni i
(Doubly linked list) (Doubly linked list)
Cch t chc danh sch ni i c minh ho trong hnh v sau:
C hai nt c bit: tail (ui) v head (u)
head c con tr tri prev l null
tail c con tr phi next l null
Cc php ton c bn c xt tng t nh danh sch ni n.
Chap03-96
tail
head nodes/positions
elements
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch ni i Danh sch ni i
(Doubly linked list) (Doubly linked list)
Cch m t danh sch ni i trn C:
struct dllist {
int number;
struct dllist *next;
struct dllist *prev;
};
struct dllist *head, *tail;
Chap03-97
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Php ton chn (Insertion) Php ton chn (Insertion)
Ta m t php ton chn insertAfter(p, X)
A B X C
A B C
p
A B C
p
X
q
p q
Chn sau prevPtr: Chn sau prevPtr: Insert(X,prevPtr) Insert(X,prevPtr)
0x4000 0x3080
0x2030
0x2000
0x4000
0x3080
0x3080 0x2030
NULL
NULL
NULL
NULL
0x2000 prevPtr
0x3080
head
newNodePtr
X
Chn sau prevPtr: Chn sau prevPtr: Insert(X,prevPtr) Insert(X,prevPtr)
0x4000 0x3080
0x2030
0x2000
0x4000
0x3080
0x3080 0x2030
NULL
NULL
0x2030
NULL
0x2000 prevPtr
0x3080
head
newNodePtr
X
Chn sau prevPtr: Chn sau prevPtr: Insert(X,prevPtr) Insert(X,prevPtr)
0x4000 0x3080
0x2030
0x2000
0x4000
0x3080
0x3080 0x2030
NULL
NULL
0x2030
0x3080
0x2000 prevPtr
0x3080
head
newNodePtr
X
Chn sau Chn sau prevPtr: prevPtr:Insert(X,prevPtr) Insert(X,prevPtr)
0x4000 0x3080
0x2030
0x2000
0x4000
0x2000
0x3080 0x2030
NULL
NULL
0x2030
0x3080
0x2000 prevPtr
0x3080
head
newNodePtr
X
Chn sau prevPtr: Chn sau prevPtr: Insert(X,prevPtr) Insert(X,prevPtr)
0x4000 0x3080
0x2030
0x2000
0x4000
0x2000
0x3080 0x2000
NULL
NULL
0x2030
0x3080
0x2000 prevPtr
0x3080
head
newNodePtr
X
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Php ton Xo (Deletion) Php ton Xo (Deletion)
Ta m t php ton remove(p), trong p =last()
A B C D
p
A B C
D
p
A B C
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh trn C minh ho mt s php ton Chng trnh trn C minh ho mt s php ton
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct dllist {
int number;
struct dllist *next;
struct dllist *prev;
};
struct dllist *head, *tail;
/* Ni ui mt phn t mi */
void append_node(struct dllist *lnode);
/* Chn mt phn t mi vo sau tr bi after */
void insert_node(struct dllist *lnode, struct dllist *after);
/* Xo tr bi lnode */
void remove_node(struct dllist *lnode);
105
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh minh ho trn C Chng trnh minh ho trn C
int main(void) {
struct dllist *lnode; int i = 0;
/* add some numbers to the double linked list */
for(i = 0; i <= 5; i++) {
lnode = (struct dllist *)malloc(sizeof(struct dllist));
lnode->number = i;
append_node(lnode);
}
/* print the dll list forward */
printf(" Traverse the dll list forward \n");
for(lnode = head; lnode != NULL; lnode = lnode->next)
{ printf("%d\n", lnode->number); }
/* print the dll list backward */
printf(" Traverse the dll list backward \n");
for(lnode = tail; lnode != NULL; lnode = lnode->prev)
{ printf("%d\n", lnode->number); }
106
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh minh ho trn C Chng trnh minh ho trn C
/* destroy the dll list */
while(head != NULL)
remove_node(head);
getch(); /* Wait for ...*/
return 0;
}
void append_node(struct dllist *lnode) {
if(head == NULL) {
head = lnode;
lnode->prev = NULL; }
else {
tail->next = lnode;
lnode->prev = tail;
}
tail = lnode;
lnode->next = NULL;
}
107
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh minh ho trn C Chng trnh minh ho trn C
void insert_node(struct dllist *lnode, struct dllist *after) {
lnode->next = after->next;
lnode->prev = after;
if(after->next != NULL)
after->next->prev = lnode;
else
tail = lnode;
after->next = lnode;
}
void remove_node(struct dllist *lnode) {
if(lnode->prev == NULL)
head = lnode->next;
else lnode->prev->next = lnode->next;
if(lnode->next == NULL)
tail = lnode->prev;
else lnode->next->prev = lnode->prev;
}
108
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-109
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 1. The V d 1. The Josephus Problem Josephus Problem
n khch hng tham gia vo vng quay trng thng ca Cng ty X.
Cc khch hng c xp thnh mt vng trn.
Gim c Cng ty la chn ngu nhin mt s m (m s n).
Bt u t mt ngi c chn ngu nhin trong s cc khch
hng, Gimc m theo chiu kimng h vdng li mi khi
m n m.
Khch hng v tr ny s di khi cuc chi.
Qu trnh c lp li cho n khi ch cn mt ngi.
Ngi cui cng cn li l ngi trng thng!
V d V d
n = 10
1
2
3
4
5
6
7
8
9
10
m = 5
Ngi thng cuc!
C th gii bi ton ny nh danh sch ni i
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton gii Josephus Thut ton gii Josephus Problem Problem
void josephus(int n, int m){
// Khai bo danh sch ni kp
struct dllist { int number;
struct dllist *next; struct dllist *prev;};
struct dllist *dList, *curr;
int i, j;
// khi to danh sch gm cc khch hng 1 2 3 ... n
for (i = 1; i <= n; i++)
insert(dList, i); // Phi xy dng hm ny
// khi ng vng m bt u t ngi 1
curr = dList->next;
// thc hin vng m loi tt c ch li 1 ngi trong danh sch
for (i=1; i < n; i++) {
// m bt u t ngi hin ti curr, i qua m ngi.
// ta phi thc hin iu ny m-1 ln.
for (j=1; j <= m-1; j++)
{ // con tr k tip
curr = curr->next;
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton Thut ton ((continued continued))
// nu curr dng ti header, cn thc hin di chuyn tip
if (curr == dList)
curr = curr->next;
}
printf("Xoa khach hang %i \n", curr->nodeValue);
// trin khai tip curr v xo nt ti im dng
curr = curr->next;
erase(curr->prev); // Phi xy dng hm ny
// c th loi b nt cui danh sch, v th curr phi tr v head v tip tc
if (curr == dList) curr = curr->next;
}
printf("\n Khach hang %i la nguoi thang cuoc\n",curr->nodeValue);
// xo b nt cui cng v u danh sch
delete curr; delete dList;
}
Chng trnh chnh Chng trnh chnh
void main()
{
// n - s lng ngi chi
// m - l s cn m
int n, m;
printf("Nhap vao n = ");
scanf("%i",n); printf("\n");
// to ngu nhin s m: 1<=m<=n
m = 1 + random(n);
printf(" m = %i",m);
// gii bi ton v a ra ngi thng
josephus(n, m);
}
Nhap vao n = 10
m = 5
Xo khch hng 5
Xo khch hng 10
Xo khch hng 6
Xo khch hng 2
Xo khch hng 9
Xo khch hng 8
Xo khch hng 1
Xo khch hng 4
Xo khch hng 7
Khach hang 3 la nguoi thang.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d 2. Biu din a thc V d 2. Biu din a thc
Xt a thc
P(x) =a
0
+a
1
x +a
2
x
2
+....+a
n
x
n
biu din a thc n gin nht ldngmng a[i] ct gi h
s ca x
i
. Cc phptonvi cc a thc nh: Cng hai a thc,
Nhn hai a thc, ..., khi cc a thc c biu din bi mng,
cth ci t mt cchn gin.
Tuy nhinkhi a thc vi nhiu h s bng 0cchbiu din a
thc di dng mng l tn kmb nh, chng hn, vic biu
din a thc x
1000
- 1i hi mng gm 1001phn t.
Trongtrng hp a thc tha (cnhiu h s bng 0) cth s
dng biu din a thc bi danh sch mc ni: Tas xy dng
danhschch cha cch s khckhngcngs m tng ng.
Tuynhin, khi vic ci t ccphptonli phc tp hn.
115
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Biu din a thc Biu din a thc
V d: C th s dng khai bo sau y khai bo danh
schmcni ca hai a thc Poly1vPoly2
struct Polynom {
int coeff;
int pow;
struct Polynom *link;
} *Poly1, *Poly2
Vic ci t phpcng hai a thc Poly1vPoly2i hi
taphi duyt quahai danhschmc ni ca chng tnh
h s ca a thc tng PolySum(cng c biu din bi
danhschmcni).
y lbi tp tt luyn tp ci t cc thaotc vi danh
schmcni.
116
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton tnh tng hai a thc Thut ton tnh tng hai a thc
Thut ton SumTwoPol
node=(TPol *)malloc (sizeof(TPol));
PolySum=node;
ptr1=Poly1; ptr2=Poly2;
while(ptr1!=NULL && ptr2!=NULL){
ptr=node;
if (ptr1->pow > ptr2->pow ) {
node->coeff=ptr2->coeff;
node->pow=ptr2->pow;
ptr2=ptr2->link; //update ptr list 2
}
else if ( ptr1->pow < ptr2->pow )
{
node->coeff=ptr1->coeff;
node->pow=ptr1->pow;
ptr1=ptr1->link; //update ptr list 1
}
Chap03-117
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton tnh tng hai a thc (tip) Thut ton tnh tng hai a thc (tip)
else
{ node->coeff=ptr2->coeff+ptr1->coeff;
node->pow=ptr2->pow;
ptr1=ptr1->link; //update ptr list 1
ptr2=ptr2->link; //update ptr list 2
}
node=(TPol *)malloc (sizeof(TPol));
ptr->link=node; //update ptr list 3
} //end of while
if (ptr1==NULL) //end of list 1
{ while(ptr2!=NULL){
node->coeff=ptr2->coeff; node->pow=ptr2->pow;
ptr2=ptr2->link; //update ptr list 2
ptr=node; node=(TPol *)malloc (sizeof(TPol));
ptr->link=node; } //update ptr list 3
}
Chap03-118
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton tnh tng hai a thc (tip) Thut ton tnh tng hai a thc (tip)
else if (ptr2==NULL) //end of list 2
{
while(ptr1!=NULL) {
node->coeff=ptr1->coeff;
node->pow=ptr1->pow;
ptr1=ptr1->link; //update ptr list 2
ptr=node;
node=(TPol *)malloc (sizeof(TPol));
ptr->link=node; //update ptr list 3
}
}
node=NULL;
ptr->link=node;
}
Chap03-119
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-120
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Phn tch s dng linked list Phn tch s dng linked list
Nhng u im ca vic dnglinkedlists:
Khngxy ravt mng, ngoi tr ht b nh.
ChnvXoc thc hin d dnghn lci t mng.
Vi nhng bn ghi ln, thc hin di chuyn contr lnhanh
hn nhiu so vi thc hin di chuyn cc phn t ca danh
sch.
Nhng bt li khi s dng linkedlists:
Dngcontr i hi b nh ph.
Linkedlistskhngchophptrc truy.
Tn thi gianchovic duyt vbin i contr.
Lp trnhvi contr lkh rc ri.
Chap03-121
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
So snh cc phng php So snh cc phng php
Vic la chn cchci t mng hay ci t contr biu din danh
sch l tu thuc vo vic thao tc no l thao tc thng phi dng
nht. Di y lmt s nhn xt v hai cchci t:
Cch ci t mng phi khai bo kch thc ti a. Nu ta khng
lng trc c gitr nyth nndngci t contr.
Cmt s thaotccth thc hin nhanhtrongcchnynhng li
chm trongcchci t kia: INSERT vDELETE i hi thi gian
hng s trongci t contr nhng trongci t mng i hi thi
gianO(N) vi N ls phn t ca danhsch. PREVIOUS vEND
i hi thi gianhng s trongci t mng, nhng thi gian l
O(N) trongci t contr.
Cch ci t mng i hi dnh khng gian nh nh trc khng
ph thuc vo s phn t thc t ca danh sch. Trong khi ci
t contr ch i hi b nh cho cc phn t ang c trongdanh
sch. Tuy nhin cch ci t con tr li i hi thmb nh cho
contr.
Chap03-122
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Tm tt hai cch biu din bi con tr Tm tt hai cch biu din bi con tr
Trong cch biu din Singly-linked list hoc doubly-linked list, cho d bng
cch no header v tail ch l cc con tr n nt u tin v nt cui cng,
chng khng l nt.
Singly linked list:
Doubly linked list:
previous
Item
next
previous
Item
next
previous
Item
next
previous
Item
next
NULL
First/head
NULL
last/tail
NULL
inf
next
inf
next
inf
next
inf
next
last/tail
First/head
NT
NT NT
NT
NT NT NT NT
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ADT List: So snh cc cch ci t ADT List: So snh cc cch ci t
Array Singly-L Doubly-L
Creation O(1) nu dng
kiu c sn
O(n) nu tri li
O(1) O(1)
Destruction ging khi to O(n) O(n)
isEmpty() O(1) O(1) O(1)
getLength() O(1) O(1) c bin size
O(n) khng c
O(1) c size
O(n) khng c
insertFirst() O(n) O(1) O(1)
insertLast() O(1) O(1) c tail
O(n) khng c
O(1) c tail
O(n) khng c
insertAtIndex()
Chn vo v tr i
O(n) O(n) O(n)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Array Singly-L Doubly-L
deleteFirst() O(n) O(1) O(1)
deleteLast() O(1) O(n) ngay c c
tail
O(1) c tail
O(n) khng c
deleteAtIndex() O(n) O(n) O(n)
getFirst() O(1) O(1) O(1)
getLast() O(1) O(1) c tail
O(n) khng c
O(1) c tail
O(n) khng c
getAtIndex()
ly pt ti v tr
O(1) O(n) O(n)
ADT List: So snh cc cch ci t ADT List: So snh cc cch ci t
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Array Singly-L Doubly-L
insertBefore() O(n) O(n) O(1)
insertAfter() O(n) O(1) O(1)
deleteBefore() O(n) O(n) O(1)
deleteAfter() O(n) O(1) O(1)
next() O(1) O(1) O(1)
previous() O(1) O(n) O(1)
Nhiu khi cngcn xcnh thmmt s phptonkhc
Chng l c ch khi cc php ton insertions/deletions phi
thc hin nhiu trongdanhsch. Trongcctnhhung nh vy
nns dng doubly-linkedlist.
ADT List: So snh cc cch ci t ADT List: So snh cc cch ci t
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.3. Danh sch 3.3. Danh sch
3.3.1. Danh sch tuyn tnh
3.3.2. Ci t danh sch tuyn tnh
Biu din di dng mng
Danh sch mc ni
Danh sch ni i
3.3.3. Cc v d ng dng
3.3.4. Phn tch s dng linked list
3.3.5. Mt s bin th ca danh sch mc ni
Chap03-127
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Mt s bin th ca danh sch mc ni Mt s bin th ca danh sch mc ni
C nhiu bin th ca danh sch mc ni. Ta k ra
mt s bin th thng gp:
Danh sch mc ni a d liu (Linked List-Multiple data)
Danh sch ni vng (Circular Linked Lists)
Danh sch ni i vng (Circular Doubly Linked Lists)
Danh sch mc ni ca cc danh sch (Linked Lists of Lists)
Danh sch a mc ni (Multiply Linked Lists)
Cc php ton c bn vi cc bin th ny c xy
dng tng t nh i vi danh sch mc ni n v
danhsch mc ni kp m ta xt trn.
Chap03-128
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni a d liu Danh sch mc ni a d liu
Linked Implementation Linked Implementation-- Multiple Multiple data (pointers) data (pointers)
Data1
list
Data2 Data3
DataA DataB DataC
Struct {
Node * next;
void * item1;
void * item2;
}
Ct gi hai loi
phn t 1 v 2
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch ni vng Danh sch ni vng
Circular Circular Linked Lists Linked Lists
list
Struct {
DataType * item;
Node * next;
}
Ct gi phn t
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch ni i vng Danh sch ni i vng
Circular Circular Doubly Linked Lists Doubly Linked Lists
list
Struct {
void * item;
Node * prev;
Node * next;
}
Ct gi phn t
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch mc ni ca cc danh sch Danh sch mc ni ca cc danh sch
Linked Linked Lists of Lists Lists of Lists
list
DataA DataB DataC
Data1 Data2 Data3
Struct {
Node * item;
Node * next;
}
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Danh sch a mc ni Danh sch a mc ni
Multiply Multiply Linked Linked Lists Lists
list
Data1 Data2 Data3
Struct {
Node * item;
Node * next;
}
DataB
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ng dng Multilists ng dng Multilists -- Ma trn tha (Sparse matrix) Ma trn tha (Sparse matrix)
11 22 33 44 55 66 77 88 99 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19
AA
BB
CC
DD **
EE ** ** **
FF **
GG ** **
HH
II
JJ
KK ** **
LL ** **
MM
NN
OO
PP
QQ
RR
SS
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
T
M
K
D
Multilists Multilists -- NG DNG NG DNG
*
*
*
*
* *
*
*
5 16 11 19 8
Mi mt m (ID) sinh vin c mt list
M sinh vin (ID)
*
M

N



H

C
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Multilists Multilists -- ng dng ng dng
*
* *
M
D
K
5 16 11 19 8
T
Mi mn hc c mt list
M

n

h

c
*
* *
*
*
*
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Multilists Multilists
* M
D
K
5 16 11 19 8
T
M
D
K
5 16 11 19 8
T
*
*
*
*
*
*
* *
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Multilists Multilists -- duyt danh sch duyt danh sch
Chn mt danh sch tng ng vi mt header, chng hn
M Sinh Vin =5
Lp li:
Duyt danh sch, ti mi nt i theo danh sch mn hc.
nh v c cc u danh sch, chng hn M mn hc =
D.
Thu c: Sinh vin 5 ng k hc mn D v M.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng 3. Cc cu trc d liu c bn Chng 3. Cc cu trc d liu c bn
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-139
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4. Ngn xp 3.4. Ngn xp
3.4.1. Kiu d liu tru tng ngn xp
3.4.2. Ngn xp dng mng
3.4.3. Ci t ngn xp vi danh sch mc ni
3.4.4. Mt s ng dng ca ngn xp
ng dng 1: Ngoc hp cch
ng dng 2: Snh i th trong HTML
ng dng 3. Bi ton i c s
ng dng 4. Bi ton tnh gi tr biu thc s hc
ng dng 5. Ngn xp v qui
Chap03-140
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4.1. ADT ngn xp (Stacks ADT) 3.4.1. ADT ngn xp (Stacks ADT)
Ngn xp ldng c bit ca danh sch tuyn tnh trong
cc i tng c np vo (push) vly ra (pop) ch
t mt u c gi lnh (top) ca danhsch.
Chap03-141
5
3
2
7
2
5
3
Push
7
Pop
Pop
top
5
3
2
7
top
5
2
3
top
top
Nguyn tc: Vo sau - Ra trc
Last-in, first-out (LIFO)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4.1. ADT ngn xp (Stacks ADT) 3.4.1. ADT ngn xp (Stacks ADT)
Cc php ton c bn (stack operations):
push(object): np vo mt phn t (inserts an element )
object pop(): ly ra phn t np vo sau cng (removes and returns
the last inserted element)
Cc php ton b tr:
object top(): tr li phn t np vo sau cng m khng loi n khi
ngn xp
integer size(): tr li s lng phn t c lu tr
boolean isEmpty(): nhn bit c phi ngn xp rng
C hai cch t chc ngn xp:
S dng mng
S dng danh sch mc ni
Chap03-142
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4. Ngn xp 3.4. Ngn xp
3.4.1. Kiu d liu tru tng ngn xp
3.4.2. Ngn xp dng mng
3.4.3. Ci t ngn xp vi danh sch mc ni
3.4.4. Mt s ng dng ca ngn xp
ng dng 1: Ngoc hp cch
ng dng 2: Snh i th trong HTML
ng dng 3. Bi ton i c s
ng dng 4. Bi ton tnh gi tr biu thc s hc
ng dng 5. Ngn xp v qui
Chap03-143
144
Ngn xp dng mng Ngn xp dng mng
Array Array--based based Stack Stack
Cchn gin nht ci t
ngn xp ldngmng (S)
Ta np cc phn t theo th
t t tri sangphi
C bin lu gi ch s ca
phn t u ngn xp (N)
S
0 1 2 N

Algorithmsize()
return N +1
Algorithmpop()
if isEmpty() then
Error("EmptyStack")
else
N N 1
return S[N +1]
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
145
Ngn xp dng mng Ngn xp dng mng
Array Array--based Stack based Stack
Mng ct gi ngn xp
cth trn
Khi thao tc np vo
phi thng bo li:
FullStack
y l hn ch ca cch
ci t dngmng
Khng phi l bn cht
ca Stack ADT
S
0 1 2 N

Algorithmpush(x)
if N =S.length 1 then
error("FullStack")
else
N N +1
S[N] x
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t Ngn xp dng mng trn C Ci t Ngn xp dng mng trn C
(Stack Array Implementation) (Stack Array Implementation)
Cc php ton c bn:
void STACKinit(int);
int STACKempty();
void STACKpush(Item);
Item STACKpop();
typedef .... Item;
static Item *s;
static int N;
void STACKinit(int maxN){
s = (Item *) malloc(maxN*sizeof(Item));
N = 0;}
int STACKempty()
{return N==0;}
void STACKpush(Item item)
{s[N++] = item;}
Item STACKpop()
{ return s[--N];}
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4. Ngn xp 3.4. Ngn xp
3.4.1. Kiu d liu tru tng ngn xp
3.4.2. Ngn xp dng mng
3.4.3. Ci t ngn xp vi danh sch mc ni
3.4.4. Mt s ng dng ca ngn xp
ng dng 1: Ngoc hp cch
ng dng 2: Snh i th trong HTML
ng dng 3. Bi ton i c s
ng dng 4. Bi ton tnh gi tr biu thc s hc
ng dng 5. Ngn xp v qui
Chap03-147
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t ngn xp vi danh sch mc ni Ci t ngn xp vi danh sch mc ni
(Linked Stack) (Linked Stack)
Trong cch ci t ngn xp dng danh sch mc ni, Ngn
xp c ci t nh danh sch mc ni vi cc thao tc b
sung v loi b lun lm vic vi nt u tin.
Top of the Stack
NULL pointer
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t ngn xp vi danh sch mc ni Ci t ngn xp vi danh sch mc ni
((Linked Stack) Linked Stack)
M T NGN XP
struct StackNode {
float item;
StackNode *next;
};
struct Stack {
StackNode *top;
};
149
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cc php ton c bn Cc php ton c bn
(Linked Stack) (Linked Stack)
Ci t cc php ton:
1. Khi to: Stack *StackConstruct();
2. Kim tra ngn xp rng:
int StackEmpty(const Stack* s);
3. Kim tra trn ngn xp:
int StackFull(const Stack* s);
4. Np vo (Push): Np phn t vo u ngn xp
int StackPush(Stack* s, float* item);
5. Ly ra (Pop): Tr li gi tr phn t u ngn xp
float pop(Stack* s);
6. a ra cc phn t ca ngn xp
void Disp(Stack* s);
150
Stack *StackConstruct() {
Stack *s;
s = (Stack *)malloc(sizeof(Stack));
if (s == NULL) {
return NULL; // No memory
}
s->top = NULL;
return s;
}
/**** Hu ngn xp *****/
void StackDestroy(Stack *s) {
while (!StackEmpty(s)) {
StackPop(s);
}
free(s);
}
Khi to ngn xp Khi to ngn xp
(Initialize Stack) (Initialize Stack)
151
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cc hm b tr Cc hm b tr
/*** Kim tra Stack rng ***/
int StackEmpty(const Stack *s) {
return (s->top == NULL);
}
/*** Thng bo Stack trn ***/
int StackFull() {
printf("\n NO MEMORY! STACK IS FULL");
getch();
return 1;
}
152
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
a ra cc phn t ca ngn xp a ra cc phn t ca ngn xp
void disp(Stack* s) {
StackNode* node;
int ct = 0; float m;
printf("\n\n DANH SACH CAC PHAN TU CUA STACK \n\n");
if (StackEmpty(s)) {
printf("\n\n >>>>> EMPTY STACK <<<<<\n");
getch(); }
else {
node= s->top;
do {
m=node->item; printf("%8.3f ", m); ct++;
if (ct % 9 == 0) printf("\n");
node = node->next;
} while (!(node == NULL));
printf("\n");
}
}
Chap03-153
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Np vo (Push) Np vo (Push)
B sung vo u Stack
topPtr
topPtr
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Np vo Np vo -- Push Push
Cn thc hin cc thao tc sau:
(1) To nt mi cho item
(2) Mc ni nt mi n nt u
(3) t nt mi thnh nt u mi
155
int StackPush(Stack *s, float item) {
StackNode *node;
node = (StackNode *)malloc(sizeof(StackNode)); //(1)
if (node == NULL) {
StackFull(); return 1; // Trn Stack: ht b nh
}
node->item = item; //(1)
node->next = s->top; //(2)
s->top = node; //(3)
return 0;
}
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ly ra Ly ra -- Pop Pop
156
topPtr
topPtr
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton thc hin Pop Thut ton thc hin Pop
Thut ton:
1. kim tra c phi ngn xp l rng
2. ghi nh a ch ca nt u hin ti
3. ghi nh gi tr phn t nt u
4. chuyn nt tip theo thnh nt u mi (new top)
5. gii phng nt u c
6. tr li gi tr phn t nt u c
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t Pop trn C Ci t Pop trn C
float StackPop(Stack *s) {
float item;
StackNode *node;
if (StackEmpty(s)) { //(1)
// Empty Stack, can't pop
return NULL;
}
node = s->top; //(2)
item = node->item; //(3)
s->top = node->next; //(4)
free(node); //(5)
return item; //(6)
}
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh th nghim Chng trnh th nghim
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
// Cc m t v hm lin quan n Stack
int main() {
int ch,n,i; float m;
Stack* stackPtr;
while(1)
{ printf("\n\n======================\n");
printf("CHUONG TRINH THU STACK\n");
printf("======================\n");
printf(" 1.Create\n 2.Push\n 3.Pop\n 4.Display\n 5.Exit\n");
printf("----------------------\n");
printf("Chon chuc nang: ");
scanf("%d",&ch); printf("\n\n");
Chap03-159
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng trnh th nghim Chng trnh th nghim
switch(ch) {
case 1: printf("Da khoi tao STACK");
stackPtr = StackConstruct(); break;
case 2: printf("Vao gia tri phan tu: "); scanf("%f",&m);
StackPush(stackPtr, m); break;
case 3: m=StackPop(stackPtr);
if (m != NULL)
{printf("\n\n Gia tri phan tu lay ra: %8.3f\n",m);
} else {
printf("\n\n >>> Empty Stack, can't pop <<<\n");}
break;
case 4: disp(stackPtr); break;
case 5: printf("\n Bye! Bye! \n\n"); getch();
exit(0); break;
default: printf("Wrong choice"); getch();
} //switch
} // end while
} //end main
File chng trnh: c:\temp\devcpp\STACK_N0.CPP
Chap03-160
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4. Ngn xp 3.4. Ngn xp
3.4.1. Kiu d liu tru tng ngn xp
3.4.2. Ngn xp dng mng
3.4.3. Ci t ngn xp vi danh sch mc ni
3.4.4. Mt s ng dng ca ngn xp
ng dng 1: Ngoc hp cch
ng dng 2: Snh i th trong HTML
ng dng 3. Bi ton i c s
ng dng 4. Bi ton tnh gi tr biu thc s hc
ng dng 5. Ngn xp v qui
Chap03-161
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Applications of Stacks Applications of Stacks
NG DNG CA NGN XP
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
163
Cc ng dng ca ngn xp Cc ng dng ca ngn xp
ng dng trc tip
Lch s duyt trang trong trnh duyt Web
Dy Undo trong b son tho vn bn
Chain of method calls
Kim tra tnh hp l ca cc du ngoc trong biu thc
i c s
ng dng trong ci t chng trnh dch (Compiler implementation)
Tnh gi tr biu thc (Evaluation of expressions)
Quay lui (Backtracking)
Kh qui
. . .
Cc ng dng khc (Indirect applications)
Cu trc d liu h tr cho cc thut ton
Thnh phn ca cc cu trc d liu khc
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Mt s ng dng ca STACK Mt s ng dng ca STACK
Ta xt ng dng ca STACK vo vic ci t thut ton
gii mt s bi ton sau:
Bi ton kim tra du ngoc hp l
Bi ton i c s
Bi ton tnh gi tr biu thc s hc
Chuyn i biu thc dng trung t v hu t
Kh qui
Chap03-164
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
165
ng dng 1 ng dng 1: : Parentheses Parentheses Matching Matching
Mi (, {, hoc [ phi cp i vi ), },
hoc ]
V d:
correct: ( )(( )){([( )])}
correct: ((( )(( )){([( )])}))
incorrect: )(( )){([( )])}
incorrect: ({[ ])}
incorrect: (
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton gii bi ton Parentheses Matching Thut ton gii bi ton Parentheses Matching
Algorithm ParenMatch(X,n):
u vo: Mng X gm n k hiu, mi k hiu hoc l du ngoc, hoc l bin, hoc l
php ton s hc, hoc l con s.
Output: true khi v ch khi cc du ngoc trong X l c i
S = ngn xp rng;
for i=0 to n-1 do
if (X[i] l k hiu m ngoc)
push(S, X[i]); // gp du m ngoc th a vo Stack
else
if (X[i] l k hiu ng ngoc)
// gp du ng ngoc th so vi du m ngoc u Stack
if isEmpty(S)
return false {khng tm c cp i}
if (pop(S) khng i cp vi du ngoc trong X[i])
return false {li kiu du ngoc}
if isEmpty(S)
return true {mi du ngoc u c cp}
else return false {c du ngoc khng tm c cp}
166
167
ng dng ng dng 2: 2: Snh i th trong HTML Snh i th trong HTML
HTML Tag HTML Tag Matching Matching
<body>
<center>
<h1>The Little Boat </h1>
</center>
<p>The stormtossed the little
boat like a cheap sneaker in an
old washing machine. The three
drunken fishermen were used to
such treatment, of course, but
not the tree salesman, who even as
a stowaway now felt that he
had overpaid for the voyage. </p>
<ol>
<li>Will the salesman die? </li>
<li>What color is the boat? </li>
<li>And what about Naomi? </li>
</ol>
</body>
The Little Boat
The storm tossed the little boat
like a cheap sneaker in an old
washing machine. The three
drunken fishermen were used to
such treatment, of course, but not
the tree salesman, who even as
a stowaway now felt that he had
overpaid for the voyage.
1. Will the salesman die?
2. What color is the boat?
3. And what about Naomi?
Trong HTML, mi <name> phi i cp i vi </name>
168
HTML Tag Matching Algorithm HTML Tag Matching Algorithm
Thut tonhontontng t nh thut ton
gii bi tonngoc hp l
Hy thit k vci t chng trnh gii bi
tont ra!
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ng dng 3. Bi ton i c s ng dng 3. Bi ton i c s
Bi ton: Vit mt s trong h m thp phn thnh s
trongh m c s b.
V d:
(c s 8) 28
10
=3 - 8 +4 =34
8
(c s 4) 72
10
=1 - 64 +0 - 16 +2 - 4 +0 =1020
4
(c s 2) 53
10
=1 - 32 +1 - 16 +0 - 8 +1 - 4 +0 - 2 +1 =110101
2
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton dng ngn xp Thut ton dng ngn xp
Input s trong h m thp phn n
Output s trong h m c s b tng ng
V d:
1. Ch s phi nht ca n l n % b. Push vo stack.
2. Thay n bi n / b ( tip tc xc nh cc ch s cn li).
3. Lp li cc bc 1-2 n khi cn s 0 (n/b = 0).
4. y cc k t ra khi ngn xp v in chng.
Empty stack
n =3553
n%8 =1
n/8 =444
n =444
n%8 =4
n/8 =55
n =55
n%8 =7
n/8 =6
n =6
n%8 =6
n/8 =0
n =0
1 1
4
1
4
7
1
4
7
6
6741
8
Chuyn phn d thnh k t ch s tng ng trong h m 16:
string digitChar = 0123456789ABCDEF;
// ch s cho13 trong h m 16 l digitChar[13]=D
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ng dng 4. Bi ton tnh gi tr biu thc s hc ng dng 4. Bi ton tnh gi tr biu thc s hc
Xt vic tnhgitr ca biu thc s hc trong c cc phptonhai
ngi: Cng, tr, nhn, chia, lu tha gia cc ton hng (gi l biu
thc s hc trongkphptrungt - infixnotation).
Thng thng, i vi biu thc trong k php trung t, trnh t thc
hin tnhbiu thc c ch rabi cc cp du ngoc hoc theo th t
u tinca ccphpton.
Vo nm1920, ukasiewicz (nhton hc Balan) xut k php
Balancho php khngcn s dng cc du ngoc vn xc nh c
trnht thc hin ccphptontrongbiu thc s hc.
Chap03-171
Jan ukasiewicz
1878 - 1956
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
K php trung t (Infix Notation) K php trung t (Infix Notation)
Mi php ton hai ngi c t gia cc ton hng.
Mi php ton mt ngi (unary operator) i ngay trc ton hng.
-2 +3 * 5 (-2) +(3 * 5)
- mt ngn xp gi cc ton hng
- ngn xp kia gi cc php ton.
Biu thc trong k php trung t s c tnh nh s dng
hai ngn xp c kiu d liu khc nhau:
K php hu t (Postfix Notation) K php hu t (Postfix Notation)
K php hu t cn c gi l k php o Balan (Reverse
Polish Notation - RPN) trong cc ton hng c t trc
cc php ton.
x y / a b * b x + y y ^ *
( k php trung t tng ng)
a b * c +
a * b + c
infix
postfix
(x*y*z x^2 / (y*2 z^3) + 1/z) * (x y)
V d.
1 + (-5) / (6 * (7+8)) 1 5 - 6 7 8 + * / +
a*b*c*d*e*f ab*c*d*e*f*
(x/y a*b) * ((b+x) y )
y
xy*z*x2^y2*z3^ / 1z/+xy *
khng cn du ngoc trong RPN.
Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
A A Postfix Calculator Postfix Calculator
biu thc trung t: (7 11) * 2 +3
dng hu t tng ng: 7 11 2 * 3 +
S dng ngn xp ton hng
11
7
2 * 3 +
-4
2 * 3 +
2
-4
* 3 +
-8 3 +
-8
3
+
-5
Kt qu!
7
11 2 * 3 +
step 1
step 6
step 5
step 4
step 3
step 2
step 7
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Tnh gi tr biu thc hu t nh dng ngn xp Tnh gi tr biu thc hu t nh dng ngn xp
Dy u vo
5 9 8 7 1 * +7 *
=5 (9 8) (7 1) * +7 *
=5 ((9 8) * (7 1)) +7 *
=(5 +((9 8) * (7 1))) 7*
=(5 +((9 8) * (7 1))) * 7
5
9
8
push 5
push 9
push 8
Nu u vo l s
u vo l php ton
5
1
pop 8
pop 9
eval 1
push 1
5
7
1
1
5
6
1
5
6
11 11
7
77
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton Thut ton
Gi s tacxugm cctonhng vccphpton.
1. Duyt biu thc t tri sangphi
2. Nu gp tonhng th a (push) gitr ca nvongn xp
3. Nu gp php tonth thc hin php tonny vi hai tonhng
c ly ra(pop) t ngn xp.
4. Ct gi (push) gitr tnhc vo ngn xp (nh vy, 3k hiu
c thaybi mt tonhng)
5. Tip tc duyt cho n khi trongngn xp ch cnmt gitr duy
nht - chnhlkt qu ca biu thc
Thi gian tnh l O(n) bi v mi ton hng v mi php
tonc duyt quang mt ln.
Chap03-176
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton Thut ton
Thut ton c th m t hnh thc hn nh sau:
Khi to ngn xp rng S;
while(dng vo khc rng){
token = <phn t tip theo ca biu thc>;
if (token l ton hng){
push(S,token);
}
else if (token l php ton){
op2 = pop(S);
op1 = pop(S);
result = calc(token, op1, op2);
push(S,result);
}
} //end of while
return pop(S);
Chap03-177
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
a b / - c d * * - a e c +
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
5 10 / - 7 2 * * - 5 15 7 +
Np cc k hiu trong mng vo stack
Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
5
10
/ -
7
2 * * - 5 15 7 +
Np cc k hiu trong mng vo stack
Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
=3
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
5
/ 2 * * - 5 15 7 +
3
=
5
* Np cc k hiu trong mng vo stack
* Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
5
/ * * - 5 15 7
5
=1
* Np cc k hiu trong mng vo stack
* Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
* * - 5 15 7
1
=10
* Np cc k hiu trong mng vo stack
* Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
* * 7
1
10
=
10
* Np cc k hiu trong mng vo stack
* Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
V d: V d: Tnh gi tr biu thc hu t Tnh gi tr biu thc hu t
*
7
10
=70
l gi tr cu biu thc
* Np cc k hiu trong mng vo stack
* Nu k hiu l php ton, th thc hin php ton
ny vi hai ton hng u stack v np kt qu
vo stack.
Ci t PostfixCalcul Ci t PostfixCalcul
tnh gi tr biu thc hu t n gin tnh gi tr biu thc hu t n gin
u vo: Xucha biu thc hu t c di khngqu80
k t. Cc ton hng v php ton phn cch nhau bi ng mt
du cch
Kt qu: a ra gi tr ca biu thc.
Ton hng c gi thit l:
Php ton ch c:
s nguyn khng m
+, -, *
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t PostfixCalcul Ci t PostfixCalcul
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
int stack [1000];
int top;
// Tnh gi tr ca biu thc
int eval (char *s);
// Kim tra c phi php ton
int isop (char op);
// Thao tc y ra ca ngn xp
int pop (void);
// Thao tc y vo ca ngn xp
void push (int a);
// Thc hin php ton
int do_op (int a, int b, char op);
Chap03-187
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t PostfixCalcul Ci t PostfixCalcul
int main (void)
{
char expression[80];
int value;
printf ("Nhap vao xau bieu thuc: ");
gets(expression);
printf ("\nBieu thuc nhap vao: %s", expression);
value=eval (expression);
printf ("\nGia tri cua bieu thuc = %i", value);
getch();
return 0;
}
Chap03-188
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t PostfixCalcul Ci t PostfixCalcul
int eval (char *s){
char *ptr;
int first, second, c;
ptr = strtok (s, " ");
top = -1;
while (ptr) {
if (isop (*ptr)) {
second = pop(); first = pop();
c = do_op (first, second, *ptr);
push(c);
}
else { c = atoi(ptr); push(c);
}
ptr = strtok (NULL, " ");
}
return (pop ());
}
Chap03-189
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t PostfixCalcul Ci t PostfixCalcul
int do_op (int a, int b, char op)
{
int ans;
switch (op) {
case '+':
ans = a + b;
break;
case '-':
ans = a - b;
break;
case '*':
ans = a * b;
break;
}
return ans;
}
Chap03-190
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t PostfixCalcul Ci t PostfixCalcul
int pop (void){
int ret;
ret = stack [top];
top--;
return ret;
}
void push (int a){
top++;
stack [top] = a;
}
int isop (char op){
if (op == '+' || op == '-' || op == '*')
return 1;
else
return 0;
}
Chap03-191
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chuyn biu thc dng trung t v dng hu t Chuyn biu thc dng trung t v dng hu t
(Infix (Infix to Postfix to Postfix Conversion) Conversion)
Chuyn i biu thc dng trungt v dng hu t c th tnh
c d dng.
Taxt cchchuyn i biu thc trungt vi ccphptoncng,
tr, nhn, chia, lu tha v cc du ngoc v dng hu t.
Trc ht nhc li qui tc tnhgitr biu thc trungt nh vy:
Th t u tin: Lu tha; Nhn/Chia; Cng/Tr
Qui tc kt hp: Cho bit khi hai phptonc cngth t u tin
th cn thc hin phptonnotrc.
Lu tha: Phi quatri. V d: 2^2^3=2^(2^3)=256
Nhn/Chia: Tri quaphi.
Cng/Tr: Tri quaphi
Du ngoc c u tinhn c th t u tinvqui tc kt hp
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chuyn biu thc dng trung t v dng hu t Chuyn biu thc dng trung t v dng hu t
(Infix (Infix to Postfix to Postfix Conversion) Conversion)
Thut tonc bn loperator precedence parsing.
Tas duyt biu thc t tri quaphi.
Khi gp tonhng, lp tc a nra.
Cnkhi gp phptonth cn lmg?
Khi gp phptonkhngth a n rangay c,
bi v tonhng th hai cncha c xt.
V th, phpton cn c ct gi vs c a
rang lc.
S dng ngn xp ct gi php ton ang xt
nhng cncha c a ra.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ngn xp gi php ton Ngn xp gi php ton
Xt biu thc 1+2*3^4+5, biu thc hu t tng
ng l1 2 3 4 ^ * + 5 +.
Biu thc 1*2+3^4+5 c biu thc hu t tng ng
l1 2 * 3 4 ^ + 5 +.
Trong c hai trng hp, khi php ton th hai cn c
x l th trc chngta a ra12, vc mt php
tonang nm trongngn xp. Cuhi l: Cc php ton
di khi ngn xp nh th no?
1+2*3^4+5 1*2+3^4+5
2
1
2
1 +
*
*
+
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Khi no a php ton ra khi ngn xp Khi no a php ton ra khi ngn xp
Phptondi khi ngn xp nu cc qui tc v trnht v
kt hp cho thy rng n cn c x l thay cho php
tonang xt.
Qui tc c bn: Nu phptonang xt c th t u tin
thp hn sovi phpton u ngn xp, th phpton
u ngn xp phi di ngn xp.
1+2*3^4+5
1*2+3^4+5
2
1
2
1 + *
*
+
1+2*3^4+5
2
1
*
+
^
1*2+3^4+5
2
1
+
^
*
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cng mc u tin Cng mc u tin
Qui tc kt hp cho bit cn lmg khi php ton ang
xt ccngth t u tinvi phpton nh ngn xp.
Nu phptonctnhkt hp tri (left associative), th php
ton nh ngn xp cn a ra
4-4-4 => 4 4 - 4 -
Nu php ton c tnh kt hp phi (right associative), th
khnga phpton nh ngn xp ra.
2^2^3 => 2 2 3 ^ ^
4-4-4 2^2^3
4
4
2
2 -
^ -
^
2^2^3
2
2
^
^
4-4-4
4
4
-
-
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Hng lot php ton di ngn xp Hng lot php ton di ngn xp
Xt biu thc 1+2*3^4+5, vi biu thc hu t tng
ng l
1 2 3 4 ^ * + 5 +
Khi gp php ton +th hai, cc php ton ^* +ln lt
c a rakhi ngn xp.
Nh vy, c th xy ratnhhung hnglot phptondi
ngn xp i vi cngmt phptonang xt.
4
3
2
1
^
*
+
+
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Du ngoc Du ngoc
Du m ngoc c th t u tin hn lphp ton
khi n c xt nh l k t u vo (input
symbol) (ngha lkhngc g di khi ngn xp).
Du m ngoc c th t u tin thp hn php
tonkhi n ngn xp.
Du ng ngoc s y phptonrakhi ngn xp
cho n khi gp du m ngoc di khi ngn xp.
Ccphptons c ghi racnccdu ngoc th
khngc ghi ra.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Thut ton Thut ton
Duyt biu thc t tri quaphi:
Nu gp ton hng (Operands): a ratc th.
Nu gp du m ngoc th np nvongn xp.
Nu gp du ng ngoc: y khiu rakhi ngn xp cho
n khi gp du m ngoc u tinc y ra.
Nu gp php ton (Operator): a rakhi ngn xp tt c
cc php ton cho n khi gp php ton c th t u tin
thp hn hoc gp php ton c tnh kt hp phi c cng
th t u tin. Sau np phptonang xt vongn xp.
Khi duyt ht biu thc: a tt c cc phptoncnli ra
khi ngn xp.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d chuyn i trung t v hu t V d chuyn i trung t v hu t
1
1 -
-
2
2
-
^
-
^
3
3
-
^
^
-
^
^
3
3
-
^
^
^^-
-
-
(
-
(
4
4
-
(
+
-
(
+
5
5
-
(
+
*
-
6
6
+
*+
)
-
*
-
*
7
7
-
*
*-
(
+
*
-
(
*
Infix: 1-2^3^3-(4+5*6)*7
Postfix: 1 2 3 3 ^^- 4 5 6 * +7 * -
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
Ta s dng stack chuyn infix v postfix
Trc ht, to mt stack v mt mng.
( a b / ( - c + d ) ) * * ( ) - a e c \0
Np ton t vo stack v ton hng vo mng.
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
(
a
b / ( - c + d ) ) * * ( ) - a e c \0
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Ch : Du ( ngoi stack c coi l c u
tin cao hn bt c ton t no, nhng khi trong
stack th n li c coi l c u tin thp hn
bt c ton t no
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
(
a b
/
(
- c + d ) ) * * ( ) - a e c \0
u tin khng cao hn -
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
(
a b
/
(
-
c
+ d ) ) * * ( ) - a e c \0
u tin khng cao hn -
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
(
a b
/
(
- c
+
d
)
) * * ( ) - a e c \0
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
(
a b
/
- c d
) * * ( ) - a e c \0
+
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
a b
/
- c d
* * ( ) - a e c \0
+
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
a b / - c d
*
*
(
)
-
a e
c \0
+
u tin khng cao hn*
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
a b / - c d *
*
- a e c
\0
+
\0 is lowest order operator,
so pop all the operators in stack.
Ta s dng stack chuyn infix v posfix
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
V d: Chuyn trung t v hu t V d: Chuyn trung t v hu t
a b / - c d * * - a e c
Trc ht, to mt stack v mt mng.
Np ton t vo stack cn ton hng vo mng
Nu ton hng c u tin cao hn ton hng u stack,
th np n vo stack, tri li a ton hng u stack ra mng.
Gp du ( th np ngay vo stack,
( ch di stack khi gp ) .
Nu np du ) th a tt c cc ton t nm gia ( )
trong stack ra mng, cc du ( ) cng c a ra khi
stack nhng khng ct vo mng.
+
Ta s dng stack chuyn infix v posfix
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.4. Ngn xp 3.4. Ngn xp
3.4.1. Kiu d liu tru tng ngn xp
3.4.2. Ngn xp dng mng
3.4.3. Ci t ngn xp vi danh sch mc ni
3.4.4. Mt s ng dng ca ngn xp
ng dng 1: Ngoc hp cch
ng dng 2: Snh i th trong HTML
ng dng 3. Bi ton i c s
ng dng 4. Bi ton tnh gi tr biu thc s hc
ng dng 5. Ngn xp v qui
Chap03-211
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Stacks v qui Stacks v qui
Mi hm qui u c th ci t s dng ngn
xp v lp (Every recursive function can be
implemented using a stack and iteration).
Mi hmlp c s dng ngn xp u c th ci
t s dng qui. (Every iterative function which
uses a stack can be implemented using recursion.)
213
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
tmp = tmp*tmp;
else
tmp = tmp*tmp*x;
}
return tmp;
}
Xt hm tnh lu tha c ci t qui:
V d
214
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
Xt vic thc hin power(2,5)
215
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
x = 2, n = 2
tmp = 1
power(2,5) power(2,2)
216
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
x = 2, n = 2
tmp = 1
x = 2, n = 1
tmp = 1
power(2,5) power(2,2) power(2,1)
217
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
x = 2, n = 2
tmp = 1
x = 2, n = 1
tmp = 1
x = 2, n = 0
tmp = 1
power(2,5) power(2,2) power(2,1) power(2,0)

218
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
x = 2, n = 2
x = 2, n = 1
tmp = 1
tmp = 1* 1* 2
= 2
power(2,5) power(2,2) power(2,1)
219
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 1
x = 2, n = 2
tmp = 2* 2
= 4
power(2,5) power(2,2)
220
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x = 2, n = 5
tmp = 4* 4* 2
= 32
power(2,5) tr li 32
221
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x
n
tmp
2
1
1
Ln gi 3
x
n
tmp
2
2
1
Ln gi 2
2
5
1
x
n
tmp
Ln gi 1
x
n
tmp
2
0
1
Ln gi 4
Ct gi vo ngn xp
T chc ngn xp ct gi trng thi
ca cc ln gi qui
222
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x
n
tmp
2
1
2
Tr li cho ln gi 3
x
n
tmp
2
2
1
Ln gi 2
2
5
1
x
n
tmp
Ln gi 1
Ngn xp
223
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
x
n
tmp
2
2
4
Tr li cho ln gi 2
2
5
1
x
n
tmp
Ln gi 1
Ngn xp
224
double power(double x, int n)
{
double tmp = 1;
if (n > 0)
{
tmp = power(x, n/2);
if (n % 2 == 0)
{
tmp = tmp*tmp;
}
else
{
tmp = tmp*tmp*x;
}
}
return tmp;
}
Tr li cho ln gi 1
2
5
32
x
n
tmp
Ngn xp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
Stack
n = 5, x = 2
5
2
Runtime stack
x
n
tmp
Thut ton lp power(x,n) tnh x
n
s dng Stack
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
5
Stack
n = 5, x = 2
5
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
2
5
Stack
n = 2, x = 2
2
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
1
2
5
Stack
n = 1, x = 2
1
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
1
2
5
Stack
n = 0, x = 2
tmp = 1
1
0
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
2
5
Stack
n = 0, x = 2
tmp = 2
2
0
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
5
Stack
n = 0, x = 2
tmp = 4
4
0
2
Runtime stack
x
n
tmp
module power(x, n)
{
create a Stack
initialize a Stack
loop{
if (n == 0) then {exit loop}
push n onto Stack
n = n/2
}
tmp = 1
loop {
if (Stack is empty) then {return tmp}
pop n off Stack
if (n is even) {tmp = tmp*tmp}
else {tmp = tmp*tmp*x}
}
}
Stack
n = 0, x = 2
tmp = 32
32
0
2
Runtime stack
x
n
tmp
233
double power(double x, int n)
{
double tmp = 1;
Stack theStack;
initializeStack(&theStack);
while (n != 0) {
push(&theStack, n);
n /= 2;
}
while (!stackEmpty(&theStack)) {
n = pop(&theStack);
if (n % 2 == 0)
{ tmp = tmp*tmp;}
else
{ tmp = tmp*tmp*x;}
}
return tmp;
}
Cch m t ny
gn vi C hn !
Ci t khng qui s dng stack
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chng 3. Cc cu trc d liu c bn Chng 3. Cc cu trc d liu c bn
3.1. Cc khi nim
3.2. Mng
3.3. Danh sch
3.4. Ngn xp
3.5. Hng i
Chap02-234
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.5. Hng i 3.5. Hng i
3.5.1. Kiu d liu tru tng hng i
3.5.2. Ci t hng i bng mng
3.5.3. Ci t hng i bi danh sch mc ni
3.5.4. Mt s v d ng dng hng i
ng dng 1. Chuyn i xu ch s thnh s thp phn
ng dng 2. Nhn bit Palindromes
Chap03-235
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ADT hng i (ADT queues) ADT hng i (ADT queues)
Hng i ldanh sch c th t trong php ton chn
lun thc hin ch mt pha gi l pha sau hay cui
(back or rear), cnphptonxoch thc hin phacn
li gi lpha trc hayu (front or head).
Thut ng thng dng cho hai thao tc chn v xo i
vi hng i tng ng l a vo (enqueue) v a ra
(dequeue).
Cc phn t c ly ra khi hng i theo qui tc Vo
trc - Ratrc. V th hngi cnc gi ldanhsch
votrc ratrc (First-In-First-Out (FIFO) list).
Chap02-236
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ADT hng i (ADT queues) ADT hng i (ADT queues)
Cc thut ng lin quan n hng i c m t trong
hnh v sau y:
Hng i c tnh cht nh l cc hng i ch c phc
v trong thc t.
Chap02-237
B sung/
a vo
Add/
Enqueue
Loi b/
a ra
(Remove/
Dequeue)
Pha sau/Cui
Back/Rear
Pha trc/u
Front/Head
Using a Queue Using a Queue
Queues Everywhere! Queues Everywhere!
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cc php ton Cc php ton
Q=init(); Khi to Qlhngi rng.
isEmpty(Q); Tr li "true" khi vch khi hngi Qlrng.
isFull(Q); Tr li "true" khi vch khi hngi Qltrn, chobit lta
s dng vt qukchthc ti a dnhchohngi.
front(Q); Tr li phn t phatrc (front) ca hngi Q hoc gp li
nu hngi rng.
enqueue(Q,x); Chnphn t x vo phasau(back) hngi Q. Nu vic
chndn n trnhngi th cn thngbov iu ny.
dequeue(Q,x); Xo phn t pha trc hng i, tr li x l thng tin
cha trongphn t ny. Nu hngi rng th cn a rathngboli.
print(Q); a radanhschtt c ccphn t ca hngi Qtheoth t t
phatrc n phasau.
size(Q); Tr li s lng phn t tronghngi Q.
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
241
V d V d
Operation Output Q
enqueue(5) (5)
enqueue(3) (5, 3)
dequeue() 5 (3)
enqueue(7) (3, 7)
dequeue() 3 (7)
front() 7 (7)
dequeue() 7 ()
dequeue() error ()
isEmpty() true ()
size() 0 ()
enqueue(9) (9)
enqueue(7) (9, 7)
enqueue(3) (9, 7, 3)
enqueue(5) (9, 7, 3, 5)
dequeue() 9 (7, 3, 5)
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Queues Queues
242
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
ng dng ca hng i ng dng ca hng i
ng dng trc tip
Danh sch xp hng ch mua v tu xe, ch gi xe, ch c
phc v hng n, ch mn sch th vin, ...
Chia s cc ti nguyn (v d, printer, CPU, b nh, ...)
T chc thc hin a chng trnh (Multiprogramming)
...
ng dng gin tip (Indirect applications)
Cu trc d liu b tr cho cc thut ton
L thnh phn ca nhng cu trc d liu khc
...
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.5. Hng i 3.5. Hng i
3.5.1. Kiu d liu tru tng hng i
3.5.2. Ci t hng i bng mng
3.5.3. Ci t hng i bi danh sch mc ni
3.5.4. Mt s v d ng dng hng i
ng dng 1. Chuyn i xu ch s thnh s thp phn
ng dng 2. Nhn bit Palindromes
Chap03-244
Ci t hng i bng mng Ci t hng i bng mng
Array Array--based based Queue Queue
S dng mng Q kch thc N theo th t vng trn
C hai bin lu tr v tr u v cui (front and rear)
f ch s ca phn t u hng i
r ch s ca v tr ngay sau v tr ca phn t cui cng ca hng
i
V tr r c gi l rng
Q
0 1 2 r f
cu hnh bnh thng
Q
0 1 2 f r
cu hnh xoay vng trn
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Cc php ton Cc php ton
Ta s dng php ton theo
modulo (phn d ca
php chia)
Algorithmsize()
return (N f +r) mod N
AlgorithmisEmpty()
return (f = r)
Q
0 1 2 r f
Q
0 1 2 f r
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Php ton chn Php ton chn -- a vo (enqueue) a vo (enqueue)
Algorithmenqueue(o)
if size() =N 1then
Error("FullQueue")
else
Q[r] o
r (r +1) mod N
Php ton enqueue phi
n li trn hng i.
Li ny cn x l bi ngi
s dng.
Q
0 1 2 r f
Q
0 1 2 f r
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Php ton loi b Php ton loi b -- a ra (dequeue) a ra (dequeue)
Php ton loi b
(dequeue) cn x l li
hng i rng
Algorithmdequeue()
if isEmpty() then
Error("EmptyQueue")
else
o Q[f]
f (f +1) mod N
return o
Q
0 1 2 r f
Q
0 1 2 f r
Demo: d:\..\0DEMOCODE\QueueArray.c
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.5. Hng i 3.5. Hng i
3.5.1. Kiu d liu tru tng hng i
3.5.2. Ci t hng i bng mng
3.5.3. Ci t hng i bi danh sch mc ni
3.5.4. Mt s v d ng dng hng i
ng dng 1. Chuyn i xu ch s thnh s thp phn
ng dng 2. Nhn bit Palindromes
Chap03-249
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Ci t hng i bi danh sch mc ni Ci t hng i bi danh sch mc ni
Ta c th ci t hng i bi danh sch mc ni n hoc i.
V d: khai bo sau y c s dng m t hng i bi
danh sch mc ni n:
typedef struct _node {
DataType element;
struct _node *next; } node;
typedef struct { node *front; node *back; } queue;
trong DataType l kiu d liu ca i tng cn lu gi,
c khai bo trc.
Cc php ton i vi hng i m t bi danh sch mc ni
c ci t tng t nh i vi danh sch mc ni trnh
by trn. Ta s khng trnh by li chi tit y.
Chap03-250
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
3.5. Hng i 3.5. Hng i
3.5.1. Kiu d liu tru tng hng i
3.5.2. Ci t hng i bng mng
3.5.3. Ci t hng i bi danh sch mc ni
3.5.4. Mt s v d ng dng hng i
ng dng 1. Chuyn i xu ch s thnh s thp phn
ng dng 2. Nhn bit Palindromes
Chap03-251
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d: V d: Chuyn i xu ch s thnh s thp phn Chuyn i xu ch s thnh s thp phn
Thut ton c m t trong s sau:
// Chuyn dy ch s trong Q thnh s thp phn n
// Loi b cc du cch u (nu c)
do { dequeue(Q, ch)
}until ( ch !=blank)
// ch cha ch s u tin
// Tnh n t dy ch s trong hng i
n = 0;
done = false;
do { n = 10* n + s nguyn m ch biu din
if (! isEmpty(Q) )
dequeue(Q,ch)
else
done = true
} until ( done || ch !=digit)
// Kt qu: n cha s cn tm
Chap03-252
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d: Nhn bit V d: Nhn bit Palindromes Palindromes
nh ngha. Tagi palindrome lxumc nt tri quaphi cng
ging nh c nt phi quatri.
V d:
NOON, DEED, RADAR, MADAM
ABLE WAS I ERE I SAW ELBA
Mt trong nhng cch nhn bit mt xu cho trc c phi l
palindrome hay khng l ta a cc k t ca n ng thi vo mt
hngi vmt ngn xp. Sau ln lt loi b cc k t khi hng
i vngn xp vtin hnhsosnh:
Nu pht hin s khc nhaugia hai kt, mt kt c ly rat
ngn xp cnkt kialy rat hngi, th xuang xt khngl
palindrome.
Nu tt c cc cp k t ly ra l trng nhau th xu ang xt l
palindrome.
253
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
V d minh ho thut ton: "RADAR" V d minh ho thut ton: "RADAR"
K t hin thi Queue
(cui bn phi)
Stack
(top bn tri)
R R R
A R A A R
D R A D D A R
A R A D A A D A R
R R A D A R R A D A R


254
Bc 1: a RADAR vo Queue v Stack:
255
Nhn bit "RADAR" c phi palindrome Nhn bit "RADAR" c phi palindrome
Queue
(head bn tri)
head ca
Queue
top ca
Stack
Stack
(top bn tri)
R A D A R R R R A D A R
A D A R A A A D A R
D A R D D D A R
A R A A A R
R R R R
empty empty empty empty


Bc 2: Xo b RADAR khi Queue v Stack:
Kt lun: Xu "RADAR" l palindrome
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chap02-256
Ht chng 3
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
Chap03-257
CTDL & TT NGUYN C NGHA B mn KHMT HBK H ni
258
Kiu d liu tru tng Kiu d liu tru tng
(Abstract (Abstract Data Data Types) Types)
Mt nguyn l c bn ca cng ngh phn mm l:
Tch giao din (ci m bn c th lm) khi ci t (ci c thc
hin bng cch no)
(Separate the interface (what you can do) from the implementation (how
it is done))
Kiu d liu tru tng (Abstract Data Type-ADT) nh l giao din ca
c mt h d liu.
An array is probably the most versatile or fundamental Abstract Data
Type, left until now simply to show it was reasonable to consider others.
An array is a finite sequence of storage cells, for which the following
operations are defined:
create(A,N) creates an array A with storage for N items;
A[i]=item stores item in the i
th
position in the array A; and
A[i] returns the value of the item stored in the i
th
position in the array A.
3.4 3.4. . Ngn xp (Stacks) Ngn xp (Stacks)
Introduction
Consider the 4 problems on pp. 170-1
(1) Model the discard pile
in a card game
(2) Model a railroad
switching yard
(3) Parentheses checker
(4) Calculate and display base-two
representation
26 =???????
2

You might also like