You are on page 1of 143




   

 

|
 !!!"

 


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

‡ ¬ /0 ‡ ¬ /03

#  $%&'! (  $ 1 

 )*¢ )2 + *¢

 +', -$ +, -$2 

$%&'! . - . -2$ 

 

' 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

2. Mӝt sӕ đӕi tưӧng thưӡng xuyên thay đәi vӅ cҩu


trúc, đӝ lӟn, như danh sách hӑc viên trong mӝt lӟn
hӑc có thӇ tăng thêm hoһc giҧm đi«NӃu dùng cҩu
trúc dӳ liӋu tĩnh như mҧng đӇ biӇu diӉn các đӕi
tưӧng đó, khiӃn chương trình trӣ nên khó đӑc, khó
bҧo trì và khó có thӇ sӱ dөng bӝ nhӟ có hiӋu quҧ.

‘
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

4. Cuӕi cùng, do bҧn chҩt cӫa các dӳ liӋu tĩnh, chúng sӁ


chiӃm vùng nhӟ dành cho chúng trong suӕt quá trình hoҥt
đӝng cӫa chương trình ' giӳ chӛ đӇ đҩy, lãng phí bӝ nhӟ

‡' 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ӓ

1. BiӃn không đӝng


- Các biӃn không có nhu cҫu thay đәi vӅ sӕ lưӧng, kích
thưӟc«do đó có thӇ xác đӏnh đưӧc ngay cách thӭc lưu trӳ
chúng ngay tӯ đҫu. Các biӃn này đưӧc khai báo như các biӃn
không đӝng
- BiӃn không đӝng là nhӳng biӃn thoҧ:
+ Đưӧc khai báo tưӡng minh
+ Tӗn tҥi khi vào phҥm vi khai báo, và mҩt khi ra khӓi phҥm
vi này
+ Đưӧc cҩp phát vùng nhӣ trong vùng dӳ liӋu (Data segment)
hoһc là Stack (các biӃn cөc bӝ)
+ Kích thưӟc không thay đәi trong suӕt quá trình sӕng
w
II. KiӇu dӳ liӋu con trӓ

2. KiӇ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ӓ

2. KiӇu con trӓ (tiӃp)


‡ Cú pháp đӏnh nghĩa kiӇu con Cú pháp đӏnh nghĩa kiӇu con
trӓ trong ngôn ngӳ C: trӓ trong ngôn ngӳ Pascal:

Typedef <kiӇu con trӓ> * <KiӇu cơ sӣ> Type <kiӇu con trӓ> ^ <KiӇu cơ sӣ>

Ví dө: Ví dө:

#  4    16




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

BiӃn đӝng là nhӳng biӃn thoҧ:


- Không đưӧc khai báo tưӡng minh
- Có thӇ đưӧc cҩp phát và giҧi phóng bӝ nhӟ khi
ngưӡi sӱ dөng yêu cҫu
- Vùng nhӟ đưӧc cҩp phát trên Heap
- Kích thưӟc có thӇ thay đәi trong quá trình sӕ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

‡ @ = 0


 0 A B   0 C0 D0. 9
E /F D      G ?"

‡ - 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
 
 :

Element 1 Element 2 Element 3 Element 4

‡ Mӛi phҫn tӱ có duy nhҩt mӝt phҫn tӱ đӭng trưӟc


(trӯ phҫn tӱ đҫu tiên) và mӝt phҫn tӱ đӭng sau (trӯ
phҫn tӱ cuӕi cùng)

|w
 
8

Element 1

Element 2 Element 3

Element 4 Element 5 Element 6

‡ Mӛi phҫn tӱ có mӝt phҫn tӱ cha (trӯ phҫn tӱ đһc


biӋt root) và có 0 hoһc nhiӅu phҫn tӱ con.
r
;<

Element 1
Element 7
Element 6

Element 2
Element 5

Element 4
Element 3

Element 8

‡ -T W J L ? X I | 5 W J C0"

r|
=

Element 3
Element 1

Element 4 Element 2

‡ 0WJ=CVLX D B  I 


.SLX D 
 YH
="

rr
00:K 


‡ 9
 

‡ Z[KWJI "
‡  WJ;9
‡ AC 
‡ \0
‡  0WJ


3 0
 0WJ ]

Lr 0
 2

‡ +JG

‡ F


!!!"  
 :


$ 

‡ 0] 
‡ $^7 +C
‡ )= _


|"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

‡Trưӡng Data chӭa thông tin cӫa phҫn tӱ


‡Trưӡng Next chӭa đӏa chӍ (mӕi nӕi) tiӃp theo

