1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Cấu trúc dữ liệu và thuật toán trên C++

74 125 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 74
Dung lượng 781,41 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

               3  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 2

5.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 3

CH ƯƠ 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 5

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

a= 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 8

CH ƯƠ 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 (top­down) 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 9

Nh 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 top­down.ậ ể

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 10

Tuy 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 11

for (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[n­1]. X là m tộ ồ ầ ử ả ộ  giá tr  cho trị ước

cout << i; found=1;

}else i=i+1;

Trang 12

CH ƯƠ 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 13

vi 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 14

else 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 i­1 thành ph n: xầ 1, x2, , xi­1. Đ  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ể ị ạ i­1. (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 17

void 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 18

CH ƯƠ 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 19

Trong đó, 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, …, in­1]), 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,   ,an­1

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, n­1) 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 n­1

0 1 n­1+ 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 21

void 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 22

2.while (n!=0)

{r= n % 2;

cout << r;

}

return; // Lưu ý: int S[100]

Trang 23

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

Ví 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 k­1 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 26

BoVao(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 27

goto 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 28

4.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 29

void 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 31

CH ƯƠ 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 32

void 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 33

Vi 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 34

N 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 35

5.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 36

delete 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).ư ả ỉ ớ ạ ở ộ ớ ầ

Ngày đăng: 15/05/2020, 22:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm