Professional Documents
Culture Documents
|
!!!"
r
I. Tҥi sao phҧi dùng cҩu trúc dӳ liӋu đӝng
Vӟi các cҩu trúc dӳ liӋu đưӧc xây dӵng tӯ kiӇu dӳ liӋu
cơ sӣ như: nguyên, thӵc, ký tӵ, «hoһc các kiӇu cҩu trúc
đơn giҧn như mҭu tin (bҧn ghi), tұp hӧp, mҧng«có thӇ
giҧi quyӃt hҫu hӃt các bài toán đһt ra
Nhưӧc điӇm: Không thay đәi đưӧc kích thưӟc, cҩu trúc
trong quá trình sӕng'cӭng ngҳt, gò bó khiӃn khó diӉn tҧ
đưӧc thӵc tӃ vӕn sinh đӝng, phong phú. Các kiӇu dӳ liӋu
trên đưӧc gӑi là kiӇu dӳ liӋu tĩnh.
¢
I. Tҥi sao phҧi dùng cҩu trúc dӳ liӋu đӝng
Trong thӵc tӃ, mӝt sӕ đӕi tưӧng có thӇ đưӧc đӏnh nghĩa
đӋ quy, ví dө đӇ mô tҧ đӕi tưӧng con ngưӡi, cҫn thӇ hiӋn
các thông tin tӕi thiӇu như:
Hӑ tên
Sӕ CMND
Thông tin vӅ cha mҽ
ĐӇ biӇu diӉn mӝt đӕi tưӧng có nhiӅu thành phҫn thông
tin như trên, có thӇ sӱ dөng kiӇu bҧn ghi. Tuy nhiên cҫn
lưu ý cha, mҽ cũng là các dӕi tưӧng kiӇu ngưӡi, do vұy vӅ
nguyên tҳc cҫn phҧi đӏnh nghĩa như sau:
È
I. Tҥi sao phҧi dùng cҩu trúc dӳ liӋu đӝng
' Không thӇ xác đӏnh đưӧc kích thưӟc cӫa đӕi tưӧng kiӇu NGUOI !
Ü
I. Tҥi sao phҧi dùng cҩu trúc dӳ liӋu đӝng
I. Tҥi sao phҧi dùng cҩu trúc dӳ liӋu đӝng
3. ThiӃu bӝ nhӟ: KiӇu dӳ liӋu tĩnh không đáp ӭng đưӧc nhu
cҫu thӵc tӃ là tәng kích thưӟc vùng nhӟ dành cho các biӃn
tĩnh chӍ là 64Kb. Khi có nhu cҫu dùng nhiӅu bӝ nhӟ, ta phҧi
sӱ dөng cҩu trúc dӳ liӋu đӝng
' Khҳc phөc các nhưӧc điӇm trên: Dùng cҩu trúc
dӳ liӋu đӝng.
¿
II. KiӇu dӳ liӋu con trӓ
I
II. KiӇu dӳ liӋu con trӓ
KiӇu con trӓ là kiӇu cơ sӣ dùng lưu đӏa chӍ cӫa mӝt đӕi
tưӧng dӳ liӋu khác
BiӃn thuӝc kiӇu con trӓ là biӃn mà giá trӏ cӫa nó là đӏa chӍ
cӫa mӝt vùng nhӟ ӭng vӟi mӝt biӃn kiӇu con trӓ hoһc giá trӏ
NULL.
|
II. KiӇu dӳ liӋu con trӓ
Typedef <kiӇu con trӓ> * <KiӇu cơ sӣ> Type <kiӇu con trӓ> ^ <KiӇu cơ sӣ>
Ví dө: Ví dө:
1
2
5 $72
4
2
)5
26 ||
II. KiӇu dӳ liӋu con trӓ
3. BiӃn đӝng
Trong nhiӅu trưӡng hӧp, tҥi thӡi điӇm biên dӏch không thӇ
xác đӏnh trưӟc kính thưӟc chính xác cӫa mӝt sӕ đӕi tưӧng dӳ
liӋu do sӵ tӗn tҥi và tăng trưӣng cӫa chúng phө thuӝc vào
ngӳ cҧnh cӫa viӋc thӵc hiӋn chương trình (chҷng hҥn như sӕ
ngưӡi tham gia trҧ lӡi câu hӓi trên mҥng, sӕ thí sinh đăng ký
dӵ thi«). Các đӕi tưӧng có đһc điӇm trên nên đưӧc khai báo
như biӃn đӝng.
|r
II. KiӇu dӳ liӋu con trӓ
3. BiӃn đӝng
|¢
II. KiӇu dӳ liӋu con trӓ
3. BiӃn đӝng
BiӃn đӝng không đưӧc khai báo tưӡng minh nên các biӃn
đӝng không có mӝt đӏnh danh đưӧc kӃt buӝc vӟi đӏa chӍ
vùng nhӟ cҩp phát cho nó
' gһp khó khăn khi truy xuҩt đӃn 1 biӃn đӝng. ĐӇ giҧi quyӃt
vҩn đӅ đó, dùng biӃn con trӓ (là biӃn không đӝng) đӇ trӓ đӃn
đӏa chӍ cӫa biӃn đӝng đó.
Như vұy, khi tҥo ra mӝt biӃn đӝng, phҧi dùng mӝt con trӓ
đӇ lưu đӏa chӍ cӫa biӃn này và sau đó truy xuҩt đӃn biӃn đӝng
thông qua biӃn con trӓ đã đӏnh danh.
|È
II. KiӇu dӳ liӋu con trӓ
3. BiӃn đӝng
Hai thao tác cơ bҧn trên biӃn đӝng là tҥo và huӹ mӝt biӃn
đӝng do biӃn con trӓ P trӓ đӃn
Trong Pascal
New(p) ; {Cҩp phát mӝt vùng nhӟ và cho con trӓ p giӳ đӏa chӍ}
Dispose(p); {Giҧi phóng vùng nhӟ do con trӓ p trӓ tӟi}
|Ü
!!!"38
9
|
!!!"38
9
:
8
;<
=
%>
0¬?
@=
|¿
!!!"38
9
¬?
@=2
- C?
@ =
H
I
0 0 = J G K
L" 0 0
= J G M < N OP 7JQ R
"
¬?
@ = S $+ / T 0 U
A.
CV / = B "
|I
:
|w
8
Element 1
Element 2 Element 3
Element 1
Element 7
Element 6
Element 2
Element 5
Element 4
Element 3
Element 8
r|
=
Element 3
Element 1
Element 4 Element 2
rr
00:K
9
Z[KWJI"
WJ;9
AC
\0
0WJ
r¢
3 0
0WJ ]
Lr 0
2
+JG
F
rÈ
!!!"
:
rÜ
$
0]
$^7 +C
)=_
r
|"0 :
<N
00K0
50
-X05/
r¿
|"|" <N0 :
Cho T là mӝt kiӇu đưӧc đӏnh nghĩa trưӟc, kiӇu danh sách Tx gӗm
các phҫn tӱ thuӝc kiӇu T đưӧc đӏnh nghĩa là:
Tx=<Vx, Ox>
Trong đó:
Vx={tұp có thӭ tӵ các phҫn tӱ kiӇu T đưӧc móc nӕi vӟi nhau
theo trình tӵ tuyӃn tính};
Ox = { tұp các phép toán tác đӝng lên danh sách đó}
Chҵng hҥn như:
- Tҥo danh sách
- Tìm mӝt phҫn tӱ trong danh sách
- Chén 1 phҫn tӱ vào danh sách
- Huӹ mӝt phҫn tӱ
- LiӋt kê danh sách
- Sҳp xӃp danh sách. rI
|"r"$K`[P
, Mӛi phҫn tӱ trong danh sách gӑi là mӝt nút (node). Trong mӛi
nút, ngoài phҫn thông tin cӫa nó, còn chӭa đӏa chӍ cӫa phҫn tӱ
đӭng sau nó trong danh sách. Quy cách cӫa mӛi nút có thӇ hình
dung như sau:
$7
, Ciêng nút cuӕi cùng không có nút đӭng sau nên mӕi nӕi ӣ nút
này phҧi là mӝt đӏa chӍ đһc biӋt chӍ dùng đӇ đánh dҩu kӃt thúc danh
sách, ta gӑi là mӕi nӕi không, và ký hiӋu là null.
rw
|"r"$K`[P
ĐӇ truy nhұp vào mӑi nút trong danh sách, tҩt nhiên phҧi truy
nhұp đưӧc vào nút đҫu tiên, nghĩa là cҫn mӝt con trӓ L trӓ vào
nút đҫu tiên này.
NӃu dùng mũi tên chӍ mӕi nӕi, ta sӁ có hình ҧnh mӝt danh sách
móc nӕi như sau (ta sӁ gӑi là danh sách nӕi đơn).
] Z a b
Dҩu chӍ mӕi nӕi không. Ta quy ưӟc nӃu danh sách rӛng thì
L=null. Các chӳ A, B tưӧng trưng cho phҫn biӇu diӉn thông tin.
¢
|"r"$K`[P
ĐӇ cài đһt bҵng Pascal, ta quy ưӟc khai báo như sau:
Type
Item=Char;
Pointer=^Node
Node=record
Data:Item;
Next:Pointer;
End;
¢|
|"¢"-Xc0K0LX
"¬d90
Procedure Init;
Begin
L:=Nil;
End;
¢r
|"¢"-Xc0K0LX
b. Chèn nút mӟi vào danh sách nӕi đơn
4 trưӡng hӧp
Trưӡng hӧp 1: Chèn vào cuӕi danh sách sau con trӓ M
Trưӡng hӧp 2: Chèn vào giӳa danh sách sau con trӓ M
Trưӡng hӧp 3: Chèn vào đҫu danh sách trưӟc con trӓ M
Trưӡng hӧp 4: Chèn vào giӳa danh sách trưӟc con trӓ M
¢¢
b1. Chèn nút mӟi vào danh sách nӕi đơn sau nút trӓ bӣi con trӓ M
Trưӡng hӧp 1: Chèn vào cuӕi danh sách sau con trӓ M
Trưӡng hӧp 2: Chèn vào giӳa danh sách sau con trӓ M
¢È
b1. Chèn nút mӟi vào danh sách nӕi đơn sau nút trӓ bӣi con trӓ M
Procedure INSERT_AFTER(L, M, X)
Begin
1. {Tҥo nút mӟi}
New(P);
Data(P):=X;
P \
2. {Thӵc hiӋn bә sung}
if L=null then {Danh sách rӛng} L
begin
L:=P;
Next(P):=null;
End
¢Ü
b1. Chèn nút mӟi vào danh sách nӕi đơn sau nút trӓ bӣi con trӓ M
Procedure INSERT_AFTER(L, M, X)
Begin
1. {Tҥo nút mӟi}
New(P);
Data(P):=X;
P \
Next(p):=Null
2. {Thӵc hiӋn bә sung}
if L=null then {Danh sách rӛng} L L:=P
begin
L:=P;
Next(P):=null;
End
¢
b1. Chèn nút mӟi vào danh sách nӕi đơn sau nút trӓ bӣi con trӓ M
Procedure INSERT_AFTER(L, M, X)
Begin
1. {Tҥo nút mӟi}
New(P);
Data(P):=X;
¢I
eWJ\
X 0
]
Z
New(P)
¢w
eWJ\
X 0
]
Z
New(P)
Data(P):=X 3
È
eWJ\
X 0
]
Z
New(P)
\
Data(P):=X 3
È|
eWJ\
X 0
]
Z
New(P)
\
Data(P):=X 3
NEXT(P):=NEXT(M)
NEXT(M):=P
Èr
eWJ\
X 0
]
Z
New(P)
\
Data(P):=X 3
NEXT(P):=NEXT(M)
NEXT(M):=P
È¢
eWJ\
% 0
-
]
Z
New(P)
3 ÈÈ
eWJ\
% 0
-
]
Z
New(P)
Data(P):=X
3 ÈÜ
eWJ\
% 0
-
]
Z
New(P)
Data(P):=X
\
3 È
eWJ\
% 0
-
]
Z
New(P)
Data(P):=X
\ NEXT(P):=NEXT(M)
NEXT(M):=P
3 È¿
eWJ\
% 0
-
]
Z
New(P)
Data(P):=X
\ NEXT(P):=NEXT(M)
NEXT(M):=P
3 ÈI
b. Chèn nút mӟi vào danh sách nӕi đơn trưӟc nút trӓ bӣi con trӓ M
Èw
b. Chèn nút mӟi vào danh sách nӕi đơn trưӟc nút trӓ bӣi con trӓ M
Phép toán này phӭc tҥp hơn. Khó khăn ӣ đây là nӃu M không là
thành phҫn đҫu tiên cӫa danh sách (tӭc M<>L) thì ta sӁ không
đӏnh vӏ đưӧc thành phҫn trưӟc M đӇ kӃt nӕi vӟi thành phҫn sӁ
đưӧc xen vào. Có thӇ giҧi quyӃt khó khăn này bҵng cách đҫu
tiên vүn xen thành phҫn mӟi vào sau thành phҫn M, sau đó tráo
đәi giá trӏ chӭa trong phҫn Data giӳa thành phҫn mӟi và thành
phҫn M.
Ü
b. Chèn nút mӟi vào danh sách nӕi đơn trưӟc nút trӓ bӣi con trӓ M
L
{Chèn phҫn tӱ X vào danh sách L trưӟc nút trӓ bӣi M}
L
{1. M trӓ vào nút đҫu danh sách}
L
L
L
5
{2. M trӓ vào nút ӣ giӳa danh sách}
5
L
L
L
5 RG
/M3
5 Ü|
eWJ\
W 0IF/dF-
]
Z
New(P)
Ür
eWJ\
W 0IF/dF-
]
Z
New(P)
\ Data(P):=X;
Next(p):=M;
P
L:=p;
Ü¢
eWJ\
W 0IF/dF-
]
Z
New(P)
\ Data(P):=X;
Next(p):=M;
P
L:=p;
ÜÈ
eWJ\
0IF/dF-
] -
Z
New(P)
L
P
ÜÜ
eWJ\
0IF/dF-
] -
Z
New(P)
L
P
L
Ü
eWJ\
0IF/dF-
] -
New(P)
L
P Z
L
Ü¿
eWJ\
0IF/dF-
] -
\
New(P)
L
P Z
L
ÜI
" AWJLC0\0
h I0
KC SAC WB
0
0
Thӫ tөc sau sӁ tìm trong danh sách trӓ bӣi con trӓ L có
phҫn tӱ nào mà trưӡng Data=X hay không
RG/M3
-9AWJLC0\0
Z \ b
|
-9AWJLC0\0
321]
!
""
]
Z \ b
\
3
r
-9AWJLC0\0
321$73
!
""
]
Z \ b
\
3
¢
-9AWJLC0\0
321$73
!
""
]
Z \ b
\
3
È
-9AWJLC0\0
321$73
!
""
]
Z \ b
\
3
Ü
-9AWJLC0\0
321$73
!
"
]
Z \ b
\
3
A\i
-9AWJLC0\0
Z a b
¿
-9AWJLC0\0
321]
!
""
]
Z a b
\
3
I
-9AWJLC0\0
321$73
!
""
]
Z a b
\
3
w
-9AWJLC0\0
321$73
!
""
]
Z a b
\
3
¿
-9AWJLC0\0
321$73
!
""
]
Z a b
\
3
¿|
-9AWJLC0\0
321$73
!
""
]
Z a b
\
3
¿r
-9AWJLC0\0
321$73
!
""
]
Z a b
\
3
¿¢
-9AWJLC0\0
321$73
""
]
Z a b
\
3
¬V A\i
¿È
" AWJLC0\0
§Thông thưӡng ta cҫn tìm kiӃm đӇ thӵc hiӋn thao tác khác
vӟi danh sách.
§Chҷng hҥn, ta cҫn loҥi khӓi danh sách vӟi thành phҫn
Data=X hoһc xen mӝt thành phҫn mӟi vào trưӟc hoһc sau
thành phҫn vӟi Data=x. Muӕn thӃ, trưӟc hӃt ta phҧi tìm trong
danh sách thành phҫn Data là x.
§ĐӇ cho phép loҥi bӓ hoһc phép xen vào đưӟc dӉ dàng, ta đưa
vào thӫ tөc tìm kiӃm 2 con trӓ cách nhau mӝt bưӟc. Con trӓ P
trӓ vào thành phҫn cҫn tìm, con trӓ R trӓ vào thành phҫn đi
trưӟc
RG
¿Ü
"]9/FWJCF0
Cho mӝt danh sách nӕi đơn trӓ bӣi L. Giҧi thuұt này thӵc
hiӋn loҥi bӓ nút trӓ bӣi M ra khӓi danh sách đó
¿I
]9/FWJW CF0
Header
Z
Header:=Next(M);
¿w
]9/FWJW CF0
Header
Z
Header:=Next(M);
Dispose(M)
I
]9/FWJW CF0
Header
Z
Header:=Next(M);
Dispose(M)
I|
]9/FWJ% CF0
Header
Z
Ir
]9/FWJ% CF0
Header
Z
3
P:=Header;
I¢
]9/FWJ% CF0
Header
Z
3
P:=Header;
P:=Next(P);
IÈ
]9/FWJ% CF0
Header
Z
3
P:=Header; Next(P):=Next(M);
P:=Next(P);
IÜ
]9/FWJ% CF0
Header
Z
3
P:=Header; Next(P):=Next(M);
P:=Next(P); Dispose(M)
I
]9/FWJ% CF0
Header
Z
3
P:=Header; Next(P):=Next(M);
P:=Next(P); Dispose(M)
I¿
"3c0
II
#"%cr0X
r 0 X
W
= F /d 3
_" %
B c r 0 L
0 I
3 F I L
¢E=2
h
h
0
Iw
#"-9%cr0X
3
Z a b
þ
% )
w
#"-9%cr0X
3|213
$73|fg$
3|21$73|
3
Z a b
3|
þ
% )
w|
#"-9%cr0X
$73|fg$
3|21$73|
3
Z a b
3|
þ
% )
wr
#"-9%cr0X
$73|fg$
3|21$73|
3
Z a b
3|
þ
% )
w¢
#"-9%cr0X
$73|1$
$73|21_
3
Z a b
þ
% )
wÈ
#"%cr0X
3 %3._
Z%!$
O
#_1$
j
O
!# 31$
Z
321_
j
O
3|213
$73|fg$
w¿
:GkG0LX
Cho đa thӭc
A(x) = anxn +an-1xn-1 +«.a1x1+a0
B(x) = bnxm +bn-1xm-1 +«.b1x1+b0
- Xây dӵng đa thӭc C(x)=A(x)+B(x)
wI
"-X05/
0X l
Mӕi nӕi cuӕi cùng không phҧi là Null mà là đӏa chӍ cӫa nút
đҫu tiên trong danh sách
Z a b
Head
ww
-X05/
0X¬c
]3 jj3 j
|
"-X05/
)AR0X¬c
] j
Z \ a
||
È"$^7 +C
|r
È"|" <N^7 +C
+C
C? 0
: 5 / c /[ ¿
9 /F
V
V B
d W >
S Ü
È
:G2)9E.7 ¢
;
H.;N
r
0 |
$K `
C? O
IQ m ) l >
]!
' ]
!
'" +C L ? T 5
/ ; | X W J
|¢
È"r"] +C/M
L ?
+C /d |
+ ; W J
C " $
< S R W J S +C A U L
0 < / X C +C 9 _
E >
| / F
Đáy Stack
|È
r"¢"3c/[X
I+C
%
|" \c 7 C L CVo ) = 7 C +
CV l T ? G
0 W J R +C "
$ g1 A V /0 +C
C
r" $=
9 ? F 21 |
/[ W J \
+C
|Ü
È"¢"3c/[X
I+C
33+. .\
Z
1. {Xét xem stack có tràn không?}
# g1
/
pO+CiQ
2. {chuyӇn con trӓ}
21 |
3. {Bә sung phҫn tӱ mӟi X}
+* 21\
È"j
|
È"È"-9/[
+C|
|¿
È"È"-9/[
+Cr
|I
È"È"-9/[
+C¢
r
|
|w
È"È"-9/[
+CÈ
¢
r
|
||
r"È"-9/[
+CÜ
È
¢
r
|
|||
È"È"-9/[
+C
Ü
È
¢
r
|
||r
È"È"-9/[
+C¿
Ü
È
¢
r
|
||¢
È"È"-9/[
+CI
¿
Ü
È
¢
r
|
||È
È"Ü"3c
9/FWJdS+C
B
9 /F W J d S +C + F /d "
3W J /<
9 U =
/d / a
%
|" \c 7 C L q$ CVo ) = q$ 7 C
+C r T. CV L W J ?
9 .
L U
V /0 9
C
r" $=
9 ? F 21 h|
W J /<
9
/ a
||Ü
È"Ü"3c
9/FWJdS+C
33'3+. .a
Z
1. {Xem stack có cҥn không? }
# f1
/
ps+C9it
2. {chuyӇn con trӓ}
21 h|
¿
Ü
È
¢
r
|
||¿
È""-9
9WJCF+Cr
Ü
È
¢
r
¿ |
||I
È""-9
9WJCF+C¢
Ü
È
¢
r
¿ |
||w
È""-9
9WJCF+CÈ
È
Ü ¢
r
¿ |
|r
È""-9
9WJCF+CÜ
È
Ü ¢
r
¿ |
|r|
È""-9
9WJCF+C
¢
È
Ü
r
¿ |
|rr
È""-9
9WJCF+C¿
r
¢
È
Ü
¿ |
|r¢
È""-9
9WJCF+CI
|
r
¢
È
Ü
¿
|rÈ
È"¿":G
YPG
R+C
Đәi cơ sӕ
Khӱ đӋ quy
|rÜ
Ü")=_
|r
Ü"|" <N=
) =
C? 0 : c /[
= B d W. >
X
c
9
/F = B d W C0. >
X I #
0 C?
!
'
#
|r¿
Ü"|" <N=
)A Y=
Quҫy bán vé
|rI
Ü"r"] _/M] C
H
_ L W J
R
_" ?
_ W r / F 2 j F I
X
F I
X I
|rw
Ü"r"] _/M] C
Ví dө:
Z
Z % Sau khi bә
sung thêm G
Z % Sau khi bә
loҥi bӓ A
j
|¢
Ü"r"] _/M] C
|¢|
Ü"r"] _/M] C
Q[n] Q[1]
Q[i]
|¢r
38/_T._P|WJ
_W
E=|2¬
F F
DT
D R A[0]
R A[0] a
L|WJ.CV
8/="
w
E=r2¬ w
DCVT
/"_SL|WJ
"_T
DWv
CL8/" R
6 7
R g h
5 F
f a
F
e b
4 1
d c
3 2
"_T "_đҫy
|¢¢
¢"¢" KWJ
_
_ =
/d
_ L W J. L
C?
l"
j
r F F I
X I
X R _"
% B /[ W J \
_
|¢È
Ü"¢" KWJ
_
Procedure Add_Queue(Q, F, R, X)
Begin
1. {Trưӡng hӧp Queue đã đҫy}
if (F=1 and R=n) or F=R+1 then
begin
write(³Tràn !´);
return
end;
2. {ChӍnh lý con trӓ}
if F=0 then F:=R:=1
else
if R=n then R:=1
else R:=R+1;
3. {Bә sung X}
Q[R]:=X;
4. return;
End; |¢Ü
Ü"È"]9/FWJCF_
|¢
Ü"È"]9/FWJCF_
3
,__.
.j.a
Z
|"( E=DT
#
1 /
pO 9iQ
r"(Z
VRWJ/<
9
a21_*
¢"( S
xF
#
1j
21j21
#
1
21|
21
|
È"j
$
|¢¿
5/M3
2
|¢w
5/M3
2
#
$
% L*L
& "
*
""
'
!
"
()
"
*L
()
5
5 |È
5/M3
2
L &
%
%
' !
%
(
()
5
|È|
|Èr
b. Chèn nút mӟi vào danh sách nӕi đơn trưӟc nút trӓ bӣi con trӓ M
L
$L
% L
% LL
()
()
5
5
()
()
()
()
()
()
5
5
|È¢