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

Bài giảng cấu trúc dữ liệu và giải thuật 13

241 32 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

Cấu trúc

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter0.intro - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.1.principle.concepts - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.1 - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.2.analysis.algorithm - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.2 - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.3.recursion - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter.1.3 - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter2.1-2.4.basicdatastructures - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter2.1 - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter2.2.stack.queue - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter2.5._2.6.stack.queue - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter3.tree - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter4.1.searching(basic) - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter4.2.avl.splay.2-3.tree - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter4.2.binary-search-tree - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter4.3.avl.splay.2_3tree - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter5.function - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter5.sorting - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_examples.chapter5 - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_exercise.chapter5.sorting - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter6.searching(advanced) - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapter7.graph - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_exercise.chapter7.graph - [cuuduongthancong.com].pdf‎

  • ‎F:\Tải Sách\cau-truc-du-lieu-va-giai-thuat_nguyen-duy-hiep_chapterxx.review.pointer - [cuuduongthancong.com].pdf‎

Nội dung

Data structures & Algorithms Nguyễn Duy Hiệp nguyenduyhiep@gmail.com tinhocdaicuong.wordpress.com Nội dung  Chương – Các khái niệm  Chương – Giải thuật đệ quy  Chương – Các cấu trúc liệu  Chương – Cấu trúc  Chương – Sắp xếp  Chương – Tìm kiếm  Chương – Đồ thị Tài liệu  [1] Cấu trúc liệu giải thuật, Đỗ Xuân Lôi, NXB ĐHQGHN  [2] Bài giảng cấu trúc liệu giải thuật, Nguyễn Đức Nghĩa  [3] Data structures and program design in C++, Robert L Kruse, Alexander J Ryba  [4] Algorithm in C, R Sedgewick, Addison Wesley  [5] Data structures and problem solving with C++, Mark Allen Weiss Yêu cầu    Kiến thức tốn Kỹ thuật lập trình Sử dụng ngơn ngữ lập trình:     PASCAL C/C++ Java Net Đánh giá   Thi kỳ (30%) Thi cuối kỳ (70%):  Thi viết  Sử dụng tài liệu  Nội dung thi : tất học !  Bài tập cộng điểm (0.5điểm/bài)  Xem thêm blog tinhocdaicuong.wordpress.com 1/10/2011 Phần I – Giới thiệu về Thuật tốn Chương 1.1 KHÁI NIỆM CƠ BẢN Nội dung 1.1 Thuật tốn là gì ? • Thuật tốn:  • 1.1. Thuật tốn là gì? • thủ tục để thực hiện một nhiệm vụ cụ thể • ý tưởng nằm sau các chương trình máy tính • 1.2 Tính chất của thuật tốn • Thuật tốn phải giải quyết bài tốn tổng qt, và được định  nghĩa rõ ràng.  • 1.2 .1 Tính chính xác • 1.2.2 Tính hiệu quả • Một thuật tốn giải bài tốn đặt ra là một thủ tục xác định bao  gồm một dãy hữu hạn các bước cần thực hiện để thu được  đầu ra cho một đầu vào cho trước của bài tốn • 1.3 Chứng minh thuật tốn đúng  • 1.4 Biểu diễn thuật toán Đầu vào Đầu Các bước thực CuuDuongThanCong.com 1/10/2011 1.2.1 Tính chính xác 1.1 Thuật tốn là gì ? • Thuật tốn phải cho đầu ra mong muốn ứng với bất cứ đầu  vào hợp lệ nào của bài tốn • Tính chính xác khơng phải lúc nào cũng dễ thấy! Bài tốn: sắp xếp • Đầu vào: một dãy gồm n khóa  a1 , a2 , , an • Đầu ra: một hốn vị có thứ tự của các khóa đầu vào trong đó a '1  a '2   a 'n VD. Bài tốn chọn lịch xem phim • Đầu vào: Một tập L gồm thời gian chiếu trong ngày của n bộ  phim • Đầu ra: Tập con của L chứa số bộ phim lớn nhất có thể xem  (khơng được chồng nhau về thời gian) Trường hợp cụ thể của bài tốn • {14, 45, 68, 24, 54, 34} • {Mike, Bob, Sally, Jill, Jan} • Chúng ta chỉ quan tâm đến các thuật tốn chính xác và hiệu  quả, và dễ cài đặt P1 P2 P3 1.2.1 Tính chính xác Sherlock holmes Up in the air  Avatar Angel and demon One Up Madagasca 2 Alice in the wonderland 1.2.1 Tính chính xác • Thuật tốn 3. Duyệt tồn bộ: duyệt 2n tập con của n bộ phim  trong L. Chọn ra tập con nào có số lượng phần tử lớn nhất.  Đảm bảo thu được kết quả tối ưu Thuật tốn chạy rất chậm, vd n =20 thì số tập con là 220 • Thuật tốn 1. Chọn bộ phim sớm nhất trong L mà khơng trùng  với các bộ phim đã chọn trước đó. Lặp lại cho đến khi khơng  thể chọn thêm • Thuật tốn 4 Thuật tốn tối ưu: sắp xếp các lịch chiếu phim  theo thứ tự khơng giảm thời gian kết thúc. Lần lượt xem xét  các phim trong danh sách đã sắp xếp, bổ sung vào danh sách  xem bộ phim đang xét nếu nó khơng chồng lên các bộ phim đã  có trong danh sách xem.  • Thuật tốn 2.  Chọn bộ phim có thời gian chiếu ngắn nhất  trong L mà khơng trùng với các bộ phim đã chọn trước. Lặp lại  cho đến khi khơng chọn thêm được • Có những bài tốn mà khơng tồn tại thuật tốn chính xác để  giải! CuuDuongThanCong.com 1/10/2011 1.2.1 Tính chính xác 1.2.2 Tính hiệu quả • Phân biệt giữa thuật tốn chính xác và khơng chính xác: đưa  ra một ví dụ thuật tốn mà thuật tốn cho kết quả sai (phản ví  dụ) “Tại sao khơng chỉ sử dụng mỗi siêu máy tính? ” • Siêu máy tính chỉ cho người giàu và những người q  ngốc để có thể thiết kế một thuật tốn hiệu quả!  • Chứng minh tính đúng đắn của thuật tốn: khó khăn hơn  nhiều • Thuật tốn nhanh hơn chạy trên các máy tính chậm  hơn sẽ thắng trong trường hợp dữ liệu đầu vào đủ lớn • Bài tập. Tìm các phản ví dụ cho các thuật tốn giải bài tốn  hành trình du lịch tối ưu Bài tốn cái túi Chọn đồ vật có giá trị cao trước • Đầu vào: n đồ vật, mỗi đồ vật i có một trọng lượng wi và một  giá trị ci. Một cái túi có thể chứa các đồ vật với trọng lượng tối  đa là b • Đầu ra: Cách chất các đồ vật vào túi sao cho trọng lượng tối đa  khơng vượt q b, và tổng giá trị các đồ vật trong túi là lớn  nhất.  ∑ • Sắp xếp các đồ vật theo thứ tự giảm về giá trị • Lần lượt xét các đồ theo thứ tự này, cho đồ vật đang xét vào  túi nếu nó cịn có thể chứa thêm được → • Xây dựng thuật tốn chất các đồ vào túi ? CuuDuongThanCong.com 1/10/2011 Chọn đồ vật theo tỉ lệ ci/wi Chọn đồ vật trọng lượng nhỏ trước • Sắp xếp các đồ vật theo thứ tự tăng trọng lượng • Lần lượt xét các đồ vật theo thứ tự này, chọn đồ vật đang xét  vào túi nếu nó vẫn có thể chứa thêm • Sắp xếp các đồ vật theo thứ tự giảm của tỉ lệ giá trị/ trọng  lượng … • Lần lượt xét các đồ vật theo  thứ tự này, chọn đồ vật đang xét vào túi nếu nó vẫn có  thể chứa thêm Tìm phản ví dụ ? 1.3 Chứng minh tính đúng đắn Chứng minh thuật tốn sai bằng  cách chỉ ra một phản ví dụ • Thuật tốn được định nghĩa đệ quy:  Thuật tốn được định  nghĩa lại bằng chính nó (với kích thước bài tốn nhỏ hơn) • Tìm trong các trường hợp dữ liệu  nhỏ ! • Các ví dụ mà sát với các tiêu chuẩn  lựa chọn của thuật tốn ế !   ế 0 • Chứng minh tính đúng đắn của thuật tốn  đệ quy bằng phương pháp quy nạp • Các ví dụ của các trường  hợp cực trị (lớn nhất, nhỏ nhất …) Khơng tìm được phản ví dụ khơng có nghĩa thuật tốn là đúng! CuuDuongThanCong.com 1/10/2011 1.4 Biểu diễn thuật tốn • Cần biểu diễn các bước thực hiện tuần tự của thuật tốn một  cách cụ thể • Biểu diễn bằng:  Ngơn ngữ tự nhiên Giả ngơn ngữ (pseudocode) Lưu đồ Ngơn ngữ lập trình cụ thể (C/C++, java,…) Tính dễ dàng Tính chính xác • • • • CuuDuongThanCong.com Bài 16 Viết chương trình chuyển đổi lưu trữ đồ thị từ ma trận kề thành danh sách kề ngược lại Bài 17 Viết chương trình kiểm tra danh sách đỉnh đồ thị có phải Topological đồ thị cho hay khơng Bài 18 Viết chương trình liệt kê khung nhỏ đồ thị G(V,E) Bài 19 Tập phủ đỉnh (Vertex cover) đồ thị G(V,E) tập đỉnh 𝑉 ′ ⊆ 𝑉 cho cạnh đồ thị có đỉnh thuộc 𝑉 ′ Hãy viết chương trình tìm tập phủ đỉnh đồ thị có kích thước nhỏ trường hợp G(V,E) Bài 20 Tập phủ đỉnh (Vertex cover) đồ thị G(V,E) tập đỉnh 𝑉 ′ ⊆ 𝑉 cho cạnh đồ thị có đỉnh thuộc 𝑉 ′ Nếu ta loại bỏ nút tìm kiếm thu thực DFS nút cịn lại có tạo thành tập phủ đỉnh G(V,E)? Hãy chứng minh đưa phản ví dụ Bài 21 Tập độc lập (independent set) đồ thị vô hướng G(V,E) tập đỉnh U khơng cạnh E có hai đỉnh thuộc U (tức khơng có đỉnh U kề nhau) Các đỉnh màu xanh thuộc tập độc lập đồ thị • Viết chương trình tìm tập độc lập lớn (có nhiều đỉnh nhất) đồ thị G(V,E) trường hợp G Bài 22 Cho đồ thị vơ hướng G(V,E), viết chương trình kiểm tra xem đồ thị có tồn chu trình kích thước khơng (chu trình tam giác - triangle) CuuDuongThanCong.com Bài 23 Cho hai dãy kết duyệt nhị phân theo thứ tự thứ tự trước, liệu ta xây dựng lại ban đầu từ hai dãy không? Nếu có mơ tả thuật tốn để xây dựng, ngược lại đưa phản ví dụ Trong trường hợp có thứ tự duyệt trước duyệt sau ta xây dựng lại hay khơng? Bài 24 Đưa thuật tốn hiệu để thực chuyển đổi mơ hình biểu diễn đồ thị sau: a Chuyển từ ma trận kề sang danh sách kề b Chuyển từ danh sách kề sang ma trận liên thuộc đỉnh cạnh (incidence matrix) Ma trận liên thuộc đỉnh cạnh ma trận 𝑀 đỉnh cạnh, 𝑀[𝑖, 𝑗] = đỉnh 𝑖 phần cạnh 𝑗 (là mút đầu mút cuối), ngược lại c Chuyển từ incidence matrix sang danh sách kề Đánh giá hiệu thuật toán mà bạn đề xuất Bài 25 Xây dựng đồ thị từ địa điểm thành phố Hà Nội Nhập vào hai địa điểm bất kỳ, đưa đường ngắn hai điểm Bài 26 Viết hàm duyệt nhị phân tìm kiếm tra phần tử thứ 𝑖 theo thứ tự xếp Bài 27 Một đỉnh 𝑣 đồ thị có hướng 𝐺(𝑉, 𝐸) gọi đỉnh mẹ - mother vertex tất đỉnh khác tới từ 𝑣 (tồn đường có hướng từ 𝑣 tới đỉnh G) a Hãy đưa thuật tốn để kiểm tra xem 𝑣 có phải đỉnh mẹ đồ thị có hướng 𝐺(𝑉, 𝐸) Thời gian thực thuật toán bạn cỡ 𝑂(|𝑉| + |𝐸|) b Hãy đưa thuật toán để kiểm tra xem đồ thị có tồn đỉnh mẹ hay khơng Thuật tốn bạn cần có thời gian cỡ 𝑂(|𝑉| + |𝐸|) Bài 28 Việc thêm cạnh có hướng vào đồ thị có hướng 𝐺(𝑉, 𝐸) làm giảm số lượng thành phần liên thông yếu đồ thị Số lượng thành phần liên thơng yếu giảm tối đa bao nhiêu? Số lượng thành phần liên thông mạnh bao nhiêu? Bài 29 Giả sử bạn cần xếp cho 𝑛 bệnh nhân hàng dọc, mặt hướng đằng trước Bạn có danh sách mối quan hệ cặp bệnh nhân (𝑖, 𝑗) dạng “𝑖 ghét 𝑗” Nếu 𝑖 ghét 𝑗 bạn xếp 𝑖 đứng sau 𝑗 được, 𝑖 có khả làm với 𝑗 từ đằng sau a Đưa thuật toán để xếp hàng (hoặc kết luận xếp hàng được) với thời gian cỡ 𝑂(|𝑉| + |𝐸|) b Giả sử thay xếp bệnh nhân hàng, bạn muốn xếp bệnh nhân theo nhiều hàng cho 𝑖 ghét 𝑗 𝑖 phải hàng sau 𝑗 Đưa thuật toán hiệu để đưa số lượng hàng nhỏ Bài 30 Trường hợp tốn tìm đường có trọng số nhỏ hai đỉnh đồ thị G(V, E), mà đồ thị tồn cạnh có trọng số âm • Nếu ta áp dụng thuật tốn Dijkstra có tìm đường có trọng số nhỏ khơng? Hãy đưa phản ví dụ câu trả lời khơng • Nếu ta cải tiến đồ thị cách chuyển hết trọng số âm trọng số dương (Ví dụ đồ thị cạnh có trọng số 2, 3, -2 ta chuyển trọng số tương ứng 5, 6, 1), áp dụng Dijkstra để tìm có khơng? Giải thích sao? CuuDuongThanCong.com Bài 31 Hãy đưa thuật tốn để tìm đỉnh bắt đầu thực DFS cho khung thu có chiều cao nhỏ Bài 32 Hãy đưa ý tưởng để thực DFS cho khung thu có chiều sâu lớn Bài 33 So sánh hiệu PRIM KRUSKAL thực tìm khung có trọng số nhỏ nhất? Trong trường hợp đồ thị tổng quát nên sử dụng thuật toán nào? Bài 34 Cài đặt thuật toán tìm khung có trọng số lớn Bài 35 Có thuật tốn PRIM Kurskal lại cho ta hai khung khác hay khơng? Cho ví dụ? Bài 36 Đường hai đỉnh khung có trọng số nhỏ – MST tìm đồ thị đầy đủ có phải đường ngắn hai đỉnh đồ thị? Chứng minh đưa phản ví dụ Bài 37 Giả sử tất cạnh đồ thị có trọng số khác Đường hai đỉnh MST có phải đường ngắn hai đỉnh đồ thị hay khơng? Chứng minh đưa phản ví dụ Bài 38 PRIM Kurskal có làm việc với đồ thị có trọng số âm khơng? Giải thích? Bài 39 Gọi 𝑇 MST đồ thị 𝐺(𝑉, 𝐸), ta tạo đồ thị 𝐺′ từ 𝐺 cách cộng trọng số cạnh 𝐺 với giá trị 𝑘 Hỏi 𝑇 MST đồ thị 𝐺′ không? Chứng minh đưa phản ví dụ? Bài 40 Gọi 𝑃 = {𝑢, , 𝑣} đường có trọng số nhỏ từ 𝑢 đến 𝑣 đồ thị 𝐺(𝑉, 𝐸) Xây dựng đồ thị 𝐺′ từ 𝐺 cách cộng thêm trọng số cạnh 𝐺 giá trị 𝑘 Hỏi P đường ngắn 𝑢, 𝑣 đồ thị 𝐺′ không? Chứng minh đưa phản ví dụ Bài 41 Xem xét tốn tìm tập cạnh có trọng số nhỏ nối đỉnh tập 𝑇 đồ thị 𝐺(𝑉, 𝐸) (𝑇 ⊆ 𝑉) a Bài tốn chuyển tốn MST khơng? b Hãy đưa thuật tốn hiệu để tìm tập cạnh có tổng trọng số nhỏ mà kết nối tất đỉnh thuộc 𝑇 Bài 42 Hãy sửa đổi lại thuật tốn PRIM để thực với thời gian 𝑂(𝑛 log 𝑘) đồ thị có 𝑘 loại trọng số khác Bài 43 Bài toán single-destination shortest path đồ thị có hướng tìm kiếm tất đường ngắn từ tất đỉnh tới đỉnh 𝑣 đặc biệt Hãy đưa thuật toán hiệu để giải toán Bài 44 Cho đồ thị vơ hướng có trọng số 𝐺(𝑉, 𝐸), 𝑇 khung đường ngắn có gốc đỉnh 𝑣 a Hãy đưa đồ thị mà MST đồ thị trùng với khung đường ngắn có gốc 𝑣 b Hãy đưa đồ thị mà MST đồ thị khác với khung đường ngắn có gốc 𝑣 CuuDuongThanCong.com 1/26/2011 Nội dung Chương 8 CON TRỎ ‐ POINTER  Nhắc lại về tổ chức bộ nhớ của máy tính  Biến con trỏ  Con trỏ và cấu trúc  Con trỏ và hàm  Con trỏ và cấu trúc  Con trỏ và cấp phát bộ nhớ động hiepnd@soict.hut.edu.vn Nhắc lại về tổ chức bộ nhớ máy tính  Trong máy tính, bộ nhớ trong :    chia thành các ơ nhớ Các ơ nhớ được đánh địa chỉ khác nhau Kích thước của mỗi ơ nhớ là 1 byte Địa ơ nhớ Nhắc lại tổ chức bộ nhớ của máy tính 11111111 10010101 11111110 11010101 11111101 10010100 10000101 00000000 00010101 1/26/2011 #include #include //cho ham system() Nhắc lại về tổ chức bộ nhớ máy tính      Khi khai báo 1 biến, các ơ nhớ sẽ được cấp phát cho biến  int A; // 4 byte A=5; Biến A Biến A được lưu trữ trong 4 ô 10001111 bắt đầu tại địa chỉ 10001111 Giá trị của biến A là 5 (4 ô nhớ  10001110 10001101 chứa giá trị 5) 10001100 Lấy địa chỉ ô nhớ (đầu tiên) 10001011 cấp phát cho biến: dùng  10001010 toán tử & 10001001 10001000 &A trả về 10001111 int main() { int a, b; double c,d; a=5; b=7; c=3.5; d=10.0; printf("Gia tri a=%d, dia chi %#x\n",a,&a); printf("Gia tri b=%d, dia chi %#x\n",b,&b); printf("Gia tri a=%f, dia chi %#x\n",c,&c); printf("Gia tri a=%f, dia chi %#x\n",d,&d); system("pause"); return 0; } Biến con trỏ   Biến con trỏ ‐ Pointer Variable: giá trị của biến là một địa  chỉ ơ nhớ Kích thước 1 biến con trỏ phụ thuộc vào các platform  (mơi trường ứng dụng):    Biến con trỏ   Platform 16 bit là 2 byte Platform 32 bit là 4 byte Platform 64 bit là 8 byte.  Khai báo biến con trỏ  KieuDuLieu *TenBien; int *pInt; float *pFloat; 1/26/2011 0x23FF74 Biến con trỏ   0x23FF73 Kích thước biến con trỏ khơng phụ thuộc vào kiểu dữ liệu  Truy cập vào giá trị của vùng nhớ đang trỏ bởi con trỏ: dùng tốn  tử *  *pInt là giá trị vùng nhớ trỏ bởi con trỏ pInt int A=5; int *pInt; pInt = &A; printf("Dia chi A = %#x, Gia tri pInt = %#x Dia chi pInt = %#x\n", &A, pInt, &pInt); printf("Gia tri A = %d, gia tri vung nho tro boi pInt = %d\n",A,*pInt); *pInt = 7; printf("Gan *pInt = 7\n"); printf("Gia tri A = %d, gia tri vung nho tro boi pInt = %d\n",A,*pInt); int A; int *pInt; A=5; pInt = &A; *pInt = 7; int *p2; p2 = pInt; *p2 = 100; 0x23FF72 100 0x23FF71 0x23FF70 0x23FF6F 0x23FF6E 0x23FF74 0x23FF6D 0x23FF6C 0x23FF6B 0x23FF6A 0x23FF74 0x23FF69 0x23FF68 0x23FF67 0x23FF66 0x23FF65 Biến con trỏ c #include char_pointer int main (void) { char c = 'Q'; char *char_pointer = &c; printf ("%c %c\n", c, *char_pointer); c = '/'; printf ("%c %c\n", c, *char_pointer); *char_pointer = '('; printf ("%c %c\n", c, *char_pointer); return 0; } 'Q' '/' '(' Biến con trỏ trong biểu thức #include int main (void) { int i1, i2; int *p1, *p2; i1 = 5; p1 = &i1; i2 = *p1 / 2 + 10; p2 = p1; printf ("i1 = %i, i2 = %i, *p1 = %i, *p2 = %i\n", i1, i2, *p1, *p2); return 0; } 1/26/2011 Con trỏ hằng và hằng con trỏ char c = 'X'; Khai báo biến con trỏ thơng thường char *charPtr = &c; charPtr là hằng con trỏ, nó khơng thể thay đổi được  char * const charPtr = &c; giá trị (khơng thể trỏ vào ơ nhớ khác) charPtr = &d; // not valid Có thể thay đổi giá trị của ơ nhớ con trỏ đang trỏ đến charPtr là con trỏ hằng (con trỏ tới 1 hằng số) Con trỏ và cấu trúc const char *charPtr = &c; khơng thể thay đổi giá trị ơ nhớ trỏ tới bởi con trỏ *charPtr = 'Y'; // not valid (có thể cho con trỏ trỏ sang ơ nhớ khác) const char * const *charPtr = &c; Hằng con trỏ trỏ tới hằng số: khơng thay đổi được  cả giá trị con trỏ và giá trị ơ nhớ mà nó trỏ đến todaysDate Con trỏ và cấu trúc struct date { int month; int day; int year; }; month date year 11 27 2010 Con trỏ và cấu trúc  Truy cập vào trường biến cấu trúc thông qua con trỏ   (* TênConTrỏ).TênTrường TênConTrỏ‐>TênTrường datePtr todaysDate month datePtr = &todaysDate; date struct date todaysDate ={11,27,2010}; datePtr‐>month = 1; year struct date *datePtr; (*datePtr).day = 1; datePtr = &todaysDate; datePtr‐>year = 2011; 11 27 2010 2011 datePtr 1/26/2011 #include int main (void) Con trỏ và cấu trúc { struct date { int month; int day; int year; }; struct date today = {11,27,2010}, *datePtr; datePtr = &today; printf ("Today's date is %i/%i/%.2i.\n",datePtr‐>month,  datePtr‐>day, datePtr‐>year % 100); datePtr‐>month = 1; (*datePtr).day = 1; datePtr‐>year = 2011; printf ("Today's date is %i/%i/%.2i.\n",datePtr‐>month,  datePtr‐>day, datePtr‐>year % 100); return 0;  #include pointers int main (void) p1 { struct intPtrs p2 { int *p1; int *p2; 100 }; i1 struct intPtrs pointers; int i1 = 100, i2; ‐97 i2 pointers.p1 = &i1; pointers.p2 = &i2; *pointers.p2 = ‐97; printf ("i1 = %i, *pointers.p1 = %i\n", i1, *pointers.p1); printf ("i2 = %i, *pointers.p2 = %i\n", i2, *pointers.p2); return 0; } } #include Con trỏ và cấu trúc  int main (void) Danh sách liên kết – linked list: một trong những cấu trúc  phức tạp được xây dựng từ quan hệ con trỏ và cấu trúc  N1 struct node { int value; struct node *pNext; }; Cấu trúc chứa con trỏ struct intPtrs { int *p1; int *p2; }; value { struct node { int value; struct entry *pNext; }; struct node N1, N2, N3; int i; N1.value = 5; N2.value = 7; N3.value = ‐100; N1.pNext = &n2; N2.pNext = &n3; i = N1.pNext‐>value; printf ("%i ", i); printf ("%i\n", N2.pNext‐>value); return 0; pNext N2 value pNext N3 value ‐100 pNext } 1/26/2011 Con trỏ và hàm Tham số của hàm có thể là con trỏ, và hàm có thể trả về  giá trị kiểu con trỏ  void Absolute(int *x) { if(*xdata) return pHead; else pHead=pHead‐>pNext; } return (struct list*)0; //or NULL } Con trỏ và mảng 1/26/2011 Con trỏ và mảng  Con trỏ và mảng Tên mảng là một con trỏ hằng trỏ vào phần tử đầu tiên  của mảng pt int values[6]={2,5,‐4,7,‐5,12}; int *pt; pt = values; // same as &value[0] Ta có thể dễ dàng dùng con  trỏ để truy cập vào các phần  tử trong mảng values[0] values[1] ‐4 values[2] values[3] ‐5 12 *(pt)=7; //same as values[0]=7 *(pt+3)=25; //same as values[3]=25 values[2] address  *pt = 2;//same as values[2]=2; values[4] *(pt+2) = 3;//same as values[4]=3; values[5] Một số thao tác  int values[6]={2,5,‐4,7,‐5,12}; int *pt; pt = values; cho con trỏ trỏ vào phần tử đầu tiên trong mảng  (chứa địa chỉ của phần tử đầu tiên) *(pt+i) truy cập tới giá trị phần tử cách phần tử  đang trỏ bởi con trỏ ݅ phần tử pt=pt+n; //or pt+=n; cho pt trỏ tới địa chỉ của phần tử  cách địa chỉ của phần tử hiện tại ݊ phần tử pt++; pt‐‐; int *pt; pt = values; // same as &value[0] pt = &values[2];//pt points to  Con trỏ và mảng  int values[6]={2,5,‐4,7,‐5,12}; pt values[0] values[1] ‐4 values[2] 25 values[3] ‐5 values[4] 12 values[5] Con trỏ và mảng  Các phép tốn quan hệ với con trỏ    Có thể sử dụng các tốn tử con hệ với kiểu con trỏ  Các phép tốn đó sẽ là so sánh các địa chỉ ơ nhớ với nhau Kiểu giá trị trả về là TRUE (khác 0) và FALSE (bằng 0) pt>= &values[5]; pt==&values[0]; Cho con trỏ dịch chuyển cách 1 phần tử  (tức là sizeof(kieudulieu) ô nhớ) 1/26/2011 Con trỏ và mảng int arraySum (int Array[], const int n) { int sum = 0, *ptr; int * const arrayEnd = array + n; for ( ptr = Array; ptr next; // get storage for new entry listPtr‐>next = (struct entry *) malloc (sizeof (struct entry)); // add null to the new end of the list if ( listPtr‐>next != NULL ) (listPtr‐>next)‐>next = (struct entry *) NULL; return listPtr‐>next; } 12 ... niệm  Chương – Giải thuật đệ quy  Chương – Các cấu trúc liệu  Chương – Cấu trúc  Chương – Sắp xếp  Chương – Tìm kiếm  Chương – Đồ thị Tài liệu  [1] Cấu trúc liệu giải thuật, Đỗ Xuân Lôi,... Cấu? ?trúc? ?dữ? ?liệu? ?(data structure): Gồm các kiểu? ?dữ? ?liệu? ?và? ? cách liên kết giữa chúng.  • Thay đổi? ?cấu? ?trúc? ?dữ? ?liệu? ?khơng làm thay đổi tính chính xác  của chương trình. Tuy nhiên nó sẽ làm thay đổi hiệu quả của  chương trình • Cấu? ?trúc? ?dữ? ?liệu. .. từ khi thiết kế chương trình! • Hai vấn đề của một? ?cấu? ?trúc? ?dữ? ?liệu: • Các thao tác mà nó hỗ trợ,? ?và • Cách cài đặt các thao tác này Cấu trúc liên tục VS liên kết • Các? ?cấu? ?trúc? ?dữ? ?liệu? ?có thể được chia thành liên tục (contiguous) 

Ngày đăng: 01/03/2022, 13:39

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN