TRU?NG - PowerPoint PPT Presentation

1 / 197
About This Presentation
Title:

TRU?NG

Description:

Title: D y Danh s ch Author: User Last modified by: uit Created Date: 3/7/2006 10:30:17 PM Document presentation format: A4 Paper (210x297 mm) – PowerPoint PPT presentation

Number of Views:163
Avg rating:3.0/5.0
Slides: 198
Provided by: binhdangN
Category:
Tags: tru | bubblesort

less

Transcript and Presenter's Notes

Title: TRU?NG


1
TRU?NG ÐH CÔNG NGH? THÔNG TIN
Giáo viên Mai Xuân Hùng Email hungmx_at_uit.edu.vn
2
Bà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.

3
Tì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

4
Thu?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

5
Minh 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
6
Minh 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
7
Thu?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.

8
Cá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

9
Cà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)

11
Minh 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
12
Minh 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
13
BÀ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

14
G?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

15
Cá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.

17
Cá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
24
Demo
j
2
8
5
1
6
4
15
12
1
i
25
Demo
j
12
5
2
6
4
15
1
2
8
0 i
26
Demo
j
2
12
8
5
6
4
15
1
4
0 i
27
Demo
j
2
4
12
8
6
5
15
1
5
0 i
28
Demo
j
5
12
8
4
2
6
15
1
6
0 i
29
Demo
j
8
6
12
8
15
4
5
2
1
0 i
30
Demo
j
12
6
8
12
15
4
5
2
1
0 i
31
Demo
2
4
5
6
8
12
15
1
32
Cà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)

33
Bài t?p áp d?ng
9
7
4
5
8

34
Bài t?p áp d?ng
35
Ch?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?

36
Cá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.

37
Ch?n Tr?c Ti?p Selection Sort
  • Cho dãy s? a   
  • 12 2 8 5 1 6 4 15

38
Ch?n Tr?c Ti?p Selection Sort
39
Ch?n Tr?c Ti?p Selection Sort
40
Ch?n Tr?c Ti?p Selection Sort
41
Minh 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
42
Minh 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
43
Minh 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
44
Minh 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
45
Minh 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
46
Minh 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
47
Minh 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
48
Cà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)

49
Cho bi?t k?t qu? ch?y t?ng bu?c
50
N?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.

51
N?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.

52
N?i B?t Bubble Sort
  • Cho dãy s? a
  • 2 12 8 5 1 6 4 15

53
N?i B?t Bubble Sort
54
N?i B?t Bubble Sort
55
N?i B?t Bubble Sort
56
N?i B?t Bubble Sort
57
Minh H?a Thu?t Toán
j
2
8
5
1
6
4
15
12
1
i
58
Minh H?a Thu?t Toán
j
12
2
8
5
4
6
15
1
2
i
59
Minh H?a Thu?t Toán
j
4
2
12
4
8
5
6
15
1
i
60
Minh H?a Thu?t Toán
j
2
4
12
8
5
6
15
1
5
i
61
Minh H?a Thu?t Toán
j
2
4
5
12
8
6
15
1
6
i
62
Minh H?a Thu?t Toán
j
2
4
5
6
12
8
15
1
8
i
63
Minh H?a Thu?t Toán
j
15
2
4
5
6
8
12
15
1
12
i
64
Cà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)

65
Ghi k?t qu? ch?y t?ng bu?c
3
9
4
7
5
3
4
9
7
5
66
Ghi 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
67
Chè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).

68
Chè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

69
Chèn Tr?c Ti?p Insertion Sort
  • Cho dãy s?
  •     12 2 8 5 1 6 4 15

70
Chèn Tr?c Ti?p Insertion Sort
71
Chèn Tr?c Ti?p Insertion Sort
72
Minh H?a Thu?t Toán Insertion Sort
2
8
5
1
6
4
15
12
73
Minh 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
74
Minh 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
75
Minh 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
76
Minh 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
77
Minh 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
78
Minh 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
79
Minh 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
80
Minh H?a Thu?t Toán Insertion Sort
pos
2
4
5
6
8
12
15
1
81
Cà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

82
K?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
83
Quick 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.

84
Quick 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

85
Quick 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.

86
Quick 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

87
Gi?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

88
Gi?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

89
Quick 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
90
Quick Sort Ví D?
91
Quick Sort Ví D?
  • Phân ho?ch do?n l 0, r 2

x a2 2
92
Quick Sort Ví D?
  • Phân ho?ch do?n l 4, r 7

x a5 6
r7
l4
93
  • Phân ho?ch do?n l 6, r 7

94
Quick Sort Ví D?
Phaân hoaïch daõy
5
2
8
1
6
4
15
12
right
left
95
Quick Sort Ví D?
Phaân hoaïch daõy
2
8
5
1
6
12
15
4
right
left
96
Quick Sort Ví D?
2
1
5
8
6
12
15
4
right
left
97
Quick 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
98
Quick Sort Ví D?
2
4
5
6
8
12
15
1
right
left
Saép xeáp ñoaïn 3
99
Quick 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)

100
Bà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
101
N?I DUNG
102
Bi?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

103
Ví 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? !

104
Bi?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 ?

105
Ki?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?

106
Cá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
  • 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

107
S? 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

108
Ví 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

109
H?n ch? c?a cách c?p phát d?ng cho m?ng
110
Ki?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

111
Cá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

112
Danh 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?

113
Liê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?

114
Cá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

115
Cá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
116
N?I DUNG
117
T? 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.

118
Bà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

120
CTDL 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

123
Cá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?

124
Ví 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
125
Cá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

126
Kh?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

127
T?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

129
Thê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

130
Thu?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

131
Hà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

132
Minh 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
133
Thu?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

134
Hà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

135
Minh 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
136
Thu?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

137
Cà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

138
Minh 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
139
Chè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

140
H?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.

141
Thu?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

142
Cà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

143
Minh ho? thu?t toán
pHeadpHead-gtpNext
pHead
2f
3f
4f
1f
PpHead
144
H?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

145
Cà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

146
Minh h?a thu?t toán
p-q-gtpNext
q
2f
3f
4f
pHead
1f
3f
4f
q-gtpNextp-gtpNext
147
Thu?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á

148
Cà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

149
H?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)

150
H?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)
151
H?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)

153
Tì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

154
Hà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

155
Tì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ó

156
Minh 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
157
Duy?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

158
Thu?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?

159
Cà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

160
In 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?

161
In 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?

162
H?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

163
Cà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

164
Minh h?a thu?t toán
2f
3f
4f
5f
1f
3f
165
S?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
166
S?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
167
Uu, 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

168
Dù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
169
Hà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

170
S?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)

171
S?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

172
N?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?
174
Uu 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?

175
C?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

176
Cá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

177
T?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

178
T?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

179
Thê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

180
Minh h?a thêm 1 ph?n t? vào cây
181
Minh 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
182
Tì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

183
Tì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

184
Minh 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
185
Duy?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)

187
Bà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

188
Vi?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)

189
L?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.

191
H?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

192
Minh 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
193
H?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

194
Minh 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
195
Cà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

196
Hà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

197
Tó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
Write a Comment
User Comments (0)
About PowerShow.com