, 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

"¬d 90

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;

2. {Thӵc hiӋn bә sung}


if L=null then {Danh sách rӛng}
begin
L:=P;
Next(P):=null;
End
Else {Danh sách không rӛng, bә sung vào sau nút trӓ bӣi M}
Begin
Next(p):=Next(M);
Next(M):=p;
End;
3. Return
End;  5/M3
¢¿
- 90/IB   
eWJI  X   
0F/d F-

¢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

‡ E=¢2 e W0]IF/d F-

‡ E=È2 e  0]IF/d F-

È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

Thӫ tөc bә sung phҫn tӱ có trưӡng Data là X vào trưӟc phҫ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/d F-

]
 Z 
New(P)

Ür
eWJ\ W 0IF/d F-

]
 Z 
New(P)

\ Data(P):=X;
Next(p):=M;
P
L:=p;
Ü¢
eWJ\ W 0IF/d F-

]
 Z 
New(P)

\ Data(P):=X;
Next(p):=M;
P
L:=p;
ÜÈ
eWJ\   0IF/d F-

] -

 Z 
‡New(P)

L



P

ÜÜ
eWJ\   0IF/d F-

] -

 Z 
‡New(P)

L



P 
 L
 

ܑ
eWJ\   0IF/d F-

] -

 
‡New(P)

L



P Z 
 L
 

 
Ü¿
eWJ\   0IF/d F-

] -

 \ 
‡New(P)

L



P Z 
 L
 

 
ÜI
" AWJLC0\0

h I 0
KC SAC WB

‡ 0

ZI|2321]// Cho P trӓ đӃn phҫn tӱ đҫu danh sách

ZIr2 C 3fg$&]] 3fg\A


B 
321$73// Cho P chӍ đӃn phҫn tӱ kӃ tiӃp

ZI¢2$ 3fg$&]]A3F WJWA


$=
9 2¬VLWJWA
Üw
" AWJLC0\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

- BiӃn Found =True: Tìm thҩy

=False: Không tìm thҩy

- Con trӓ P trӓ vào nút sӁ tìm thҩy

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 /FWJCF 0

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 đó

Các trưӡng hӧp:


1. Trưӡng hӧp danh sách rӛng
2. Trưӡng hӧp nút trӓ bӣi M là nút đҫu tiên cӫa
danh sách
3. Trưӡng hӧp M không phҧi là nút đҫu
a. Tìm đӃn nút đӭng trưӟc nút trӓ bӣi M
b. Loҥi bӓ nút trӓ bӣi M
c. Đưa nút bӏ loҥi vӅ danh sách trӕng
¿‘
"]9 /FWJCF 0
Procedure Delete(Header, M)
Begin
1. {Trưӡng hӧp danh sách rӛng}
If Header=Nil Then Begin
Write(µDanh sách rӛng¶);
Return {KӃt thúc giҧi thuұt}
End;
2. {Trưӡng hӧp nút trӓ bӣi M là nút đҫu tiên cӫa danh sách}
If M=Header Then Begin
Header:=Next(M);
Dispose(M)
Return; {KӃt thúc giҧi thuұt}
End;
3. {Tìm đӃn nút đӭng trưӟc nút trӓ bӣi M}
P:=Header;
While Next(P)<>M Do P:=Next(P);
4. {Loҥi bӓ nút trӓ bӣi M}
Next(P):=Next(M)
5. {Đưa nút bӏ loҥi vӅ danh sách trӕng}
Dispose(M)
6. Return;
¿¿
END;
- 90/IB   

¿I
]9 /FWJW CF 0

Header

 Z 

Header:=Next(M);

¿w
]9 /FWJW CF 0

Header

 Z 

Header:=Next(M);

Dispose(M)

I
]9 /FWJW CF 0

Header

 Z 

Header:=Next(M);

Dispose(M)

I|
]9 /FWJ% CF 0

Header

 Z  

Ir
]9 /FWJ% CF 0

Header

 Z  
3

P:=Header;


]9 /FWJ% CF 0

Header

 Z  
3

P:=Header;
P:=Next(P);

]9 /FWJ% CF 0

Header

 Z  
3

P:=Header; Next(P):=Next(M);
P:=Next(P);

]9 /FWJ% CF 0

Header

 Z  
3

P:=Header; Next(P):=Next(M);
P:=Next(P); Dispose(M)

]9 /FWJ% CF 0

Header

 Z  
3

P:=Header; Next(P):=Next(M);
P:=Next(P); Dispose(M)
I¿
"3c 0

  Y E =.    D  0 ?


