Nội dung của giáo trình bao gồm 9 chương: giới thiệu chung; thiết kế và phân tích giải thuật; đệ quy; mảng và danh sách tuyến tính; danh sách móc nối; cây; đồ thị; sắp xếp; tìm kiếm. Mời các bạn cùng tham khảo giáo trình để nắm chắc kiến thức.
Trang 13 1.2. M t s v n đ liên quan:ộ ố ấ ề
3 1.3. Ngôn ng di n đ t thu t toán:ữ ễ ạ ậ
3 Ngôn ng di n đ t thu t toán đữ ễ ạ ậ ược quy ướ ử ục s d ng trong giáo trình này là ngôn ngữ
t a C++.ự
3 1.3.1. C u trúc c a m t chấ ủ ộ ương trình chính:
3 1.3.2. Các ký t :ự
5 1.3.3. Các câu l nh:ệ
5 1.3.4. Chương trình con:
6
Chương 2: Thi t k và phân tích thu t TOÁNẾ Ế Ậ
8 2.1. Thi t k thu t toán:ế ế ậ
8 2.1.1. Module hoá thu t toán:ậ
8 2.1.2. Phương pháp tinh ch nh t ng bỉ ừ ước:
9 2.2. Phân tích thu t toán: ậ
9 2.2.1. Tính đúng đ n:ắ
9 2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu :ẫ ữ ơ ả ệ ả
9 2.2.3. Phân tích th i gian th c hi n thu t toán:ờ ự ệ ậ
9
Chương 3: đ quy (RecursiON)Ệ
12 3.1. Đ i cạ ương:
12 3.2. Phương pháp đ thi t k m t thu t toán đ quy:ể ế ế ộ ậ ệ
13 3.3. Thu t toán quay lui:ậ
16
Chương 4: M ng và danh sách tuy n tínhẢ Ế
18 4.1. M ng và c u trúc l u tr c a m ng:ả ấ ư ữ ủ ả
18 4.2. Danh sách tuy n tính (Linear list):ế
19 4.3. Ngăn x p (Stack):ế
20 4.3.1. Đ nh nghĩa:ị
20 4.3.2. L u tr Stack b ng m ng:ư ữ ằ ả
20 4.3.3. Các ví d :ụ
21 4.3.4. Stack v i vi c cài đ t thu t toán đ quy:ớ ệ ặ ậ ệ
25 4.4. Hàng đ i (Queue):ợ
28 4.4.1. Đ nh nghĩa:ị
28 4.4.2. L u tr Queue b ng m ng:ư ữ ằ ả
28
Chương 5: danh sách móc n i (LINKED LIST)Ố
31 5.1. Danh sách móc n i đ n:ố ơ
31 5.1.1. T ch c danh sách n i đ n:ổ ứ ố ơ
31 5.1.2. M t s phép toán trên danh sách n i đ n:ộ ố ố ơ
31 5.2. Danh sách n i vòng:ố
33 5.2.1. Nguyên t c:ắ
33 5.2.2. Thu t toán b sung và lo i b m t nút c a danh sách n i vòng:ậ ổ ạ ỏ ộ ủ ố
34 5.3. Danh sách n i kép:ố
34 5.3.1. T ch c:ổ ứ
34 5.3.2. M t s phép toán trên danh sách n i kép:ộ ố ố
35 5.4. Ví d v vi c s d ng danh sách móc n i:ụ ề ệ ử ụ ố
36
Trang 25.5. Stack và Queue móc n i:ố
37
Chương 6: CÂY (TREE)
40 6.1. Đ nh nghĩa và các khái ni m:ị ệ
40 6.1.1. Đ nh nghĩa:ị
40 6.1.2. Các khái ni m liên quan:ệ
40 6.2. Cây nh phân:ị
41 6.2.1. Đ nh nghĩa và tính ch t:ị ấ
41 6.2.2. Bi u di n cây nh phân:ể ễ ị
42 6.2.3. Phép duy t cây nh phân:ệ ị
43 6.2.4. Cây nh phân n i vòng:ị ố
49 6.3. Cây t ng quát:ổ
51 6.3.1. Bi u di n cây t ng quát:ể ễ ổ
51 6.3.2. Phép duy t cây t ng quát:ệ ổ
53 6.4. ng d ng (Bi u di n cây bi u th c s h c):Ứ ụ ể ễ ể ứ ố ọ
53
Chương 7: Đ th (GRAPH)Ồ Ị
58 7.1. Đ nh nghĩa và các khái ni m v đ th :ị ệ ề ồ ị
58 7.2. Bi u di n đ th :ể ễ ồ ị
59 7.2.1. Bi u di n b ng ma tr n lân c n (ma tr n k ):ễ ễ ằ ậ ậ ậ ề
59 7.2.2. Bi u di n b ng danh sách lân c n (danh sách k )ể ễ ằ ậ ề
59 7.3. Phép duy t m t đ th :ệ ộ ồ ị
61 7.3.1. Tìm ki m theo chi u sâu:ế ề
61 7.3.2.Tìm ki m theo chi u r ng:ế ề ộ
62 7.4. Cây khung và cây khung v i giá c c ti u:ớ ự ể
63
Chương 8: S P X PẮ Ế
65 8.1. Đ t v n đ :ặ ấ ề
65 8.2. M t s phộ ố ương pháp s p x p đ n gi n:ắ ế ơ ả
65 8.2.1. S p x p ki u l a ch n:ắ ế ể ự ọ
65 8.2.2. S p x p ki u chèn:ắ ế ể
65 8.2.3. S p x p ki u n i b t:ắ ế ể ổ ọ
66 8.3. S p x p ki u phân đo n (S p x p nhanh quick sort):ắ ế ể ạ ắ ế
66 8.4. S p x p ki u vun đ ng (Heap sort):ắ ế ể ố
67 8.5. S p x p ki u tr n (Merge sort):ắ ế ể ộ
69
Chương 9: tìm ki mẾ
71 9.1. Bài toán tìm ki m:ế
71 9.2. Tìm ki m tu n t :ế ầ ự
71 9.3. Tìm ki m nh phân:ế ị
71 9.4. Cây nh phân tìm ki m:ị ế
71 Tài li u Tham kh oỆ Ả
74
Trang 3CH ƯƠ NG 1: GI I THI U CHUNG Ớ Ệ
1.1. Thu t toán và c u trúc d li u:ậ ấ ữ ệ
Theo Niklaus Wirth: Thu t toán + C u trúc d li u = Chậ ấ ữ ệ ương trình
Ví dụ: Cho 1 dãy các ph n t , có th bi u di n dầ ử ể ể ễ ướ ại d ng m ng ho c danhả ặ sách
C u trúc d li u và thu t toán có m i quan h m t thi t v i nhau. do đó vi cấ ữ ệ ậ ố ệ ậ ế ớ ệ nghiên c u các c u trúc d li u sau này đi đôi v i vi c xác l p các thu t toán xứ ấ ữ ệ ớ ệ ậ ậ ử
lý trên các c u trúc y.ấ ấ
1.2. M t s v n đ liên quan:ộ ố ấ ề
L a ch n m t c u trúc d li u thích h p đ t ch c d li u vào ra và trên cự ọ ộ ấ ữ ệ ợ ể ổ ứ ữ ệ ơ
s đó xây d ng đở ự ược thu t toán x lý h u hi u nh m đ a t i k t qu mongậ ử ữ ệ ằ ư ớ ế ả
mu n cho bài toán là m t khâu r t quan tr ng.ố ộ ấ ọ
Ta c n phân bi t 2 lo i quy cách d li u: ầ ệ ạ ữ ệ
Quy cách bi u di n hình th c: Còn để ễ ứ ược g i là c u trúc logic c a d li u.ọ ấ ủ ữ ệ
Đ i v i m i ngôn ng l p trình xác đ nh s có m t b c u trúc logic c a dố ớ ỗ ữ ậ ị ẽ ộ ộ ấ ủ ữ
li u. D li u thu c lo i c u trúc nào thì c n ph i có mô t ki u d li uệ ữ ệ ộ ạ ấ ầ ả ả ể ữ ệ
tương ng v i c u trúc d li u đó. ứ ớ ấ ữ ệ Ví d : ụ Trong C có các ki u d li u: Struct,ể ữ ệ Union, File,
Quy cách l u tr : là cách bi u di n m t c u trúc d li u trong b nh Víư ữ ể ễ ộ ấ ữ ệ ộ ớ
d : C u trúc d li u m ng đụ ấ ữ ệ ả ượ ưc l u tr trong b nh theo quy t c l u tr kữ ộ ớ ắ ư ữ ế
ti p.ế Có 2 quy cách l u tr :ư ữ
L u tr trong: ví d RAM.ư ữ ụ
L u tr ngoài: ví d đĩa (disk).ư ữ ụ
1.3. Ngôn ng di n đ t thu t toán:ữ ễ ạ ậ
Ngôn ng di n đ t thu t toán đữ ễ ạ ậ ược quy ướ ử ục s d ng trong giáo trình này
là ngôn ng t a C++.ữ ự
Đ c đi mặ ể : G n gi ng v i Turbo C++, do đó d dàng trong vi c chuy nầ ố ớ ễ ệ ể
m t chộ ương trình vi t b ng ngôn ng t a C++ sang ngôn ng C++.ế ằ ữ ự ữ
1.3.1. C u trúc c a m t ch ấ ủ ộ ươ ng trình chính:
Trang 4Đ đ n gi n, chể ơ ả ương trình có th không c n vi t khai báo. Tuy nhiên có thể ầ ế ể
mô t trả ước chương trình b ng ngôn ng t nhiên.ằ ữ ự
Ph n thuy t minh đầ ế ược đ t gi a 2 d u /* , */ ho c // đ ghi chú trên 1 dòng.ặ ữ ấ ặ ể
Trang 5Các ký t s d ng trong ch ng trình là t ng t nh trong C++.ự ử ụ ươ ươ ự ư
L u ý: Trong C++ là có s phân bi t gi a ch hoa và ch thư ự ệ ữ ữ ữ ường
1.3.3. Các câu l nh: ệ
L nh gán ệ : V = E;
Trong đó: V là bi n (variable), và E là bi u th c (expression).ế ể ứ
L u ýư : Có th dùng phép gán chung. ể Ví dụ: a=b=1;
L nh ghép ệ : {S1; S2; ; Sn;} coi nh là m t câu l nh (trong đó Sư ộ ệ i là các câu
l nh).ệ
L nh if ệ : Tương t nh l nh if c a ngôn ng C.ự ư ệ ủ ữ
if (<biểu thức điều kiện>) <câu lệnh>;
ho c:ặ if (<biểu thức điều kiện>) <câu lệnh 1>;
Trang 6 L nh l p ệ ặ : for, while, do while: Tương t nh các l nh l p c aự ư ệ ặ ủ C
L nh nh y ệ ả : goto n (n: s hi u/nhãn c a chố ệ ủ ương trình)
L nh vào ra ệ : cin và cout gi ng nh C++.ố ư
L u ýư : N u hàm có ki u tr v khác ki u void thì khi k t thúc hàm ph i có câuế ể ả ề ể ế ả
l nh ệ return <giá tr c a hàm>ị ủ đ gán k t qu cho hàmể ế ả
Sau đây là ví d v hàm có tr v giá tr ụ ề ả ề ị
Ví dụ: Vi t chế ương trình con d ng hàm NamNhuan(x). Cho k t qu n u s x làạ ế ả ế ố năm nhu n có giá tr là True(1), ngậ ị ược l i có giá tr là False(0); ch ng h nạ ị ẳ ạ : NamNhuan(1996) cho giá tr 1, NamNhuan(1997) cho giá tr 0. Bi t r ng x đị ị ế ằ ượ c
g i là năm nhu n n u x chia h t cho 4 và x không chia h t cho 100 ho c x chiaọ ậ ế ế ế ặ
Ví d vi t v chụ ế ề ương trình con không có giá tr tr v (hay còn g i là th t c).ị ả ề ọ ủ ụ
Ví dụ: Vi t hàm Hoandoi(a, b) đ hoán đ i giá tr c a 2 bi n s a và b cho nhau.ế ể ổ ị ủ ế ố
Trang 7a= a-b;
}
L u ý:ư Bên trong 1 chương trình con có th dùng l nh return; (thoát kh i chể ệ ỏ ươ ngtrình con), exit(1) (thoát kh i chỏ ương trình chính)
Trang 8CH ƯƠ NG 2: THI T K VÀ PHÂN TÍCH THU T Ế Ế Ậ TOÁN
2.1. Thi t k thu t toán:ế ế ậ
Ví dụ:
Quá trình module hoá bài toán được xem là nguyên lý “chia đ tr ” (divide &ể ị conquer) hay còn g i là thi t k t đ nh xu ng (topdown) ho c là thi t k tọ ế ế ừ ỉ ố ặ ế ế ừ khái quát đ n chi ti t (specialization).ế ế
Tra
c u ứ
Th ẻ sách
Th ng kê ố Theo
Trang 9Nh n xétậ :
Vi c module hoá làm cho bài toán đệ ược đ nh hị ướng rõ ràng
B ng cách này, ngằ ười ta có th phân chia công vi c cho đ i ngũ l p trình.ể ệ ộ ậ
Đây là m t công vi c m t nhi u th i gian.ộ ệ ấ ề ờ
2.1.2. Ph ươ ng pháp tinh ch nh t ng b ỉ ừ ướ c:
Phương pháp tinh ch nh t ng bỉ ừ ước là phương pháp thi t k thu t toán g nế ế ậ ắ
li n v i l p trình. Nó ph n ánh tinh th n c a quá trình module hoá và thi t kề ớ ậ ả ầ ủ ế ế thu t toán theo ki u topdown.ậ ể
Xu t phát t ngôn ng t nhiên c a thu t toán, thu t toán s đấ ừ ữ ự ủ ậ ậ ẽ ược chi ti t hoáế
d n d n và cu i cùng công vi c x lý s đầ ầ ố ệ ử ẽ ược thay th d n b i các câu l nhế ầ ở ệ (c a m t ngôn ng l p trình nào đó). Quá trình này là đ tr l i d n d n các câuủ ộ ữ ậ ể ả ờ ầ ầ
h i: What? (làm gì?), How (làm nh th nào?)ỏ ư ế
2.2. Phân tích thu t toán: ậ
Ch t lấ ượng c a m t chủ ộ ương trình hay thu t toán bao g m:ậ ồ
Tính đúng đ n.ắ
Tính đ n gi n (d hi u, d qu n lý, d l p).ơ ả ễ ể ễ ả ễ ậ
Tính t i u (hi u qu ) v m t th i gian cũng nh không gian nh ố ư ệ ả ề ặ ờ ư ớ
2.2.1. Tính đúng đ n: ắ
Đây là m t yêu c u phân tích quan tr ng nh t cho m t thu t toán. Thôngộ ầ ọ ấ ộ ậ
thường, người ta th nghi m (test) nh m t s b d li u nào đó đ cho ch yử ệ ờ ộ ố ộ ữ ệ ể ạ
chương trình r i so sánh k t qu th nghi m v i k t qu mà ta đã bi t. Tuyồ ế ả ử ệ ớ ế ả ế nhiên, theo Dijkstra: “Vi c th nghi m chệ ử ệ ương trình ch ch ng minh s có m tỉ ứ ự ặ
c a l i ch không ch ng minh s v ng m t c a l i”.ủ ỗ ứ ứ ự ắ ặ ủ ỗ
Ngày nay, v i các công c toán h c ngớ ụ ọ ười ta có th ch ng minh tính đúng đ nể ứ ắ
c a m t thu t toán.ủ ộ ậ
2.2.2. Mâu thu n gi a tính đ n gi n và tính hi u qu : ẫ ữ ơ ả ệ ả
M t thu t toán đ n gi n (d hi u) ch a h n t i u v th i gian và b nh ộ ậ ơ ả ễ ể ư ẳ ố ư ề ờ ộ ớ
Đ i v i nh ng chố ớ ữ ương trình ch dùng m t vài l n thì tính đ n gi n có th coiỉ ộ ầ ơ ả ể
tr ng nh ng n u chọ ư ế ương trình được s d ng nhi u l n (ví d , các ph n m m)ử ụ ề ầ ụ ầ ề thì th i gian th c hi n rõ ràng ph i đờ ự ệ ả ược chú ý
Yêu c u v th i gian và không gian ít khi có m t gi i pháp tr n v n.ầ ề ờ ộ ả ọ ẹ
2.2.3. Phân tích th i gian th c hi n thu t toán: ờ ự ệ ậ
Th i gian th c hi n thu t toán ph thu c vào nhi u y u t :ờ ự ệ ậ ụ ộ ề ế ố
Kích thước d li u đ a vào (dung lữ ệ ư ượng). N u g i n là kích thế ọ ước d li uữ ệ vào thì th i gian th c hi n m t thu t toán, ký hi u là T(n).ờ ự ệ ộ ậ ệ
T c đ x lý c a máy tính, b nh (RAM).ố ộ ử ủ ộ ớ
Ngôn ng đ vi t chữ ể ế ương trình
Trang 10Tuy nhiên, ta có th so sánh th i gian th c hi n c a hai thu t toán khác nhau.ể ờ ự ệ ủ ậ
Ví dụ: N u th i gian th c hi n c a thu t toán th nh t Tế ờ ự ệ ủ ậ ứ ấ 1(n) = Cn2 (C: h ngằ
dương) và th i gian th c hi n thu t toán th hai Tờ ự ệ ậ ứ 2(n) = Kn (K: h ng) thì khi nằ khá l n, th i gian th c hi n thu t toán 2 s t i u h n so v i thu t toán 1.ớ ờ ự ệ ậ ẽ ố ư ơ ớ ậ
Cách đánh giá th i gian th c hi n thu t toán theo ki u trên đờ ự ệ ậ ể ược g i là đánhọ giá th i gian th c hi n thu t toán theo “đ ph c t p tính toán c a thu t toán”.ờ ự ệ ậ ộ ứ ạ ủ ậ
2.2.3.1. Đ ph c t p tính toán c a thu t toán: ộ ứ ạ ủ ậ
N u th i gian th c hi n m t thu t toán là T(n) = Cnế ờ ự ệ ộ ậ 2 (C: h ng), thì ta nóiằ
r ng: Đ ph c t p tính toán c a thu t toán này có c p là nằ ộ ứ ạ ủ ậ ấ 2 và ta ký hi u T(n) =ệ O(n2)
T ng quát: ổ T(n) = O(g(n)) thì ta nói đ ph c t p c a thu t toán có c p là g(n).ộ ứ ạ ủ ậ ấ
N u chế ương trình P được phân tích thành 2 ph n: Pầ 1, P2 và n u đ ph c t pế ộ ứ ạ
c a Pủ 1 là T1(n) = O(g1(n)) và đ ph c t p c a Pộ ứ ạ ủ 2 là T2(n) = O(g2(n)) thì đ ph cộ ứ
Trang 11for (j=1;j<=n;j++) x=x+1;
có th i gian th c hi n là: O(n*n*1) = O(nờ ự ệ 2)
Thông thường, đ xác đ nh đ ph c t p tính toán c a m t thu t toán, ngể ị ộ ứ ạ ủ ộ ậ ười ta
đi tìm m t l nh/phép toán có s l n th c hi n là nhi u nh t (l nh/phép toánộ ệ ố ầ ự ệ ề ấ ệ tích c c) t đó tính s l n này ự ừ ố ầ đ ph c t p c a tính toán.ộ ứ ạ ủ
Có khi th i gian th c hi n m t thu t toán còn ph thu c vào đ c đi m c a dờ ự ệ ộ ậ ụ ộ ặ ể ủ ữ
li u. B y gi T(n) trong trệ ấ ờ ường h p thu n l i nh t có th khác T(n) trongợ ậ ợ ấ ể
trường h p x u nh t. Tuy nhiên, thông thợ ấ ấ ường người ta v n đánh giá đ ph cẫ ộ ứ
t p tính toán c a thu t toán thông qua T(n) trong trạ ủ ậ ường h p x u nh t.ợ ấ ấ
Ví dụ: Cho m t dãy g m có n ph n t m ng: V[0], V[1], , V[n1]. X là m tộ ồ ầ ử ả ộ giá tr cho trị ước
cout << i; found=1;
}else i=i+1;
Trang 12CH ƯƠ NG 3: Đ QUY (RECURSION) Ệ
3.1. Đ i cạ ương:
Chương trình đ quy là chệ ương trình g i đ n chính nó.ọ ế
Ví dụ: M t hàm đ quy là m t hàm độ ệ ộ ược đ nh nghĩa d a vào chính nó.ị ự
Trong lý thuy t tin h c, ngế ọ ười ta thường dùng th thu t đ quy đ đ nh nghĩaủ ậ ệ ể ị các đ i tố ượng
Ví dụ: Tên bi n đế ược đ nh nghĩa nh sau:ị ư
M i ch cái là m t tên.ỗ ữ ộ
N u t là tên bi n thì t <ch cái>, t <ch s > cũng là tên bi n.ế ế ữ ữ ố ế
M t chộ ương trình đ quy ho c m t đ nh nghĩa đ quy thì không th g i đ nệ ặ ộ ị ệ ể ọ ế chính nó mãi mãi mà ph i có m t đi m d ng đ n m t trả ộ ể ừ ế ộ ường h p đ c bi t nàoợ ặ ệ
đó, mà ta g i là trọ ường h p suy bi n (degenerate case).ợ ế
Ví dụ: Cho s t nhiên n, ta đ nh nghĩa n! nh sau:ố ự ị ư n! =
1 0!
1)!
(n
*n
L i gi i đ quy: N u l i gi i c a m t bài toán T nào đó đờ ả ệ ế ờ ả ủ ộ ược th c hi n b ngự ệ ằ
m t l i gi i c a bài toán T' có d ng gi ng nh T, nh ng theo m t nghĩa nào đó T'ộ ờ ả ủ ạ ố ư ư ộ
là "nh h n" T và T' có khuynh hỏ ơ ướng ngày càng ti p c n v i trế ậ ớ ường h p suyợ
bi n.ế
Ví dụ: Cho dãy các ph n t m ng V[1], V[2], , V[n] đã đầ ử ả ượ ắc s p x p theoế
th t tăng d n, g i X là m t giá tr b t k Vi t thu t toán tìm ki m đ in v tríứ ự ầ ọ ộ ị ấ ỳ ế ậ ế ể ị
c a ph n t nào đó trong m ng có giá tr b ng X (n u có). Ngủ ầ ử ả ị ằ ế ượ ạc l i, thông báo không có
if (x==V[g]) cout << g;
else if (x<V[g]) timkiem(d, g-1, x);
else timkiem(g+1, c, x);
}}
Nh n xétậ :
Bài toán tìm ki m ban đ u đế ầ ược tách thành các bài toán tìm ki m v iế ớ
ph m vi nh h n cho đ n khi g p ph i các trạ ỏ ơ ế ặ ả ường h p suy bi n. Chínhợ ế
Trang 13vi c phân tích đó, ngệ ười ta đã xem thu t toán đ quy là thu t toán th hi nậ ệ ậ ể ệ
phương pháp "chia đ tr ".ể ị
N u th t c ho c hàm ch a l i g i đ n chính nó (ví d trên) thì đế ủ ụ ặ ứ ờ ọ ế ụ ược g iọ
là đ quy tr c ti p. Ngệ ự ế ượ ạc l i, có th t c ch a l i g i đ n th t c khácủ ụ ứ ờ ọ ế ủ ụ
mà th t c này ch a l i l i g i đ n nó thì đở ủ ụ ứ ạ ờ ọ ế ược g i là đ quy gián ti p,ọ ệ ế hay còn g i là đ quy tọ ệ ương h hay còn g i là Forward.ỗ ọ
Phân tích trường h p chung (đ a bài toán dợ ư ướ ại d ng bài toán cùng lo i nh ngạ ư
có ph m vi gi i quy t nh h n theo nghiã d n d n s ti n đ n trạ ả ế ỏ ơ ầ ầ ẽ ế ế ường h p suyợ
Trang 14else return F(n-1)+F(n-2);
}
Nh n xétậ :
Thông thu ng thay vì s d ng l i gi i đ quy cho m t bài toán, ta có th thayờ ử ụ ờ ả ệ ộ ể
th b ng l i gi i không đ quy (kh đ quy) b ng phế ằ ờ ả ệ ử ệ ằ ương pháp l p.ặ
Vi c s d ng thu t toán đ quy có:ệ ử ụ ậ ệ
u đi m
Ư ể Khuy t đi mế ể
Thu n l i cho vi c bi u di n bài toán.ậ ợ ệ ể ễ Có khi không đượ ố ưc t i u v th i gian.ề ờ
G n (đ i v i chọ ố ớ ương trình) Có th gây t n b nh ể ố ộ ớ x y ra hi nả ệ
tượng tràn b nh ngăn x p (Stack) n uộ ớ ế ế
d li u l n.ữ ệ ớ
Chính vì v y, trong l p trình ngậ ậ ười ta c tránh s d ng th t c đ quy n uố ử ụ ủ ụ ệ ế
th y không c n thi t.ấ ầ ế
Bài t p: ậ
1) Vi t hàm lu th a float ế ỹ ừ lt(float x, int n) cho ra giá tr xị n
2) Vi t chế ương trình nh p vào s nguyên r i đ o ngậ ố ồ ả ượ ốc s đó l i (không đạ ượ cdùng phương pháp chuy n s thành xâu).ể ố
3) Vi t chế ương trình cho phép s n sinh và hi n th t t c các s d ng nh phânả ể ị ấ ả ố ạ ị
đ dài n (ộ có g m n ch s ).ồ ữ ố
Ví d 1 ụ : Vi t th t c in xâu đ o ngế ủ ụ ả ượ ủc c a xâu X
Trước khi xây d ng hàm InNguoc thì ta xây d ng hàm tách chu i con t chu iự ự ỗ ừ ỗ
m trẹ ướ ừ ịc t v trí là batdau và l y ấ soluong ký t ự
char *copy(char *chuoi,int batdau,int soluong)
{ int i; char *tam;
tam=(char *)malloc(100);
for(i=(batdau-1);i<strlen(chuoi)&& i<(batdau-1+soluong);i++) tam[i-(batdau-1)]=chuoi[i];
Trang 15}}
Cách 2:
Trường h p chung:ợ + Đ o ngả ược xâu X đã b ký t đ u tiên.ỏ ự ầ
+ In ký t đ u tiên c a X.ự ầ ủ
Trường h p suy bi n: N u xâu r ng thì không làm gì h t.ợ ế ế ỗ ế
void Innguoc(X){
if (X!=”“)
{InNguoc(copy(X, 1,strlen(X)-2);
A sang c c C v i đi u ki n:ọ ớ ề ệ
M i l n ch đỗ ầ ỉ ược chuy n m t đĩa.ể ộ
Không có trường h p đĩa l n đợ ớ ược đ t trên đĩa nh ặ ỏ
Trang 16 Trường h p chung (n ợ 2):
Th v i n=2:ử ớ + Chuy n đĩa th nh t t A sang B.ể ứ ấ ừ
+ Chuy n đĩa th 2 t A sang C.ể ứ ừ+ Chuy n đĩa th nh t t B sang C.ể ứ ấ ừ
T ng quát:ổ + Chuy n (n 1) đĩa t A sang B (C làm trung gian).ể ừ
+ Chuy n 1 đĩa t A sang C (B: trung gian)ể ừ+ Chuy n (n 1) đĩa t B sang C (A: trung gian).ể ừSuy ra thu t toán đ quy:ậ ệ
HaNoi(1, A, B, C);
HaNoi(n -1, B, A, C);
} }
3.3. Thu t toán quay lui:ậ
Ta có th dùng k thu t đ quy đ di n t thu t toán quay lui. Bài toán sể ỹ ậ ệ ể ễ ả ậ ử
d ng thu t toán quay lui thụ ậ ường có d ng: Xác đ nh m t b g m n thành ph n: xạ ị ộ ộ ồ ầ 1,
x2, , xn tho mãn đi u ki n B nào đó.ả ề ệ
Ph ươ ng pháp c a thu t toán quay lui: ủ ậ
Gi s ta đã xác đ nh đả ử ị ược i1 thành ph n: xầ 1, x2, , xi1. Đ xác đ nh thànhể ị
ph n xầ i, ta duy t t t c các kh năng có th có c a nó.ệ ấ ả ả ể ủ
Ví dụ: xi có th có giá tr t 1 đ n 8; g i j là các giá tr có th có c a xể ị ừ ế ọ ị ể ủ i, lúc đó
ta dùng câu l nh For nh sau: ệ ư For (j=1;j<8;j++)
Bây gi , v i m i kh năng j ta luôn ki m tra xem j có đờ ớ ỗ ả ể ược ch p nh n không?ấ ậ (li u b (xệ ộ 1, x2, …, xi) hi n t i có thoã mãn đi u ki n B hay không?)ệ ạ ề ệ
Nh v y, x y ra 2 trư ậ ả ường h p:ợ
N u ch p nh n j:ế ấ ậ
Xác đ nh xị i theo j: xi=j;
Sau đó, n u i còn nh h n n thì ta ti n hành xác đ nh xế ỏ ơ ế ị i+1
Ngượ ạc l i (i = n) thì ta được m t l i gi i.ộ ờ ả
Ki m tra j ti p theo.ể ế
N u t t c các kh năng c a j không có kh năng nào đế ấ ả ả ủ ả ược ch p nh n thìấ ậ quay l i bạ ước trước đ xác đ nh l i xể ị ạ i1. (C ch ho t đ ng trong b nhơ ế ạ ộ ộ ớ
c a thu t toán đ quy giúp có th th c hi n đủ ậ ệ ể ự ệ ược đi u này).ề
Vi c xác đ nh xệ ị i có th mô t qua th t c đ quy sau:ể ả ủ ụ ệ
Trang 17void Try(i) //Thử xem xi sẽ nhận giá trị nào
for (mỗi khả năng j của x i)
Bài t p: ậ
1) Tìm t t c các hoán v c a m t m ng g m có n ph n t ấ ả ị ủ ộ ả ồ ầ ử
2) Bài toán 8 con h u: Hãy tìm cách đ t 8 quân h u trên m t bàn c vua sao choậ ặ ậ ộ ờ không có quân h u nào có th ăn các quân h u khác.ậ ể ậ
Trang 18CH ƯƠ NG 4: M NG VÀ DANH SÁCH TUY N TÍNH Ả Ế
4.1. M ng và c u trúc l u tr c a m ng:ả ấ ư ữ ủ ả
M ng là c u trúc d li u đ n gi n và thông d ng trong nhi u ngôn ng l pả ấ ữ ệ ơ ả ụ ề ữ ậ trình
Khi đó, B[i][j] là m t ph n t c a ma tr n B. Trong đó i là hàng còn j là c t.ộ ầ ử ủ ậ ộ
Tương t ta cũng có m ng 3 chi u, m ng 4 chi u.ự ả ề ả ề
Loc (a0): đ a ch ph n t aị ỉ ầ ử 0
đ a ch c a ph n t th aị ỉ ủ ầ ử ứ i:
Loc (ai) = Loc (a0) + d*i
L u ý:ư
Đ i v i m ng nhi u chi u, vi c t ch c l u tr cũng đố ớ ả ề ề ệ ổ ứ ư ữ ược th c hi nự ệ
tương t :ự
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
Đ a ch c a ph n t aị ỉ ủ ầ ử ij:
Loc (a[i][j]) = Loc (a[0][0]) + d*(i*n + j)
Trang 19Trong đó, n là s c t c a ma tr n.ố ộ ủ ậ
Bài t p: ậ
1) Vi t công th c t ng quát đ tính đ a ch c a m t ph n t nào đó c a m tế ứ ổ ể ị ỉ ủ ộ ầ ử ủ ộ
m ng n chi u (Loc a[iả ề 0, …, in1]), v i ch s các chi u này l n lớ ỉ ố ề ầ ượt là: b0 b'0,
đó, nhược đi m c a vi c l u tr m ng là:ể ủ ệ ư ữ ả
+ Ph i khai báo ch s t i đa, do đó có trả ỉ ố ố ường h p gây lãng phí b nh ợ ộ ớ+ Khó khăn trong vi c th c hi n phép xoá / chèn m t ph n t trongệ ự ệ ộ ầ ử
m ng.ả
2) Gi s trong b nh có m ng a g m n ph n t aả ử ộ ớ ả ồ ầ ử 0, a1, ,an1
Hãy vi t các hàm sau:ế
+ void Xoa(i): Xoá ph n t th i trong m ng này.ầ ử ứ ả
+ void ChenSau(i, x): Chèn sau ph n t th i m t ph n t có giá tr là x.ầ ử ứ ộ ầ ử ị4.2. Danh sách tuy n tính (Linear list):ế
Đ nh nghĩa: ị
Danh sách tuy n tính là m t dãy có th t aế ộ ứ ự 1, a2, , an (n>=0). N u n=0 đế ượ c
g i là danh sách r ng. Ngọ ỗ ượ ạc l i: a1 được g i là ph n t đ u tiên, aọ ầ ử ầ n được g i làọ
ph n t cu i cùng, và n đầ ử ố ược g i là chi u dài c a danh sách.ọ ề ủ
Đ i v i danh sách tuy n tính, v i m i ph n t aố ớ ế ớ ỗ ầ ử i (i =1, n1) thì có ph n tầ ử
ti p theo là aế i+1 và v i m i ph n t aớ ỗ ầ ử i (i = 2 n) thì có ph n t đ ng trầ ử ứ ước là
ai –1
Danh sách tuy n tính khác c b n v i m ng m t chi u ch là ế ơ ả ớ ả ộ ề ở ỗ kích thướ c
c a danh sách không c đ nhủ ố ị b i vì phép b sung và phép lo i b thở ổ ạ ỏ ườ ngxuyên tác đ ng lên m t danh sách. Ví d : Stack.ộ ộ ụ
Có nhi u cách đ l u tr m t danh sách tuy n tính:ề ể ư ữ ộ ế
+ L u tr theo đ a ch k ti p b ng m ng 1 chi u.ư ữ ị ỉ ế ế ằ ả ề
+ L u tr đ a ch b ng con tr (s d ng danh sách móc n i).ư ữ ị ỉ ằ ỏ ử ụ ố
+ L u tr ra file (s d ng b nh ngoài).ư ữ ử ụ ộ ớ
V i danh sách tuy n tính, ngoài phép b sung và lo i b còn có m t sớ ế ổ ạ ỏ ộ ố phép sau:
Trang 20+ Phép ghép 2 ho c nhi u danh sách thành m t danh sách (xemặ ề ộ
nh bài t p, làm trên m ng và tr ).ư ậ ả ỏ
0 1 M n1
0 1 n1+ Phép tách (tách m t danh sách thành 2 danh sách).ộ
+ Sao chép m t danh sách ra nhi u danh sách (2 danh sách).ộ ề
+ C p nh t ho c s a đ i n i dung các ph n t c a danh sách.ậ ậ ặ ử ổ ộ ầ ử ủ
Stack là m t ki u danh sách tuy n tính đ c bi t, trong đó phép b sung và lo iộ ể ế ặ ệ ổ ạ
b ch th c hi n m t đ u g i là đ nh Stack (đ u kia g i là đáy c a Stack).ỏ ỉ ự ệ ở ộ ầ ọ ỉ ầ ọ ủ
Nguyên t c b sung và lo i b đ i v i Stack đắ ổ ạ ỏ ố ớ ược g i là nguyên t c vào sauọ ắ
ra trước (LIFO – Last In First Out)
4.3.2. L u tr Stack b ng m ng: ư ữ ằ ả
Vì Stack là m t danh sách tuy n tính nên có th s d ng m ng m t chi u độ ế ể ử ụ ả ộ ề ể
t ch c m t Stack. Ch ng h n: s d ng m ng S đ l u tr dãy các ph n t :ổ ứ ộ ẳ ạ ử ụ ả ể ư ữ ầ ử S[1], S[2], , S[n] (n g i là s ph n t c c đ i c a m ng S).ọ ố ầ ử ự ạ ủ ả
G i T là ch s c a ph n t đ nh c a Stack. T đọ ỉ ố ủ ầ ử ỉ ủ ượ ử ục s d ng đ theo dõi v tríể ị
đ nh c a Stack nên n u s d ng danh sách móc n i đ t ch c m t Stack thì Tỉ ủ ế ử ụ ố ể ổ ứ ộ
được xem nh là m t con tr ch vào v trí đ nh c a Stack.ư ộ ỏ ỉ ị ỉ ủ
Giá tr c a T s tăng lên m t đ n v khi b sung m t ph n t vào danh sách vàị ủ ẽ ộ ơ ị ổ ộ ầ ử
s gi m b t 1 khi lo i b m t ph n t ra kh i Stack.ẽ ả ớ ạ ỏ ộ ầ ử ỏ
S[n]
…S[T]
…S[2]
S[1]
L u ý:ư
Khi T = n thì không th b sung thêm (hay nói cách khác là Stack đ y).ể ổ ầ
Khi T = 0 thì không th lo i b ph n t vì khi đó Stack r ng (hay Stack c n).ể ạ ỏ ầ ử ỗ ạ
Thu t toán b sung m t ph n t X vào Stack S có đ nh là T: ậ ổ ộ ầ ử ỉ
T
Trang 21void Push(S, &T, X) //T: tham biến
if (T==n) cout << “Không bổ sung được”;
else
{T=T+1;
S[T]=X;
} return;
Thu t toán lo i b kh i Stack S ph n t t i đ nh T và gán giá tr c a ph n ậ ạ ỏ ỏ ầ ử ạ ỉ ị ủ ầ
T=T-1;
} return;
+ T2 dùng đ theo dõi v trí đ nh c a Stack 2 (đây là ph n t n c a m ng S).ể ị ỉ ủ ầ ử ủ ả
=> N u Tế 2 = T1 + 1 thì ngưỡng, lúc này c hai Stack cùng đ y.ả ầ
Vi t các hàm sau:ế
void Bosung(i, x)
Dùng đ b sung vào Stack i (i = ể ổ 1 ,2) m t ph n t x.ộ ầ ử
2) void Loaibo (i, x)
Dùng đ lo i b 1 ph n t ra kh i Stack i (i = ể ạ ỏ ầ ử ỏ 1 , 2 ) và tr v ph n t này choả ề ầ ử tham bi n x.ế
Trang 222.while (n!=0)
{r= n % 2;
cout << r;
}
return; // Lưu ý: int S[100]
Trang 23Ví d 2 ụ : Vi t chế ương trình tính giá tr c a m t bi u th c h u t (t c là ký phápị ủ ộ ể ứ ậ ố ứ
Ba Lan đ o).ả
M t s khái ni m: ộ ố ệ
Bi u th c s h c mà ta thể ứ ố ọ ường s d ng đử ụ ược g i là bi u th c trung t ọ ể ứ ố Ở đây, ta coi các thành ph n (token) có trong m t bi u th c trung t bao g m: h ngầ ộ ể ứ ố ồ ằ
s (toán h ng), toán t (+, , *, /), các d u ngo c: (, ).ố ạ ử ấ ặ
Bi u th c s h c còn có th bi u di n dể ứ ố ọ ể ể ễ ướ ại d ng ký pháp h u t (bi u th cậ ố ể ứ
h u t ) và ký pháp ti n t (bi u th c ti n t ).ậ ố ề ố ể ứ ề ố
Ví d :ụ 2 + 3 bi u th c trung t ể ứ ố
2 3 + bi u th c h u t (các toán t đi sau các toán h ng).ể ứ ậ ố ử ạ
+ 2 3 bi u th c ti n t (các toán t đi trể ứ ề ố ử ước các toán h ng).ạ
V i các ký pháp m i này (ký pháp Ba Lan), d u ngo c là không c n thi t.ớ ớ ấ ặ ầ ế
h ng m i. Quá trình này l i ti p t c cho đ n khi có đạ ớ ạ ế ụ ế ược k t qu cu i cùng.ế ả ố
1) Chuy n thu t toán trên thành chể ậ ương trình C
2) Nh p xâu có n i dung là bi u th c h u t , các token cách nhau 1 ô tr ng.ậ ộ ể ứ ậ ố ố
Vi t chế ương trình tính k t qu c a bi u th c v a nh p.ế ả ủ ể ứ ừ ậ
Trang 24Ví d 3 ụ : Vi t chế ương trình đ chuy n bi u th c trung t sang h u t ể ể ể ứ ố ậ ố
case <Token là toán hạng>:
{ C ng vào bên ph i c a xâu (kèm kho ng tr ng). }ộ ả ủ ả ắXau=Xau + Token + “ “;break;
case <Token là toán tử>:
ff (<Stack rỗng>) <Push Token này>;
else{// So sánh token này với toán tử ở đỉnh Stack;
if (<Token > toán tử ở đỉnh Stack>)
<Push Token này>;
else{
- <Lặp việc Pop các toán tử ở đỉnh Stack cộng vào bên phải của xâu (trừ dấu “ ( “ ) cho tới khi Token > toán
tử ở đỉnh hoặc Stack rỗng>;
- <Push Token này;>
}} break;
case <Token là “(“>: <Push Token này>;break;
case <Token là “)”>:
<Lặp việc Pop các toán tử ở đỉnh Stack cộng vào bên phải của xâu (trừ dấu ngoặc mở) cho tới khi gặp dấu ngoặc mở.>; break;
}
while (<chưa hết chuỗi trong biểu thức trung tố>);
3) Pop các phần tử còn lại trong Stack vào bên phải của xâu cho đến khi Stack rỗng rối đưa vào bên phải xâu
4) cout << Xâu;
Bài t p: ậ
Nh p m t xâu có n i dung là bi u th c trung t Tính k t qu bi u th c này.ậ ộ ộ ể ứ ố ế ả ể ứ
Chú ý: Các toán t : ử *, /, +, , (, ). Dùng hàm tr v th t u tiên đ so sánh:ả ề ứ ự ư ể
Trang 25* hay / tr v 2.ả ề
+ hay tr v 1.ả ề
( hay ) tr v 0.ả ề
4.3.4. Stack v i vi c cài đ t thu t toán đ quy: ớ ệ ặ ậ ệ
Vi c cài đ t m t thu t toán đ quy đệ ặ ộ ậ ệ ượ ổc t ch c trong b nh dứ ộ ớ ướ ạ i d ngStack. C th : Khi m t chụ ể ộ ương trình con đ quy đệ ược g i t chọ ừ ương trình chính thì ta nói chương trình con được th c hi n m c 1. Và trong chự ệ ở ứ ương trình con,
g p l i g i c a chính nó thì chặ ờ ọ ủ ương trình con l n lầ ượ ượt đ c th c hi n các m cự ệ ở ứ
2, m c 3, , m c k (m c k ph i đứ ứ ứ ả ược hoàn thành xong thì m c k1 m i đứ ớ ượ c
th c hi n ti p).ự ệ ế
Khi t m c i đi sâu vào m c i+1 thì có th có m t s tham s , bi n c c b ,ừ ứ ứ ể ộ ố ố ế ụ ộ
đ a ch quay lui ng v i m c i s đị ỉ ứ ớ ứ ẽ ược b o l u đ khi quay v chúng s đả ư ể ề ẽ ượ ckhôi ph c đ ti p t c s d ng.ụ ể ế ụ ử ụ
Nh ng tham s c a bi n c c b , nh ng đ a ch quay lui đữ ố ủ ế ụ ộ ữ ị ỉ ược b o l u sau thìả ư
nó l i đạ ược khôi ph c trụ ước
S d ng Stack trong vi c cài đ t chử ụ ệ ặ ương trình con đ quy theo hình th c sau:ệ ứ
Khi có l i g i đ n chính nó thì Stack s đờ ọ ế ẽ ược b sung m t ph n t ( làổ ộ ầ ử
m t record g m các trộ ồ ường: tham s , bi n c c b , đ a ch quay lui).ố ế ụ ộ ị ỉ
Khi thoát kh i m t m c thì 1 ph n t đ nh Stack s đỏ ộ ứ ầ ử ở ỉ ẽ ượ ấc l y ra (khôi
ph c l i giá tr c n thi t trụ ạ ị ầ ế ước đây)
Ta có th tóm t t các b ể ắ ướ c này nh sau: ư
Bước 1: Bước m đ u (b n ch t là Push): B o l u tham s , bi n c c b vàở ầ ả ấ ả ư ố ế ụ ộ
N u ngế ượ ạc l i thì th c hi n ph n tính t ng ph n và chuy n sang bự ệ ầ ừ ầ ể ước 1
Bước 3: Bước k t thúc. Khôi ph c l i tham s , bi n c c b và đ a ch quayế ụ ạ ố ế ụ ộ ị ỉ lui (pop). Và chuy n đ n đ a ch quay lui này.ể ế ị ỉ
Chú ý: D a vào nguyên t c này mà Stack th ng đ c s d ng đ bi n đ iự ắ ườ ượ ử ụ ể ế ổ
m t thu t toán đ quy thành m t thu t toán không đ quy.ộ ậ ệ ộ ậ ệ
Ví d 1 ụ : Bài toán tháp Hà N i:ộ
Trang 26BoVao(r, 1, rr.aa, rr.bb, rr.cc);
BoVao(r, rr.nn-1, rr.aa, rr.cc, rr.bb);
} }
while (T!=0);
}
Ví d 2:ụ
Chương trình sau mô t thu t toán tính n! theo ki u đ quy nh ng b ng cách s ả ậ ể ệ ư ằ ử
d ng Stack: là m ng mà m i ph n t c a nó là m t record g m 2 trụ ả ỗ ầ ử ủ ộ ồ ường: trường Para (tham s ) và trố ường Addr (đ a ch quay lui).ị ỉ
Trang 27goto 4;
}else
{TempRec.Para=a[T].Para-1;
TempRec.Addr=3;
}goto 1;
3: Kq=Kq*a[T].Para;
4: Pop(TempRec);
switch (TempRec.Addr){
case 3: goto 3;break;
case 5: goto 5;break;
}
5: cout << Kq;
}
Trang 284.4. Hàng đ i (Queue):ợ
4.4.1. Đ nh nghĩa: ị
Hàng đ i là m t danh sách tuy n tính mà phép b sung đợ ộ ế ổ ược th c hi n m tự ệ ở ộ
đ u (g i là l i vào/l i sau: rear) và phép lo i b đầ ọ ố ố ạ ỏ ược th c hi n đ u kia (l iự ệ ở ầ ố ra/l i trố ước: front)
Nh n xétậ : C c u c a Queue gi ng nh m t hàng đ i: vào trơ ấ ủ ố ư ộ ợ ước ra trước. do đó Queue còn được g i là danh sách ki u FIFO (First In First Out).ọ ể
4.4.2. L u tr Queue b ng m ng: ư ữ ằ ả
Có th dùng m ng m t chi u Q có n ph n t làm c u trúc l u tr c a hàngể ả ộ ề ầ ử ấ ư ữ ủ
đ i. Đ x lý Q ta dùng 2 bi n:ợ ể ử ế
+ Bi n R đ theo dõi v trí l i sau c a Q.ế ể ị ố ủ
+ Bi n F đ theo dõi v trí l i trế ể ị ố ướ ủc c a Q
L u ý ư :
Khi Q (Queue) r ng thì ta quy ỗ ước: F = R = 0
Khi m t ph n t độ ầ ử ược b sung thì R tăng lên 1 (ổ R=R+1). Khi l y b t m tấ ớ ộ
ph n t ra thì F tăng lên 1 (ầ ử F=F+1)
Tuy nhiên, v i cách t ch c này có th xu t hi n tình hu ng là đ n m t lúcớ ổ ứ ể ấ ệ ố ế ộ nào đó không th b sung ti p ph n t nào nh ng không gian nh c a m ng Qể ổ ế ầ ử ư ớ ủ ả
v n còn ch Đ kh c ph c, ta xem Q nh là m t m ng vòng tròn, nghĩa là xemẫ ỗ ể ắ ụ ư ộ ả Q[1] đ ng sau Q[n].ứ
Trang 29void Delete_Queue(&Q, &F, &R, &X) //Q, F, R, X: tham biến
if (F==0) pritnf(“Hàng đợi đang cạn!”);
phương pháp sau:
Ví d :ụ 1 + (2 * (3 + 4))
1 ( 2 * ( 3 + 4
L n lầ ượ ọt đ c các token t trái sang ph i đ push vào m t Stack cho đ n khiừ ả ể ộ ế
g p d u ‘)’ thì l n lặ ấ ầ ượ ất l y các ph n t trong Stack này đ b vào m tầ ử ở ể ỏ ộ danh sách th hai (b vào t phía trái) cho đ n khi g p d u ‘(‘.ứ ỏ ừ ế ặ ấ
Trang 30 Lúc đó ta coi Stack này nh m t hàng đ i đ s d ng th t c trong bài t p 1ư ộ ợ ể ử ụ ủ ụ ậ
mà x lý.ử
Nh n xétậ : M t Stack cũng có th xem nh là m t Queue ho c là m t danh sáchộ ể ư ộ ặ ộ tuy n tính nói chung. V n đ quan tr ng là ta c n s d ng 2 bi n đ theo dõi vế ấ ề ọ ầ ử ụ ế ể ị trí 2 đ u c a danh sách này đ có th th c hi n phép b sung hay lo i b cho phùầ ủ ể ể ự ệ ổ ạ ỏ
h p.ợ
Trang 31CH ƯƠ NG 5: DANH SÁCH MÓC N I (LINKED LIST) Ố
Ph n liên k t (Next): Đây là m t trầ ế ộ ường ch a đ a ch c a ph n t ngay sauứ ị ỉ ủ ầ ử
nó (là m t con tr ). Trộ ỏ ường này có ki u d li u con tr ể ữ ệ ỏ
Các nút có th n m r i rác trong b nh ể ằ ả ộ ớ
Đ có th truy c p đ n m i ph n t c a danh sách, ta ph i truy nh p vào nútể ể ậ ế ọ ầ ử ủ ả ậ
đ u tiên. do đó ph i có con tr First đ tr vào ph n t đ u tiên c a danh sách.ầ ả ỏ ể ỏ ầ ử ầ ủ
T nút đ u tiên, thông qua trừ ầ ường Next ta s đi đ n nút th hai và c nh th taẽ ế ứ ứ ư ế
có th duy t h t các ph n t trong danh sách.ể ệ ế ầ ử
Ph n t cu i cùng trong danh sách có trầ ử ố ường Next không ch a đ a ch c aứ ị ỉ ủ
ph n t nào c mà ta g i là NULL.ầ ử ả ọ
Khi danh sách r ng, ta quy ỗ ước First = NULL;
Ta ký hi u:ệ
p = new <ki u>;ể là th t c nh m t o m t vùng nh còn tr ng đ ch aủ ụ ằ ạ ộ ớ ố ể ứ
m t nút và nút này độ ược tr b i con tr p (p ch a đ a ch nút này).ỏ ở ỏ ứ ị ỉ
delete p; là th t c đ gi i phóng vùng nh c a nút tr b i con tr p kh iủ ụ ể ả ớ ủ ỏ ở ỏ ỏ
Trang 32void Insert_Node(&First, p, X); //First: tham biến
Tam= new Nut;
5.1.2.2. Lo i b m t nút đang tr b i p ra kh i danh sách: ạ ỏ ộ ỏ ở ỏ
void Delete_Node(&First, p); //First: tham biến
Trang 33Vi t th t c:ế ủ ụ
1) void docfile(Nut **first;FILE *f); đ l n lể ầ ượt
đ c các dòng trong file VB.TXT và đ a ra m t danh sách mócọ ư ộ
n i đ n có ph n t đ u tr b i first, ki u d li u là con tr nhố ơ ầ ử ầ ỏ ở ể ữ ệ ỏ ư
Trong danh sách n i đ n, trố ơ ường Next c a nút cu i danh sách có giá tr NULL,ủ ố ị
đ t o nên s linh ho t trong vi c truy c p đ n các ph n t c a danh sách, ngể ạ ự ạ ệ ậ ế ầ ử ủ ườ i
ta cho trường Next c a nút này l i tr đ n nút đ u c a danh sách và đủ ạ ỏ ế ầ ủ ược danh sách có c u trúc nh sau:ấ ư T
Trong danh sách này có m t con tr T ch y. Trong trộ ỏ ạ ường h p n i đ n thìợ ố ơ
đ ng m i nút ta ch có th truy c p đ n các ph n t đ ng sau nó nh ng v iứ ở ỗ ỉ ể ậ ế ầ ử ứ ư ớ danh sách n i vòng, ta có th truy c p vào t t c các nút c a danh sách t b t kố ể ậ ấ ả ủ ừ ấ ỳ nút nào. Song cách t ch c này có th d n đ n tình tr ng là truy c p không k tổ ứ ể ẫ ế ạ ậ ế thúc. Nhược đi m này có th để ể ược kh c ph c b ng cách thêm m t nút vào danhắ ụ ằ ộ sách g i là nút đ u danh sách và bi n tr Head ch a đ a ch c a nút đ u này.ọ ầ ế ỏ ứ ị ỉ ủ ầ
Head
Trang 34N i dung c a trộ ủ ường Info c a nút này (tr b i Head) không ch a thông tinủ ỏ ở ứ nào.
Trong trường h p danh sách r ng, ta có:ợ ỗ Head>Next = Head
5.2.2. Thu t toán b sung và lo i b m t nút c a danh sách n i vòng: ậ ổ ạ ỏ ộ ủ ố
5.2.2.1. B sung m t nút có n i dung tr ổ ộ ộ ườ ng Info là X vào ngay sau nút đ u danh ầ sách Head:
void Insert_Node(Head, X) // Head: tham trị
Lúc đó danh sách có d ng nh sau:ạ ư
Nh n xétậ :
Danh sách này s d ng 2 bi n con tr First và Last đ tr t i nút đ u tiên vàử ụ ế ỏ ể ỏ ớ ầ nút cu i cùng. Trong đó trố ường Prev c a nút đ u tiên và trủ ầ ường Next c a nút cu iủ ố cùng có giá tr là NULL.ị
Trang 355.3.2. M t s phép toán trên danh sách n i kép: ộ ố ố
Chèn m t ph n t có tr ộ ầ ử ườ ng Info là X vào ngay sau nút đ ượ c tr b i p: ỏ ở
void Insert_Node(&First,&Last,p,X)//First,Last:tham biến
Lo i b m t nút tr b i p ra kh i danh sách: ạ ỏ ộ ỏ ở ỏ
void Delete_Node(First, Last, p)//First,Last:tham biến
Trang 36delete p;
return;
5.4. Ví d v vi c s d ng danh sách móc n i:ụ ề ệ ử ụ ố
Bi u di n m t đa th c b ng m t danh sách móc n i đ n.ể ễ ộ ứ ằ ộ ố ơ
Đa th c s đứ ẽ ược bi u di n dể ễ ưới m t danh sách n i đ n mà m i nút (l u m tộ ố ơ ỗ ư ộ
đ n th c) có d ng nh sau:ơ ứ ạ ư
H sệ ố Mũ Ti pếBài toán: Tính t ng 2 đa th c:ổ ứ
Gi s đa th c A(x), B(x) s đả ử ứ ẽ ược bi u di n b i 2 danh sách móc n i đ n l nể ễ ở ố ơ ầ
if (XX!=0) Ghep(C, R, XX, p->Mu);
p=p->Tiep;
q=q->Tiep;
}else if (p->Mu < q->Mu)
{
Trang 37
Ghep(C, R, q->Heso, q->Mu);
q=q->Tiep;
}else
{Ghep(C, R, p->Heso, p->Mu);
có nút đ u tr b i First thì có th coi First nh là đ nh Stack. ầ ỏ ở ể ư ỉ
B sung m t ph n t vào Stack cũng chính là b sung m t nút vào danh sáchổ ộ ầ ử ổ ộ
đ nút đó tr thành nút đ u tiên trong danh sách. Lo i b m t ph n t c a danhể ở ầ ạ ỏ ộ ầ ử ủ sách chính là lo i b ph n t đ u tiên. Đ i v i danh sách móc n i, chúng taạ ỏ ầ ử ầ ố ớ ố không c n ki m tra hi n tầ ể ệ ượng tràn Stack vì Stack dùng danh sách móc n i khôngố
b gi i h n kích thị ớ ạ ước nh dùng m ng (mà ch gi i h n b i b nh toàn ph n).ư ả ỉ ớ ạ ở ộ ớ ầ