Title: TRU?NG
1TRU?NG ÐH CÔNG NGH? THÔNG TIN
Giáo viên Mai Xuân Hùng Email hungmx_at_uit.edu.vn
2Bài Toán Tìm Ki?m
- Cho danh sách có n ph?n t? a0, a1, a2, an-1.
- Ð? don gi?n trong vi?c trình bày gi?i thu?t ta
dùng m?ng 1 chi?u a d? luu danh sách các ph?n t?
nói trên trong b? nh? chính. - Tìm ph?n t? có khoá b?ng X trong m?ng
- Gi?i thu?t tìm ki?m tuy?n tính (tìm tu?n t?)
- Gi?i thu?t tìm ki?m nh? phân
- Luu ý Trong quá trình trình bày thu?t gi?i ta
dùng ngôn ng? l?p trình C.
3Tìm Ki?m Tuy?n Tính
- Ý tu?ng So sánh X l?n lu?t v?i ph?n t? th? 1,
th? 2,c?a m?ng a cho d?n khi g?p du?c khóa c?n
tìm, ho?c tìm h?t m?ng mà không th?y. - Các bu?c ti?n hành
- Bu?c 1 Kh?i gán i0
- Bu?c 2 So sánh ai v?i giá tr? x c?n tìm, có 2
kh? nang - ai x tìm th?y x. D?ng
- ai ! x sang bu?c 3
- Bu?c 3 ii1 // Xét ti?p ph?n t? k? ti?p trong
m?ng - N?u iN H?t m?ng. D?ng
- Ngu?c l?i L?p l?i bu?c 2
4Thu?t Toán Tìm Ki?m Tuy?n Tính
- Hàm tr? v? 1 n?u tìm th?y, ngu?c l?i tr? v? 0
- int LinearSearch(int a,int n, int x)
-
- int i0
- while((iltn)(ai!x))
- i
- if(in)
- return 0 //Tìm không th?y x
- else
- return 1 //Tìm th?y
5Minh H?a Thu?t Toán Tìm Ki?m Tuy?n Tính
Tìm th?y 6 t?i v? trí 4
6
2
8
5
1
6
4
6
6Minh H?a Thu?t Toán Tìm Ki?m Tuy?n Tính (tt)
i7, không tìm th?y
2
8
5
1
6
4
6
7Thu?t Toán Tìm Ki?m Nh? Phân
- Ðu?c áp d?ng trên m?ng dã có th? t?.
- Ý tu?ng .
- Gi? x? ta xét m?ng có th? t? tang, khi ?y ta có
- ai-1ltailtai1
- N?u Xgtai thì X ch? có th? xu?t hi?n trong do?n
ai1, an-1 - N?u Xltai thì X ch? có th? xu?t hi?n trong do?n
a0, ai-1 - Ý tu?ng c?a gi?i thu?t là t?i m?i bu?c ta so sánh
X v?i ph?n t? d?ng gi?a trong dãy tìm ki?m hi?n
hành, d?a vào k?t qu? so sánh này mà ta quy?t
d?nh gi?i h?n dãy tìm ki?m ? n?a du?i hay n?a
trên c?a dãy tìm ki?m hi?n hành.
8Các Bu?c Thu?t Toán Tìm Ki?m Nh? Phân
- Gi? s? dãy tìm ki?m hi?n hành bao g?m các ph?n t?
n?m trong aleft, aright, các bu?c c?a gi?i thu?t
nhu sau - Bu?c 1 left0 rightN-1
- Bu?c 2
- mid(leftright)/2 //ch? s? ph?n t? gi?a dãy
hi?n hành - So sánh amid v?i x. Có 3 kh? nang
- amid x tìm th?y. D?ng
- amidgtx Right mid-1
- amidltx Left mid1
- Bu?c 3 N?u Left ltRight // còn ph?n t? trong
dãy hi?n hành - L?p l?i bu?c 2
- Ngu?c l?i D?ng
9Cài Ð?t Thu?t Toán Tìm Nh? Phân
- Hàm tr? v? giá tr? 1 n?u tìm th?y, ngu?c l?i hàm
tr? v? giá tr? 0 - int BinarySearch(int a,int n,int x)
- int left, right, mid left0 rightn-1
- do
- mid(leftright)/2
- if(amidx) return 1
- else if(amidltx) leftmid1
- else rightmid-1
- while(leftltright)
- return 0
10- void BinarySearch(int a,int n,int x)
- int left, right, mid left0 rightn-1
- do
- mid(leftright)/2
- if(amidx)
- printf(thay)
- return
-
- else if(amidltx) leftmid1
- else rightmid-1
- while(leftltright)
- printf(khong thay)
-
11Minh H?a Thu?t Toán Tìm Nh? Phân
Tìm th?y 2 t?i v? trí 1
X2
R
M
L
2
1
2
4
6
9
10
7
12Minh H?a Thu?t Toán Tìm Nh? Phân (tt)
X-1
M
R
L
1
2
4
6
9
10
7
L0 R-1 gt không tìm th?y X-1
13BÀI T?P ÁP D?NG
3 5 6 8 12 17 19
0 1 2 3 4 5 6
- Ghi k?t qu? ch?y t?ng bu?c khi tìm X19
- B1 l0, r6, mid(lr)/2, Amid 8, 8lt19
- B2 l mid14, mid(lr)/25, Amid 17lt19
- B3 lmid16, mid(lr)/26, Amid19 X d?ng
14G?i hàm tìm tuy?n tính và tìm nh? phân
- void main()
-
- int a100, n, tv,x
- nh?p s? ph?n t? n
- g?i hàm nh?p m?ng 1 chi?u
- nh?p giá tr? c?n tìm x
- tvLinearSearch(a,n,x)
- if(tv1) printf(tìm th?y)
- else printf(không tìm th?y)
- Tuong t? cho l?i g?i hàm BinarySearch
15Các Thu?t Toán S?p X?p
- 1. Ð?i ch? tr?c ti?p Interchange Sort
- 2. Ch?n tr?c ti?p Selection Sort
- 3. N?i b?t Bubble Sort
- 4. Chèn tr?c ti?p Insertion Sort
- 5. Quick Sort
16Ð?i Ch? Tr?c Ti?p Interchange Sort
- Ý tu?ng Xu?t phát t? d?u dãy, tìm t?t các các
ngh?ch th? ch?a ph?n t? này, tri?t tiêu chúng
b?ng cách d?i ch? 2 ph?n t? trong c?p ngh?ch th?.
L?p l?i x? lý trên v?i ph?n t? k? trong dãy.
17Các Bu?c Ti?n Hành
- Bu?c 1 i 0 // b?t d?u t? d?u dãy
- Bu?c 2 j i1 //tìm các ngh?ch th? v?i ai
- Bu?c 3
- Trong khi j lt N th?c hi?n
- N?u ajltai //xét c?p ai, aj
- Swap(ai,aj)
- j j1
- Bu?c 4 i i1
- N?u i lt N-1 L?p l?i Bu?c 2.
- Ngu?c l?i D?ng.
18Ð?i Ch? Tr?c Ti?p Interchange Sort
- Cho dãy s? a
- 12 2 8 5 1 6 4 15
19Ð?i Ch? Tr?c Ti?p Interchange Sort
20Ð?i Ch? Tr?c Ti?p Interchange Sort
21Ð?i Ch? Tr?c Ti?p Interchange Sort
22Ð?i Ch? Tr?c Ti?p Interchange Sort
23Ð?i Ch? Tr?c Ti?p Interchange Sort
24Demo
j
2
8
5
1
6
4
15
12
1
i
25Demo
j
12
5
2
6
4
15
1
2
8
0 i
26Demo
j
2
12
8
5
6
4
15
1
4
0 i
27Demo
j
2
4
12
8
6
5
15
1
5
0 i
28Demo
j
5
12
8
4
2
6
15
1
6
0 i
29Demo
j
8
6
12
8
15
4
5
2
1
0 i
30Demo
j
12
6
8
12
15
4
5
2
1
0 i
31Demo
2
4
5
6
8
12
15
1
32Cài Ð?t Ð?i Ch? Tr?c Ti?p
- void Swap(int x,int y)
- int tam
- tamx
- xy
- ytam
-
- void InterchangeSort(int a, int N ) int i,
j for (i 0 iltN-1 i) for (j i1 j lt
N j) if(aj lt ai) // Th?a 1 c?p ngh?ch
th? Swap(ai, aj)
33Bài t?p áp d?ng
9
7
4
5
8
34Bài t?p áp d?ng
35Ch?n Tr?c Ti?p Selection Sort
- Ý tu?ng
- Ch?n ph?n t? nh? nh?t trong N ph?n t? trong dãy
hi?n hành ban d?u. - Ðua ph?n t? này v? v? trí d?u dãy hi?n hành
- Xem dãy hi?n hành ch? còn N-1 ph?n t? c?a dãy
hi?n hành ban d?u - B?t d?u t? v? trí th? 2
- L?p l?i quá trình trên cho dãy hi?n hành... d?n
khi dãy hi?n hành ch? còn 1 ph?n t?
36Các Bu?c C?a Thu?t Toán Ch?n Tr?c Ti?p
- Bu?c 1 i 0
- Bu?c 2 Tìm ph?n t? amin nh? nh?t trong
dãy hi?n hành t? ai d?n aN - Bu?c 3 Ð?i ch? amin và ai
- Bu?c 4 N?u i lt N-1 thì
- i i1 L?p l?i Bu?c 2 Ngu
?c l?i D?ng.
37Ch?n Tr?c Ti?p Selection Sort
- Cho dãy s? a
- 12 2 8 5 1 6 4 15
38Ch?n Tr?c Ti?p Selection Sort
39Ch?n Tr?c Ti?p Selection Sort
40Ch?n Tr?c Ti?p Selection Sort
41Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a0, a4)
V? trí nh? nh?t(0,7)
vtmin
2
8
5
1
6
4
15
12
i
42Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a1, a1)
V? trí nh? nh?t(1,7)
vtmin
2
8
5
12
6
4
15
1
i
43Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a2, a6)
V? trí nh? nh?t(2,7)
vtmin
2
8
5
12
6
4
15
1
i
44Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a3, a3)
V? trí nh? nh?t(3, 7)
vtmin
2
4
5
12
6
8
15
1
i
45Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a4, a5)
V? trí nh? nh?t(4, 7)
vtmin
2
4
5
12
6
8
15
1
i
46Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
Swap(a5, a6)
V? trí nh? nh?t(5,7)
vtmin
2
4
5
6
12
8
15
1
i
47Minh H?a Thu?t Toán Ch?n Tr?c Ti?p
V? trí nh? nh?t(6, 7)
vtmin
12
15
2
4
5
6
8
12
15
1
i
48Cài Ð?t Thu?t Toán Ch?n Tr?c Ti?p
- void SelectionSort(int a,int n )
-
- int vtmin,i,j // ch? s? ph?n t? nh? nh?t trong
dãy hi?n hành - for (i0 iltn-1 i) //ch? s? d?u tiên c?a
dãy hi?n hành - vtmin i
- for(j i1 j ltN j)
- if (aj lt avtmin)
- vtmin j // luu vtrí ph?n t? hi?n nh? nh?t
- Swap(avtmin,ai)
49Cho bi?t k?t qu? ch?y t?ng bu?c
50N?i B?t Bubble Sort
- Ý tu?ng
- Xu?t phát t? cu?i dãy, d?i ch? các c?p ph?n t? k?
c?n d? dua ph?n t? nh? hon trong c?p ph?n t? dó
v? v? trí dúng d?u dãy hi?n hành, sau dó s? không
xét d?n nó ? bu?c ti?p theo, do v?y ? l?n x? lý
th? i s? có v? trí d?u dãy là i. - L?p l?i x? lý trên cho d?n khi không còn c?p ph?n
t? nào d? xét.
51N?i B?t Bubble Sort
- Bu?c 1 i 0 // l?n x? lý d?u tiên
- Bu?c 2 j N-1//Duy?t t? cu?i dãy ngu?c v? v?
trí i - Trong khi (j gt i) th?c hi?n
- N?u ajltaj-1
- Doicho(aj,aj-1)
- j j-1
- Bu?c 3 i i1 // l?n x? lý k? ti?p
- N?u i N-1 H?t dãy. D?ng
- Ngu?c l?i L?p l?i Bu?c 2.
52N?i B?t Bubble Sort
- Cho dãy s? a
- 2 12 8 5 1 6 4 15
53N?i B?t Bubble Sort
54N?i B?t Bubble Sort
55N?i B?t Bubble Sort
56N?i B?t Bubble Sort
57Minh H?a Thu?t Toán
j
2
8
5
1
6
4
15
12
1
i
58Minh H?a Thu?t Toán
j
12
2
8
5
4
6
15
1
2
i
59Minh H?a Thu?t Toán
j
4
2
12
4
8
5
6
15
1
i
60Minh H?a Thu?t Toán
j
2
4
12
8
5
6
15
1
5
i
61Minh H?a Thu?t Toán
j
2
4
5
12
8
6
15
1
6
i
62Minh H?a Thu?t Toán
j
2
4
5
6
12
8
15
1
8
i
63Minh H?a Thu?t Toán
j
15
2
4
5
6
8
12
15
1
12
i
64Cài Ð?t Thu?t Toán N?i B?t
- void BubbleSort(int a,int n)
- int i, j for (i 0 iltn-1 i) for (j
n-1 j gti j --) if(ajlt aj-1)// n?u sai
v? trí thì d?i ch? Swap(aj, aj-1)
65Ghi k?t qu? ch?y t?ng bu?c
3
9
4
7
5
3
4
9
7
5
66Ghi k?t qu? ch?y t?ng bu?c
3
4
9
7
5
3
4
9
5
7
3
4
5
9
7
3
4
5
7
9
67Chèn Tr?c Ti?p Insertion Sort
- Gi? s? có m?t dãy a0 , a1 ,... ,an-1 trong dó i
ph?n t? d?u tiên a0 , a1 ,... ,ai-1 dã có th? t?.
- Tìm cách chèn ph?n t? ai vào v? trí thích h?p
c?a do?n dã du?c s?p d? có dãy m?i a0 , a1,...
,ai tr? nên có th? t?. V? trí này chính là v? trí
gi?a hai ph?n t? ak-1 và ak th?a ak-1 lt ai lt ak
(1ki).
68Chèn Tr?c Ti?p Insertion Sort
- Bu?c 1 i 1 //gi? s? có do?n a1 dã du?c s?p
- Bu?c 2 x ai Tìm v? trí pos thích h?p trong
do?n a1 d?n ai-1 d? chèn ai vào - Bu?c 3 D?i ch? các ph?n t? t? apos d?n ai-1
sang ph?i 1 v? trí d? dành ch? cho ai - Bu?c 4 apos x //có do?n a1..ai dã du?c
s?p - Bu?c 5 i i1
- N?u i lt n L?p l?i Bu?c 2
- Ngu?c l?i D?ng
69Chèn Tr?c Ti?p Insertion Sort
- Cho dãy s?
- 12 2 8 5 1 6 4 15
70Chèn Tr?c Ti?p Insertion Sort
71Chèn Tr?c Ti?p Insertion Sort
72Minh H?a Thu?t Toán Insertion Sort
2
8
5
1
6
4
15
12
73Minh H?a Thu?t Toán Insertion Sort
Insert a1 into (0,0)
pos
2
2
8
5
1
6
4
15
12
i
x
74Minh H?a Thu?t Toán Insertion Sort
Insert a2 into (0, 1)
pos
8
12
8
5
1
6
4
15
2
i
x
75Minh H?a Thu?t Toán Insertion Sort
Insert a3 into (0, 2)
pos
5
8
12
5
1
6
4
15
2
i
x
76Minh H?a Thu?t Toán Insertion Sort
Insert a4 into (0, 3)
pos
5
8
12
1
6
4
15
2
1
i
x
77Minh H?a Thu?t Toán Insertion Sort
Insert a5 into (0, 4)
pos
6
2
5
8
12
6
4
15
1
i
x
78Minh H?a Thu?t Toán Insertion Sort
Insert a6 into (0, 5)
pos
4
2
5
6
8
12
4
15
1
i
x
79Minh H?a Thu?t Toán Insertion Sort
Insert a8 into (0, 6)
pos
15
2
4
5
6
8
12
15
1
i
x
80Minh H?a Thu?t Toán Insertion Sort
pos
2
4
5
6
8
12
15
1
81Cài Ð?t Thu?t Toán Chèn Tr?c Ti?p
- void InsertionSort(int d, int n ) int pos,
i int x//luu giá tr? ai tránh b? ghi dè khi
d?i ch? các ph?n t?. for(i1 iltn i) //do?n
a0 dã s?p - x ai pos i-1 // tìm v? trí chèn x
- while((pos gt 0)(apos gt x)) //k?t h?p
d?i ch? các ph?n t? s? d?ng sau x trong dãy m?i - apos1 apos pos-- apos1
x // chèn x vào dãy
82K?t qu? ch?y t?ng bu?c
7
9
4
3
5
4
7
9
3
5
3
4
7
9
5
3
4
5
7
9
83Quick Sort
- Ý tu?ng
- Gi?i thu?t QuickSort s?p x?p dãy a1, a2 ..., aN
d?a trên vi?c phân ho?ch dãy ban d?u thành 3 ph?n
- Ph?n 1G?m các ph?n t? có giá tr? bé hon x
- Ph?n 2 G?m các ph?n t? có giá tr? b?ng x
- Ph?n 3 G?m các ph?n t? có giá tr? l?n hon x
- v?i x là giá tr? c?a m?t ph?n t? tùy ý trong
dãy ban d?u.
84Quick Sort - Ý Tu?ng
- Sau khi th?c hi?n phân ho?ch, dãy ban d?u du?c
phân thành 3 do?n - 1. ak x , v?i k 0 .. j
- 2. ak x , v?i k j1 .. i-1
- 3. ak ? x , v?i k i..N-1
85Quick Sort Ý Tu?ng
- Ðo?n th? 2 dã có th? t?.
- N?u các do?n 1 và 3 ch? có 1 ph?n t? dã có th?
t? - ? khi dó dãy con ban d?u dã du?c s?p.
86Quick Sort Ý Tu?ng
- Ðo?n th? 2 dã có th? t?.
- N?u các do?n 1 và 3 có nhi?u hon 1 ph?n t? thì
dãy ban d?u ch? có th? t? khi các do?n 1, 3 du?c
s?p. - Ð? s?p x?p các do?n 1 và 3, ta l?n lu?t ti?n hành
vi?c phân ho?ch t?ng dãy con theo cùng phuong
pháp phân ho?ch dãy ban d?u v?a trình bày
87Gi?i Thu?t Quick Sort
- Bu?c 1 N?u left right //dãy có ít hon 2 ph?n
t? - K?t thúc //dãy dã du?c s?p x?p
- Bu?c 2 Phân ho?ch dãy aleft aright thành các
do?n aleft.. aj, aj1.. ai-1, ai.. aright - Ðo?n 1 ? x
- Ðo?n 2 aj1.. ai-1 x
- Ðo?n 3 ai.. aright ? x
- Bu?c 3 S?p x?p do?n 1 aleft.. aj
- Bu?c 4 S?p x?p do?n 3 ai.. aright
88Gi?i Thu?t Quick Sort
- Bu?c 1 Ch?n tùy ý m?t ph?n t? ak trong dãy
là giá tr? m?c ( l k r) - x ak i l j r
- Bu?c 2 Phát hi?n và hi?u ch?nh c?p ph?n t?
- ai, aj n?m sai ch?
- Bu?c 2a Trong khi (ailtx) i
- Bu?c 2b Trong khi (ajgtx) j--
- Bu?c 2c N?u ilt j Ðoicho(ai,aj)
- Bu?c 3 N?u i lt j L?p l?i Bu?c 2. Ngu?c
l?i D?ng
89Quick Sort Ví D?
- Cho dãy s? a
- 12 2 8 5 1 6 4 15
Phân ho?ch do?n l 0, r 7
x a3 5
12
2
8
5
1
6
4
15
l0
r7
90Quick Sort Ví D?
91Quick Sort Ví D?
x a2 2
92Quick Sort Ví D?
x a5 6
r7
l4
93 94Quick Sort Ví D?
Phaân hoaïch daõy
5
2
8
1
6
4
15
12
right
left
95Quick Sort Ví D?
Phaân hoaïch daõy
2
8
5
1
6
12
15
4
right
left
96Quick Sort Ví D?
2
1
5
8
6
12
15
4
right
left
97Quick Sort Ví D?
Phaân hoaïch daõy
2
4
5
8
6
12
15
1
right
left
Saép xeáp ñoaïn 3
98Quick Sort Ví D?
2
4
5
6
8
12
15
1
right
left
Saép xeáp ñoaïn 3
99Quick Sort
- void QuickSort(int a, int left, int right)
- int i, j, x
- x a(leftright)/2
- i left j right
- while(i lt j)
-
- while(ai lt x) i
- while(aj gt x) j--
- if(i lt j)
-
- Doicho(ai,aj)
- i j--
-
-
- if(leftltj)
- QuickSort(a, left, j)
- if(iltright)
- QuickSort(a, i, right)
100Bài t?p áp d?ng
8
1
4
12
2
5
6
15
8
1
12
4
2
5
6
15
1
8
12
4
2
5
6
15
4
8
12
1
2
5
6
15
4
6
12
1
2
5
8
15
101N?I DUNG
102Bi?n Tinh
- Ðu?c khai báo tu?ng minh, có tên g?i
- T?n t?i trong ph?m vi khai báo
- Ðu?c c?p phát trong stack
- Kích thu?c không d?i gt không t?n d?ng hi?u qu?
b? nh? - Ví d? int x,y
- char c
- float f5
- Khi bi?t ch?c nhu c?u s? d?ng d?i tu?ng tru?c khi
th?c s? x? lý dùng bi?n không d?ng
103Ví D? H?n Ch? C?a Bi?n Tinh
- Khai báo m?ng m?t chi?u có th? ch?a t?i da 100
ph?n t? - int a100
- int n // S? ph?n t? x? d?ng th?c s?
- N?u nh?p n lt100, du vùng nh? gt lãng phí
- N?u nh?p n gt 50 gt thi?u ch? !
104Bi?n Ð?ng
- Không du?c khai báo tu?ng minh, không có tên g?i
- Xin khi c?n, gi?i phóng khi s? d?ng xong
- Ðu?c c?p phát trong heap
- Linh d?ng v? kích thu?c
- V?n d? bi?n d?ng không có tên g?i tu?ng minh,
làm sao thao tác ?
105Ki?u con tr?
- Ki?u con tr? dùng luu d?a ch? c?a m?t d?i tu?ng
d? li?u khác. - Bi?n thu?c ki?u con tr? Tp là bi?n mà giá tr? c?a
nó là d?a ch? cu? m?t vùng nh? ?ng v?i m?t bi?n
ki?u T, ho?c là giá tr? NULL. - Khai báo trong C
- typedef int intpointer
- intpointer p
- B?n thân bi?n con tr? là không d?ng
- Dùng bi?n con tr? d? luu gi? di? ch? c?a bi?n
d?ng gt truy xu?t bi?n d?ng thông qua bi?n con tr?
106Các thao tác trên ki?u con tr?
- T?o ra m?t bi?n d?ng và cho con tr? p ch? d?n
nó - void malloc(size)
- void calloc(n,size)
- new // hàm c?p phát b? nh? trong C
- H?y m?t bi?n d?ng do p ch? d?n
- Hàm free(p) hu? vùng nh? c?p phát b?i hàm malloc
ho?c calloc do p tr? t?i - Hàm delete p hu? vùng nh? c?p phát b?i hàm new do
p tr? t?i
107S? d?ng bi?n tinh, con tr? và bi?n d?ng
- Toán t? l?y d?a ch?
- L?y giá tr? t?i vùng nh? con tr? dang luu
- int y 5
- int yP
- yP y // yP gets address of y
- printf(d,d,y,yp)
1f is address of a
111f
1f
1f
5
y
yP
- Giá tr? yP là m?t d?a ch?
- Ð?a ch? c?a bi?n y là giá tr? c?a con tr? yp
108Ví d? c?p phát d?ng cho m?ng m?t chi?u
- void main()
-
- int a, n
- printf(Nhap so phan tu cua mang n)
- scanf(d,n)
- a(int)malloc(nsizeof(int))
- //Nhap m?ng 1 chi?u
- //Thao tác các ph?n t? trên m?ng
- free (a)
-
- H?n ch? Các vùng nh? ph?i tr?ng m?t cách liên
t?c m?i c?p du?c
109H?n ch? c?a cách c?p phát d?ng cho m?ng
110Ki?u danh sách
- Danh sách các ph?n t? có cùng ki?u
- Danh sách là m?t ki?u d? li?u tuy?n tính
- M?i ph?n t? có nhi?u nh?t 1 ph?n t? d?ng tru?c
- M?i ph?n t? có nhi?u nh?t 1 ph?n t? d?ng sau
- Là ki?u d? li?u quen thu?c trong th?c t?
- Danh sách h?c sinh
- Danh m?c sách trong thu vi?n
- Danh b? di?n tho?i
- Danh sách các nhân viên trong công ty
111Các hình th?c t? ch?c danh sách
- CTDL cho m?i ph?n t? ?
- Th? hi?n liên k?t c?a các ph?n t? ?
- Hai hình th?c co b?n
- Liên k?t ng?m M?ng
- Liên k?t tu?ng minh Danh sách liên k?t
112Danh sách liên k?t ng?m (m?ng)
- M?i liên h? gi?a các ph?n t? du?c th? hi?n ng?m
- xi ph?n t? th? i trong danh sách
- xi , xi1 là k? c?n trong danh sách
- Ph?i luu tr? liên ti?p các ph?n t? trong b? nh?
- công th?c xác d?nh d?a ch? ph?n t? th?
i address(i) address(1) (i-1)sizeof(T) - Uu di?m Truy xu?t tr?c ti?p, nhanh chóng
- Nhu?c di?m
- S? d?ng b? nh? kém hi?u qu?
- Kích thu?c c? d?nh
- Các thao tác thêm vào , lo?i b? không hi?u qu?
113Liên k?t tu?ng minh(Danh sánh liên k?t)
- CTDL cho m?t ph?n t?
- Thông tin b?n thân
- Ð?a ch? c?a ph?n t? k? trong danh sách
- M?i ph?n t? là m?t bi?n d?ng
- Uu di?m
- S? d?ng hi?u qu? b? nh?
- Linh d?ng v? s? lu?ng ph?n t?
114Các lo?i danh sách liên k?t
- Danh sách liên k?t don M?i ph?n t? liên k?t v?i
ph?n t? d?ng sau nó trong danh sách
- Danh sách liên k?t kép M?i ph?n t? liên k?t
v?i ph?n t? d?ng tru?c và sau nó trong danh sách
- Danh sách liên Vòng Ph?n t? cu?i danh sách
liên v?i ph?n t? d?u danh sách
115Các lo?i danh sách liên k?t (tt)
- Danh sách liên Vòng Ph?n t? cu?i danh sách
liên v?i ph?n t? d?u danh sách - Danh sách liên k?t don vòng
- Danh sách liên k?t dôi vòng
A
B
C
D
116N?I DUNG
117T? Ch?c C?a DSLK Ðon
- M?i ph?n t? liên k?t v?i ph?n t? d?ng li?n sau
trong danh sách - M?i ph?n t? trong danh sách liên k?t don là m?t
c?u trúc có hai thành ph?n - Thành ph?n d? li?u Luu tr? thông tin v? b?n thân
ph?n t? - Thành ph?n liên k?t Luu d?a ch? ph?n t? d?ng sau
trong danh sách ho?c b?ng NULL n?u là ph?n t?
cu?i danh sách.
118Bài t?p áp d?ng
- Dùng danh sách liên k?t don d? qu?n lý các sinh
viên trong 1 l?p h?c, bi?t r?ng c?u trúc d? li?u
c?a m?t sinh viên g?m tên (chu?i ký t?), mã s?
(chu?i ký t?), di?m trung bình (s? th?c). Th?c
hi?n các yêu c?u sau - 1. Thêm 1 sinh viên vào l?p h?c (thêm d?u, thêm
cu?i) - 2. Tìm ki?m 1 sinh vi?n có tên X trong l?p h?c (x
nh?p). - 3. Tìm 1 sinh viên có mã s? b?ng X (X nh?p)
- 4. Li?t kê tên cung di?m trung bình c?a nh?ng
sinh viên có di?m trung bình gt5 - 5. Ð?m s? sinh viên có tên b?ng X trong l?p h?c
119- 6. Cho bi?t di?m trung bình cao nh?t trong l?p
h?c là bao nhiêu - 7. Li?t kê tên cùng di?m trung bình c?a nh?ng
sinh viên có di?m trung bình cao nh?t trong l?p
h?c. - 8. Xóa sinh viên có mã s? b?ng x trong l?p h?c,
n?u không có thì thông báo không có - 9. X?p th? h?ng cho các sinh viên trong l?p
- 10. S?p x?p danh sách sinh viên tang theo di?m
trung bình - 11. Chèn m?t sinh viên vào danh sach sinh viên dã
du?c s?p x?p ? câu 10, sao cho sau khi chèn danh
sach sinh viên v?n du?c s?p x?p
120CTDL c?a DSLK don
- C?u trúc d? li?u c?a 1 nút trong List don
- typedef struct tagNode
- Data Info // Luu thông tin b?n thân
- struct tagNode pNext //Luu d?a ch? c?a Node
d?ng sau - Node
- C?u trúc d? li?u c?a DSLK don
- typedef struct tagList
- Node pHead//Luu d?a ch? Node d?u tiên trong
List - Node pTail //Luu d?a ch? c?a Node cu?i cùng
trong List - List // ki?u danh sách liên k?t don
121Áp d?ng cho bài qu?n lý sinh viên
- typedef struct tagSV
-
- char ten40
- char MSSV40
- float ÐTB
- SV//C?u trúc d? li?u c?a m?t sinh viên
- typedef struct tagNode
-
- SV Info // Luu thông tin b?n thân
- struct tagNode pNext // Luu d?a ch? c?a Node
d?ng sau - Node
122- C?u trúc d? li?u c?a DSLK don
- typedef struct
- Node pHead//Luu d?a ch? Node d?u tiên trong
List - Node pTail //Luu d?a ch? c?a Node cu?i cùng
trong List - List // ki?u danh sách liên k?t don
123Cách truy xu?t d?n các thu?c tính c?a d?i tu?ng
- Node p,q
- p.Info.DTB9.0
- p-gtpNext//sai vì p không là con tr?
- q-gtInfo.DTB9.0
- q.pNext//sai vì q là con tr?
124Ví d? t? ch?c DSLK don trong b? nh?
Trong ví d? trên thành ph?n d? li?u là 1 s?
nguyên
125Các thao tác co b?n trên DSLK don
- T?o 1 danh sách liên k?t don r?ng
- T?o 1 nút có tru?ng Infor b?ng x
- Tìm m?t ph?n t? có Info b?ng x
- Thêm m?t ph?n t? có khóa x vào danh sách
- H?y m?t ph?n t? trong danh sách
- Duy?t danh sách
- S?p x?p danh sách liên k?t don
126Kh?i t?o danh sách liên k?t
- Ð?a ch? c?a nút d?u tiên, d?a ch? c?a nút cu?i
cùng d?u không có - void CreateList(List l)
-
- l.pHeadNULL
- l.pTailNULL
-
127T?o 1 ph?n t? m?i
- Hàm tr? v? d?a ch? ph?n t? m?i t?o
- Node CreateNode(int x)
- Node p
- p new Node//C?p phát vùng nh? cho ph?n t?
- if ( pNULL) exit(1)
- p -gtInfo x //gán d?a li?u cho nút
- p-gtpNext NULL
- return p
-
128Áp d?ng cho bài qu?n lý sinh viên
- Node CreateNode(SV x)
- Node TamNode
- TamNode new Node //Hàm c?p phát vùng nh? d?ng
- if(TamNodeNULL)
-
- printf(không d? b? nh? d? c?p")
- exit(1)
-
- TamNode-gtInfo x//Tru?ng d? li?u c?a Node
- TamNode-gtNext NULL //Chua có Node d?ng sau
- return TamNode
129Thêm 1 ph?n t? vào DSLK
- Nguyên t?c thêm Khi thêm 1 ph?n t? vào List thì
có làm cho pHead, pTail thay d?i? - Các v? trí c?n thêm 1 ph?n t? vào List
- Thêm vào d?u List don
- Thêm vào cu?i List
- Thêm vào sau 1 ph?n t? q trong list
130Thu?t toán thêm 1 ph?n t? vào d?u DSLK
- Thêm nút p vào d?u danh sách liên k?t don
- B?t d?u
- N?u List r?ng thì
- pHead p
- pTail pHead
- Ngu?c l?i
- p-gtpNext pHead
- pHead p
131Hàm thêm 1 ph?n t? vào d?u List
- void AddHead(List l, Node p)
-
- if (l.pHeadNULL)
-
- l.pHead p
- l.pTail p
-
- else
-
- p-gtpNext l.pHead
- l.pHead p
-
132Minh h?a thu?t toán thêm vào d?u
pHead
4f
2f
3f
3 3f
4 4f
8
2f
N
pHeadP
P-gtpNextpHead
133Thu?t toán thêm vào cu?i DSLK
- Ta c?n thêm nút p vào cu?i list don
- B?t d?u
- N?u List r?ng thì
- pHead p
- pTail pHead
- Ngu?c l?i
- pTail-gtpNextp
- pTailp
134Hàm thêm 1 ph?n t? vào cu?i DSLKD
- void AddTail(List l, Node p)
-
- if (l.pHeadNULL)
-
- l.pHead p
- l.pTail l.pHead
-
- else
-
- l.pTail-gtNext p
- l.pTail p
-
-
135Minh h?a thu?t toán thêm vào cu?i
pTail
4f
5f
3f
5
4 4f
8 5f
N
9f
pTailP
pTail-gtpNext
136Thu?t toán them ph?n t? p vào sau ph?n t? q
- Ta c?n thêm nút p vào sau nút q trong list don
- B?t d?u
- N?u (q!NULL) thì
- B1 p-gtpNext q-gtpNext
- B2
- q-gtpNext p
- n?u q pTail thì
- pTailp
137Cài d?t thu?t toán
- void InsertAfterQ(List l, Node q, Node p)
-
- if(q!NULL)
-
- p-gtpNextq-gtNext
- q-gtpNextp
- if(l.pTailq)
- l.pTailp
-
- else
- AddHead(l,p)// thêm q vào d?u list
-
-
138Minh h?a thu?t toán
4f
5f
q
3f
5 ..
4 4f
8
5f
9f
9f
q-gtpNextP
N
5f
P-gtpNextq-gtpNext
P
139Chèn sinh viên vào l?p h?c tang theo di?m TB
- void Chen(List l,SV sinhvien)
- Node Pos,p,Tam//vi tri chua Node can them
vao - pl.pHead PosNULL
- while((p!NULL)(p-gtInfo.DTBltsinhvien.DTB))
- Posp
- pp-gtNext
-
- TamCreateNode(sinhvien) //Hàm t?o m?t sinh
viên - InsertAfterQ(l,Pos,Tam) //Thêm nút Tam vào
sau nút Pos -
140H?y ph?n t? trong DSLK don
- Nguyên t?c Ph?i cô l?p ph?n t? c?n h?y tru?c
h?y. - Các v? tr? c?n h?y
- H?y ph?n t? d?ng d?u List
- H?y ph?n t? có khoá b?ng x
- Hu? ph?n t? d?ng sau q trong danh sách liên k?t
don - ? ph?n trên, các ph?n t? trong DSLK don du?c c?p
phát vùng nh? d?ng b?ng hàm new, thì s? du?c gi?i
phóng vùng nh? b?ng hàm delete.
141Thu?t toán h?y ph?n t? trong DSLK
- B?t d?u
- N?u (pHead!NULL) thì
- B1 ppHead
- B2
- pHead pHead-gtpNext
- delete (p)
- B3
- N?u pHeadNULL thì pTailNULL
142Cài d?t thu?t toán
- H?y du?c hàm tr? v? 1, ngu?c l?i hàm tr? v? 0
- int RemoveHead(List l, int x)
- Node p
- if(l.pHead!NULL)
- pl.pHead
- xp-gtInfo //luu Data c?a nút c?n h?y
- l.pHeadl.pHead-gtpNext
- delete p
- if(l.pHeadNULL)
- l.pTailNULL
- return 1
-
- return 0
-
143Minh ho? thu?t toán
pHeadpHead-gtpNext
pHead
2f
3f
4f
1f
PpHead
144H?y ph?n t? sau ph?n t? q trong List
- B?t d?u
- N?u (q!NULL) thì //q t?n t?i trong List
- B1 pq-gtpNext// p là ph?n t? c?n h?y
- B2 N?u (p!NULL) thì // q không ph?i là ph?n t?
cu?i - q-gtpNextp-gtpNext// tách p ra kh?i xâu
- n?u (p pTail) // nút c?n h?y là nút cu?i
- pTailq
- delete p// h?y p
-
145Cài d?t thu?t toán
- int RemoveAfterQ(List l, Node q, int x)
- Node p
- if(q!NULL)
- pq-gtpNext //p là nút c?n xoá
- if(p!NULL) // q không phài là nút cu?i
- if(pl.pTail) //nút c?n xoá là nút cu?i
cùng - l.pTailq// c?p nh?t l? pTail
- q-gtpNextp-gtpNext xp-gtInfo
- delete p
-
- return 1
-
- else
- return 0
146Minh h?a thu?t toán
p-q-gtpNext
q
2f
3f
4f
pHead
1f
3f
4f
q-gtpNextp-gtpNext
147Thu?t toán h?y ph?n t? có khoá x
- Bu?c 1
- Tìm ph?n t? p có khoá b?ng x, và q d?ng tru?c p
- Bu?c 2
- N?u (p!NULL) thì //tìm th?y ph?n t? có khoá
b?ng x - H?y p ra kh?i List b?ng cách h?y ph?n t?
d?ng sau q - Ngu?c l?i
- Báo không tìm th?y ph?n t? có khoá
148Cài d?t thu?t toán
- int RemoveX(List l, int x)
- Node p,q NULL pl.Head
- while((p!NULL)(p-gtInfo!x)) //tìm
- qp
- pp-gtNext
-
- if(pNULL) //không tìm th?y ph?n t? có khoá
b?ng x - return 0
- if(q!NULL)//tìm th?y ph?n t? có khoá b?ng x
- DeleteAfterQ(l,q,x)
- else //ph?n t? c?n xoá n?m d?u List
- RemoveHead(l,x)
- return 1
149H?y 1 sinh viênc có mã s? x Cách 1
- void RemoveX(List l, char X)
- Node p,q
- pl.Head qNULL
- while((p!NULL)(strcmp(p-gtInfo.MSSV,X)!0))
- qp//luu Node d?ng tru?c p
- pp-gtNext//Qua Node k?
-
- if(pNULL) printf(không th?y sinh viên MS X)
- else if(qNULL) RemoveHead(l)
- else RemoveAfterQ(l,q)
-
150H?y 1 sinh viên có mã s? x Cách 2
void RemoveX(List l, char X) Node
p,q pl.pHead qNULL while((p!NULL)(strc
mp(p-gtInfo.MSSV,X)!0)) qp//luu Node d?ng
tru?c p pp-gtpNext//Qua Node
k? if(pNULL) printf(không th?y sinh viên
MS X)
151H?y 1 sinh viên có mã s? x Cách 2 (tt)
- else //Nút tìm th?y là p
-
- if(qNULL) //xóa d?u
-
- l.pHeadp-gtNext
- if(l.pHeadNULL) l.pTailNULL
-
- else
- q-gtpNextp-gtpNext
- if(pl.pTail)
- l.pTail q
-
- delete p
-
152- Void main()
- List l1
- char x40
- gets(x)
- RemoveX(l1,x)
-
153Tìm 1 ph?n t? trong DSLK don
- Tìm tu?n t? (hàm tr? v?), các bu?c c?a thu?t toán
tìm nút có Info b?ng x trong list don - Bu?c 1 ppHead// d?a ch? c?a ph?n t? d?u trong
list don - Bu?c 2
- Trong khi p!NULL và p-gtInfo!x
- pp-gtpNext// xét ph?n t? k?
- Bu?c 3
- N?u p!NULL thì p luu d?a ch? c?a nút có
- Info x
- Ngu?c l?i Không có ph?n t? c?n tìm
154Hàm tìm 1 ph?n t? trong DSLK don
- Hàm tìm ph?n t? có Info x, hàm tr? v? d?a ch?
c?a nút có Info x, ngu?c l?i hàm tr? v? NULL - Node Search(List l, int x)
- Node p
- p l.pHead
- while((p! NULL)(p-gtInfo ! x))
- p p-gtpNext
- return p
155Tìm sinh viên có tên x trong l?p h?c
- void Search(List l, char X)
- Node p
- p l.pHead
- while((p! NULL)(strcmp(p-gtInfo.ten, X)!0)
- p p-gtpNext
- if( pNULL)
- printf(tim khong thay)
- else
- printf(Tim thay)
-
- Bài t?p Ð?m s? sinh viên có tên là X trong l?p
h?c, n?u không có thì thông báo không có
156Minh h?a thu?t toán tìm ph?n t? trong DSLK
4f
5f
1f
2f
3f
pHead
56
34
3
4
8
8
P
X 8
Tìm th?y, hàm tr? v? d?a ch? c?a nút tìm th?y là
4f
157Duy?t danh sách
- Duy?t danh sách là thao tác thu?ng du?c th?c hi?n
khi có nhu c?u c?n x? lý các ph?n t? trong danh
sách nhu - Ð?m các ph?n t? trong danh sách
- Tìm t?t c? các ph?n t? trong danh sách th?o di?u
ki?n - H?y toàn b? danh sách
158Thu?t toán duy?t danh sách
- Bu?c 1
- p pHead// p luu d?a ch? c?a ph?n t? d?u trong
List - Bu?c 2
- Trong khi (danh sách chua h?t) th?c hi?n
- x? lý ph?n t? p
- pp-gtpNext// qua ph?n t? k?
159Cài d?t in các ph?n t? trong List
- void PrintList(List l)
-
- Node p
- pl.pHead
- while(p!NULL)
- printf(d , p-gtInfo)
- pp-gtpNext
-
-
160In tên cùng di?m trung bình c?a sinh viên
- void Duyet(List L)
- Node P
- PL.pHead
- while(P!NULL)
-
- puts(P-gtInfo.ten)
- printf(f , P-gtInfo. ÐTB)
- PP-gtpNext//qua ph?n t? k?
-
161In tên cùng di?m trung bình c?a sinh viên có di?m
trung bình gt5
- void Duyet(List L)
- Node P
- PL.pHead
- while(P!NULL)
-
- if(P-gtInfo.DTBgt5)
- puts(P-gtInfo.ten)
- printf(f , P-gtInfo. ÐTB)
-
- PP-gtpNext//qua ph?n t? k?
-
162H?y danh sách liên k?t don
- Bu?c 1
- Trong khi (danh sách chua h?t) th?c hi?n
- B11
- p pHead
- pHead pHead-gtpNext// c?p nh?t pHead
- B12
- H?y p
- Bu?c 2
- pTail NULL// b?o toàn tính nh?t quán khi xâu
r?ng
163Cài d?t thu?t toán
- void RemoveList(List l)
-
- Node p
- while(l.pHead!NULL)//còn ph?n t? trong List
-
- p l.pHead
- l.pHead p-gtpNext
- delete p
-
- l.pTailNULL
-
164Minh h?a thu?t toán
2f
3f
4f
5f
1f
3f
165S?p x?p danh sách
- Có hai cách ti?p c?n
- Cách 1 Thay d?i thành ph?n Info
pHead
pTail
3f
4f
5f
4f
4
N
6
5f
7
pHead
pTail
5f
3f
4f
4f
4
N
7
5f
6
166S?p x?p danh sách
- Cách 2 Thay d?i thành ph?n pNext (thay d?i trình
t? móc n?i c?a các ph?n t? sao cho t?o l?p nên
du?c th? t? mong mu?n)
pHead
pTail
3f
4f
5f
4f
4
N
6
5f
7
pHead
pTail
5f
4f
3f
6
5f
4
4f
N
7
167Uu, nhu?c di?m c?a 2 cách ti?p c?n
- Thay d?i thành ph?n Info (d? li?u)
- Uu Cài d?t don gi?n, tuong t? nhu s?p x?p m?ng
- Nhu?c
- Ðòi h?i thêm vùng nh? khi hoán v? n?i dung c?a 2
ph?n t? -gt ch? phù h?p v?i nh?ng xâu có kích
thu?c Info nh? - Khi kích thu?c Info (d? li?u) l?n chi phí cho
vi?c hoán v? thành ph?n Info l?n - Làm cho thao tác s?p x?p ch?m
- Thay d?i thành ph?n pNext
- Uu
- Kích thu?c c?a tru?ng này không thay d?i, do dó
không ph? thu?c vào kích thu?c b?n ch?t d? li?u
luu t?i m?i nút. - Thao tác s?p x?p nhanh
- Nhu?c Cài d?t ph?c t?p
168Dùng thu?t toán SX SelectionSort d? SX List
void SelectionSort(List l) Node
p,q,min pl.pHead while(p!l.pTail)
minp qp-gtpNext
while(q!NULL) if(q-gtInfoltmin-gtInfo) minq
qq-gtpNext Swap(min-gtInfo,p-gtInfo) pp-gt
pNext
169Hàm hoán v? thành ph?n d? li?u c?a 2 nút
- void Swap(SV s1,SV s2)
-
- SV tam
- tams1
- s1s2
- s2tam
-
170S?p x?p tang theo ÐTB _ cách 1
- void InterchangeSort(List l)
- Node p,q
- for(pl.pHead p!l.pTailpp-gtpNext)
- for(qp-gtpNextq!NULLqq-gtpNext)
- if(q-gtInfo.DTBltp-gtInfo.DTB)
- Swap(q-gtInfo,p-gtInfo)
-
171S?p x?p danh sách sinh viên tang theo di?m _c2
- void SelectionSortList(List l)
-
- Node p,q,min
- pl.pHead
- while(p!l.pTail)
- minp
- qp-gtpNext
- while(q!NULL)
- if(q-gtInfo.DTBltmin-gtInfo.DTB)
- minq
- qq-gtpNext
-
- Swap(min-gtInfo,p-gtInfo)
- pp-gtpNext
-
-
172N?I DUNG
173Ð?nh nghia cây nh? phân tìm ki?m
- Cây nh? phân
- B?o d?m nguyên t?c b? trí khoá t?i m?i nút
- Các nút trong cây trái nh? hon nút hi?n hành
- Các nút trong cây ph?i l?n hon nút hi?n hành
Ví d?
174Uu di?m c?a cây nh? phân tìm ki?m
- Nh? tr?t t? b? trí khóa trên cây
- Ð?nh hu?ng du?c khi tìm ki?m
- Cây g?m N ph?n t?
- Tru?ng h?p t?t nh?t h log2N
- Tru?ng h?p x?u nh?t h N
- Tình hu?ng x?y ra tru?ng h?p x?u nh?t?
175C?u trúc d? li?u c?a cây nh? phân tìm ki?m
- C?u trúc d? li?u c?a 1 nút
- typedef struct tagTNode
-
- int Key //tru?ng d? li?u là 1 s? nguyên
- struct tagTNode pLeft
- struct tagTNode pRight
- TNode
- C?u trúc d? li?u c?a cây
- typedef TNode TREE
176Các thao tác trên cây nh? phân tìm ki?m
- T?o 1 cây r?ng
- T?o 1 nút có tru?ng Key b?ng x
- Thêm 1 nút vào cây nh? phân tìm ki?m
- Duy?t cây nh? phân tìm ki?m
- Xoá 1 nút có Key b?ng x trên cây
- Tìm 1 nút có khoá b?ng x trên cây
177T?o cây r?ng
- Cây r?ng -gt d?a ch? nút g?c b?ng NULL
- void CreateTree(TREE T)
-
- TNULL
-
178T?o 1 nút có Key b?ng x
- TNode CreateTNode(int x)
-
- TNode p
- p new TNode //c?p phát vùng nh? d?ng
- if(pNULL)
- exit(1) // thoát
- else
-
- p-gtkey x //gán tru?ng d? li?u c?a nút x
- p-gtpLeft NULL
- p-gtpRight NULL
-
- return p
-
179Thêm m?t nút x
- R?ng bu?c Sau khi thêm cây d?m b?o là cây nh?
phân tìm ki?m. - int insertNode(TREE T, Data X)
- if(T)
- if(T-gtKey X) return 0
- if(T-gtKey gt X) return insertNode(T-gtpLeft, X)
- else return insertNode(T-gtpRight, X)
- T new TNode
- if(T NULL) return -1
- T-gtKey X
- T-gtpLeft T-gtpRight NULL
- return 1
180Minh h?a thêm 1 ph?n t? vào cây
181Minh ho? thành l?p 1 cây t? dãy s?
9, 5, 4, 8, 6, 3, 14,12,13
9
14
5
12
8
4
13
6
3
182Tìm nút có khoá b?ng x (không dùng d? quy)
- TNode searchNode(TREE Root, int x)
- TNode p Root
- while (p ! NULL)
- if(x p-gtKey) return p
- else
- if(x lt p-gtKey) p p-gtpLeft
- else p p-gtpRight
-
- return p
183Tìm nút có khoá b?ng x (dùng d? quy)
- TNode SearchTNode(TREE T, int x)
-
- if(T!NULL)
-
- if(T-gtkeyx)
- return T
- else
- if(xgtT-gtkey)
- return SearchTNode(T-gtpRight,x)
- else
- return SearchTNode(T-gtpLeft,x)
-
- return NULL
184Minh ho? tìm m?t nút
44
Tìm X55
55
18
88
59
108
13
37
15
23
40
55
71
55
Tìm th?y X55
185Duy?t cây nh? phân tìm ki?m
- Có 6 phép duy?t cây nhu sau
- NLR (g?c, trái, ph?i)
- NRL (g?c, ph?i, trái)
- LNR (trái, g?c, ph?i)
- RNL (Ph?i, g?c,trái)
- LRN (trái, ph?i, g?c)
- RLN (ph?i, trái, g?c)
186 Thu?t toán du?t cây nh? phân tìm ki?m
- void NLR(TREE t)
-
- if(t!NULL)
-
- printf(d,t-gtkey)
- NLR(t-gtpLeft)
- NLR(t-gtpRight)
-
187Bài t?p cho ph?n duy?t cây
- Vi?t chuong trình th?c hi?n các yêu c?u sau
- Ð?m s? nút trên cây
- Tình t?ng t?t c? các khóa trên cây
- Ð?m s? nút lá trên cây
- Ð?m s? nút có duy nh?t 1 cây con
- Ð?m s? nút có 2 cây con
- Cho bi?t khoá l?n nh?t trong cây là bao nhiêu
- Cho bi?t khóa nh? nh?t trong cây là bao nhiêu
- Tim nút có khóa b?ng x trong cây
188Vi?t hàm d?m s? nút trong cây
- void Dem(TREE t,int s)
-
- if(t!NULL)
- if((t-gtpLeftNULL)(p-gtpRightNULL))
- s
- Dem(t-gtpLeft,s)
- Dem(t-gtpRight,s)
-
-
189L?i g?i hàm
- void main()
-
- TREE t
- int s0
- Dem(t,s)
- printf(so nut trong cay d,s)
-
190- NLR 9, 2, 6, 1, 10, 8, 5, 3, 7, 12, 4.
- LNR 6, 2, 10, 1, 9, 3, 5, 8, 12, 7, 4.
191H?y 1 nút có khoá b?ng X trên cây
- H?y 1 ph?n t? trên cây ph?i d?m b?o di?u ki?n
ràng bu?c c?a Cây nh? phân tìm ki?m - Có 3 tru?ng h?p khi h?y 1 nút trên cây
- TH1 X là nút lá
- TH2 X ch? có 1 cây con (cây con trái ho?c cây
con ph?i) - TH3 X có d?y d? 2 cây con
- TH1 Ta xoá nút lá mà không ành hu?ng d?n các nút
khác ttrên cây - TH2 Tru?c khi xoá x ta móc n?i cha c?a X v?i con
duy nh?t cùa X. - TH3 Ta dùng cách xoá gián ti?p
192Minh ho? h?y ph?n t? x có 1 cây con
44
H?y X37
18
88
59
13
108
15
23
55
71
193H?y 1 nút có 2 cây con
- Ta dùng cách h?y gián ti?p, do X có 2 cây con
- Thay vì h?y X ta tìm ph?n t? th? m?ng Y. Nút Y có
t?i da 1 cây con. - Thông tin luu t?i nút Y s? du?c chuy?n lên luu
t?i X. - Ta ti?n hành xoá h?y nút Y (xoá Y gi?ng 2 tru?ng
h?p d?u) - Cách tìm nút th? m?ng Y cho X Có 2 cách
- C1 Nút Y là nút có khoá nh? nh?t (trái nh?t)
bên cây con ph?i X - C2 Nút Y là nút có khoá l?n nh?t (ph?i nh?t) bên
cây con trái c?a X
194Minh h?a h?y ph?n t? X có 2 cây con
Xoá nút có tru?ng Key 18, lúc dó nút có khoá
23 là nút th? m?ng
44
18
88
59
13
37
108
15
23
40
55
71
30
195Cài d?t thao tác xoá nút có tru?ng Key x
- void DeleteNodeX1(TREE T,int x)
-
- if(T!NULL)
-
- if(T-gtKeyltx) DeleteNodeX1(T-gtRight,x)
- else
-
- if(T-gtKeygtx) DeleteNodeX1(T-gtLeft,x)
- else //tim th?y Node có tru?ng d? li?u x
- TNode p
- pT
- if (T-gtLeftNULL) T T-gtRight
- else
- if(T-gtRightNULL) TT-gtLeft
- else ThayThe1(p, T-gtRight)// tìm bên cây
con ph?i -
- delete p
-
-
196Hàm tìm ph?n t? th? m?ng
- void ThayThe1(TREE p, TREE T)
- if(T-gtLeft!NULL)
- ThayThe1(p,T-gtLeft)
- else
-
- p-gtKey T-gtKey
- pT
- TT-gtRight
-
197Tóm lu?t các n?i dung c?n n?m
- Các thu?t toán tìm ki?m và s?p x?p
- Cài d?t hàm tìm ki?m c?a 2 thu?t toán tìm ki?m
- Cài d?t hàm s?p x?p c?a các thu?t toán s?p x?p
- Ghi k?t qu? t?ng bu?c khi áp d?ng các thu?t
toán tìm ki?m và s?p x?p vào 1 b? d? li?u cho
tru?c - Áp d?ng sách liên k?t d? gi?i quy?t 1 bài toán
trong d?i s?ng th?c t?. - Qu?n lý sinh viên
- Qu?n lý nhân viên trong 1 công ty.
- Qu?n lý sách trong thu vi?n..vv
- 3. Cây nh? phân tìm ki?m
- V? hình d?ng c?a cây khi thêm l?n lu?t 1 dãy
s? vào cây - Cho bi?t k?t qu? khi duy?t cây theo 1 th? t?
cho tru?c - V? hình d?ng c?a cây khi xoá 1 nút trên cây
- Vi?t hàm tìm ki?m 1 nút trên cây, duy?t cây,
d?m