^   0  W R  0" I T
 W.  W B    X c 0 
L I 
 P  E " 0 c
0    J = V  /M R G   "

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|

þ

% )


#"- 9%cr0X  
‡$73|1$

‡$73|21_

3
 Z a b

3| Ghép thành công !

þ

% )


#"%cr0X  
3 %3._
Z%!$
O  
 
#_1$
 j
O  
 
!# 31$
 
Z 
321_
j

O
 
3|213

 $73|fg$

 3|21$73|O  !"#


 
$73|21_{Ghép}
j
$ wÜ
 5/M3
2
Procedure Ghep(Var P:pointer; Q:Pointer);
Var p1:Pointer;
Begin
if Q=Nil Then
Begin
Write(µDanh sách rӛng¶);
Exit;
End;
If P=Nil Then
Begin
P:=Q;
Exit;
End;
If (p<nil) and (q<>nil) then
Begin
P1:=P;
While P1^.next<>nil Do P1:=p1^.Next;
p1^.next:=Q;
end;
END; w‘
"+`7 K0LX  

‡ +  K>% 0A?


/ 
Ii

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

‡ Mӛi nút gӗm 3 trưӡng

‡LPTR: Là con trӓ trӓ tӟi nút đӭng trưӟc

‡RPTR: Là con trӓ trӓ tӟi nút đӭng sau

‡Data: Chӭa thông tin cӫa nút

|
"-X05/ 

‡ )AR0X ¬c

] j

 Z \ a

+  KB> 0Ai

||
È"$^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

‡ $   D I H < S   X  S X A


C +C T. 1" ¬ | W J = /[  
+C. U ^ K |" ¬ W J /<
9  CF +C.
U    |"
‡ L? 
R+CA2
+|+r+¢+È+Ü+‘+

Đáy Stack

|È
r"¢"3c/[X  I +C

B    /[  W J \  +C


  /d
 + L  W J" n 8
  F. F I S +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 
/ 
p O+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 
/ 
p s+C9it


2. {chuyӇn con trӓ}
21 h|

3. {đưa phҫn tӱ bӏ loҥi ra}


a21+* |
 ||‘
È"‘"- 9
9 WJCF +C|

¿
‘
Ü
È
¢
r
|

||¿
È"‘"- 9
9 WJCF +Cr

‘
Ü
È
¢
r
¿ |

||I
È"‘"- 9
9 WJCF +C¢

Ü
È
¢
‘ r
¿ |

||w
È"‘"- 9
9 WJCF +CÈ

È
Ü ¢
‘ r
¿ |

|r
È"‘"- 9
9 WJCF +CÜ

È
Ü ¢
‘ r
¿ |

|r|
È"‘"- 9
9 WJCF +C‘

¢
È
Ü
‘ r
¿ |

|rr
È"‘"- 9
9 WJCF +C¿

r
¢
È
Ü
‘
¿ |

|r¢
È"‘"- 9
9 WJCF +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 #

‡ $ .   R _  X   = u


9 ?  c 7
J.  d | W   d | W C0.
N
  I A  I" A  _ l = >

  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

‡ $  D I H < S   X A C _ T.


j1
1. C /[  | W J  _ j ^ K |. C

9 /F W J CF _


U ^ K |

|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  

‡   K 0 [ P  L ? 7   A X



 0 W J R _ U  ? C` CV  
I C B   /[  
9 /F

‡ ¬` G /M 0  CV   I  


_ = [ P  C ? l l. N
 I
c 
  _ A _*| =   P  _*" 
L A  

|¢|
Ü"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 _

%    B   


9 W J  d
X I
 CF D. V   P I W J /<
9 U =
/
 d a

‡ $ _TA V/0 C 


‡$ _CVTA
9 /F

|¢‘
Ü"È"]9 /FWJCF _
3
,__.
.j.a
Z 
|"( E=DT
#
1  / 
p O 9iQ


r"(Z
V RWJ/<
9 
a21_*


¢"( S
xF
#
1j 
21j21 

#
1 
21|


21
|
È"j
$
|¢¿
 5/M3
2

Procedure Insert(Var L:Pointer; M: Pointer; x: item);


Var p: pointer;
Begin
New(p);
P^.Data:=x;
If L=Nil then Begin
P^.Next:=Nil;
L:=p;
End
Else Begin
P^.Next:=M^.Next;
M^.Next:=p;
End;
End; |¢I
 5/M3
2

  #  


$
 
% LL
 & "  


"" 
'   !  
" 
 ()

"

 ()

5

|¢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
|È¢

You might also like