Bài giảng Ngôn ngữ lập trình Bài 10 Lê Nguyễn Tuấn Thành

50 156 0
Bài giảng Ngôn ngữ lập trình Bài 10  Lê Nguyễn Tuấn Thành

Đ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

Bài giảng Ngôn ngữ lập trình Bài 10 Các kiểu dữ liệu trừu tượng Danh sách liên kết, ngăn xếp, hàng đợi cung cấp cho người học các kiến thức Các nút (Nodes) và danh sách liên kết, ứng dụng danh sách liên kết, iterators, cây (Trees). Mời các bạn cùng tham khảo.

NGÔN NGỮ LẬP TRÌNH Bài 10: Các Kiểu Dữ Liệu Trừu Tượng: Danh sách liên kết, Ngăn xếp, Hàng đợi Giảng viên: Lê Nguyễn Tuấn Thành Email: thanhlnt@tlu.edu.vn Bộ Môn Công Nghệ Phần Mềm – Khoa CNTT Trường Đại Học Thủy Lợi NỘI DUNG Các nút (Nodes) Danh sách liên kết Ứng dụng danh sách liên kết 3 Ngăn xếp (Stacks), Hàng đợi (Queue) Lớp bạn Iterators Tạo, tìm kiếm Con trỏ iterators Cây (Trees) Bài giảng có sử dụng hình vẽ sách “Practical Debugging in C++, A Ford and T Teorey, Prentice Hall, 2002” GIỚI THIỆU  Danh sách liên kết   Được xây dựng sử dụng trỏ Tăng giảm kích thước thời gian chạy Cây sử dụng trỏ  Con trỏ xương sống cấu trúc    Sử dụng biến động Thư viện mẫu chuẩn (STL)  Có phiên định nghĩa sẵn vài cấu trúc CÁCH TIẾP CẬN  Có cách để xử lý cấu trúc liệu    Cách tiếp cận C-style: sử dụng hàm cấu trúc toàn cục với thứ public Sử dụng lớp với biến thành viên private hàm accessor – mutator Sử dụng lớp bạn Danh sách liên kết sử dụng phương thức Ngăn xếp, hàng đợi sử dụng phương thức Cây sử dụng phương thức NÚT VÀ DANH SÁCH  Danh sách liên kết    LIÊN KẾT Một ví dụ đơn giản “cấu trúc liệu động” Bao gồm nhiều nút Mỗi nút biến kiểu cấu trúc đối tượng lớp (có thể tạo tự động với lệnh new)   Nút bao gồm trỏ trỏ tới nút khác Cung cấp “sự liên kết” NÚT VÀ CON TRỎ ĐỊNH NGHĨA NÚT struct ListNode { string item; int count; ListNode *link; }; typedef ListNode* ListNodePtr;  Chú ý tuần hoàn (circularity)  CON TRỎ HEAD  Đối tượng với nhãn “head” nút: ListNodePtr head;   Là trỏ đơn giản tới nút Chỉ tới nút danh sách Head sử dụng để lưu trữ vị trí danh sách  Cũng sử dụng đối số truyền vào hàm  VÍ DỤ VỀ TRUY CẬP  (*head).count = 12;   Đặt biến thành viên count nút trỏ trỏ head 12 Toán tử alternate ->     NÚT Được gọi toán tử mũi tên (arrow operator) Kí hiệu viết tắt kết hợp hai toán tử * Viết lại câu lệnh bằng: head->count=12; cin>>head->item:  Gắn chuỗi nhập vào cho biến thành viên item DẤU HIỆU KẾT THÚC (END MARKERS)  Sử dụng NULL cho trỏ nút    Được xem “lính canh” (sentinel) cho nút Chỉ định không liên kết sau nút Cung cấp dấu hiệu kết thúc tương tự cách sử dụng mảng lấp đầy phần (partially-filled) 10 DRIVER LỚP KHUÔN MẪU GIAO DIỆN: CHƯƠNG TRÌNH MẪU 36 LỚP BẠN  Nhớ lại cách sử dụng hai hàm getLink setLink (accessor mutator)    Có chút phiền toái Giống làm liệu public (khả dụng cho tất cả)?! Sử dụng hàm bạn   Sử dụng lớp “bạn” khuôn mẫu hàng đợi lớp khuôn mẫu node Tất thành viên liên kết riêng trực tiếp khả dụng (available) hàm thành viên lớp hàng đợi 37 KHAI BÁO TIẾN (FORWARD DECLARATION)  Mối quan hệ bạn bè lớp thường yêu cầu lớp tham chiếu lẫn   Bằng cách hai lớp khai báo thời điểm? Yêu cầu khai báo tiến (forward declaration)   Một tiêu đề lớp đơn giản đặt bên lớp class Queue; //Forward Dec Ám lớp Queue tồn 38 ITERATORS  Xây dựng để duyệt liệu  Cho phép hành động yêu cầu liệu Con trỏ thường sử dụng iterator  Nhớ lại: danh sách liên kết – cấu trúc liệu nguyên mẫu/điển hình (prototypical)  Con trỏ: ví dụ điển hình iterator, duyệt qua danh sách từ vị trí  Node_Type *iterator; for (iterator = Head; iterator != NULL; iterator=iterator>Link) Do_Action 39 LỚP ITERATOR Linh hoạt so với trỏ  Các toán tử nạp chồng điển        ++ dịch chuyển tiến iterator sang vị trí dịch lùi iterator vị trí trước == so sánh với iterator != so sánh khác với iterator * truy cập vị trí/mục Lớp cấu trúc liệu có hàm thành viên   begin(): trả iterator vị trí cấu trúc end(): kiểm tra iterator có vị trí cuối không 40 VÍ DỤ LỚP ITERATOR Duyệt qua cấu trúc liệu có tên ds: for (i=ds.begin();i!=ds.end();i++) process *i //*i is current data item  i iterator  41 GIỚI THIỆU VỀ CÂY Cây cấu trúc liệu phức tạp  Giới thiệu điều học    Xây dựng, thao tác với Sử dụng nút trỏ Nhớ lại danh sách liên kết: nút có trỏ tới vị trí nút  Cây có trỏ, chí nhiều hơn, tới nút khác  42 CÂY NHỊ PHÂN (1/2) 43 CÂY NHỊ PHÂN (2/2) 44 THUỘC TÍNH CỦA CÂY  Đường    Chú ý nút có liên kết    Được gọi nhị phân (binary tree) Kiểu phổ biến Nút gốc (root node)   Từ đỉnh tới nút Không quay vòng, theo trỏ đến vị trí cuối Tương tự head danh sách liên kết Nút (leaf nodes)  Cả hai biến liên kết NULL (không có con) 45 CÂY VÀ ĐỆ QUY Thấy rằng: có cấu trúc đệ quy  Mỗi có    Mỗi lại có hai … Có thể sử dụng thuật toán đệ quy để tìm kiếm! 46 XỬ LÝ CÂY – PHƯƠNG PHÁP (TREE PROCESSING) Xử lý preorder (preorder processing)    Xử lý in-order    Xử lý liệu nút gốc Xử lý bên trái Xử lý bên phải Xử lý bên trái Xử lý liệu nút gốc Xử lý bên phải Xử lý postorder    Xử lý bên trái Xử lý bên phải Xử lý liệu nút gốc 47 LƯU TRỮ CÂY  Ví dụ lưu giá trị theo cách đặc biệt Quy luật lưu trữ liệu nhị phân  Dữ liệu bên trái nhỏ liệu gốc  Dữ liệu bên phải lớn liệu gốc  quy tắc áp dụng đệ quy với   Cây sử dụng chế lưu trữ:   Được gọi nhị phân tìm kiếm (Called binary search tree - BST) Duyệt cây: Inorder values "in order" Preorder  "prefix" notation Postorder  "postfix" notation 48 TÓM TẮT  Nút cấu trúc đối tượng lớp Một nhiều thành viên trỏ  Các nút kết nối trỏ thành viên  Tạo nên cấu trúc mà kích thước thay đổi lúc chạy chương trình   Danh sách liên kết       Kết thúc danh sách liên kết với trỏ NULL Ngăn xếp có cấu trúc LIFO Hàng đợi có cấu trúc FIFO Xây dựng iterator cho phép duyệt qua phần tử liệu cấu trúc liệu Cấu trúc liệu    Danh sách nút mà nút trỏ tới phần tử Mỗi nút có nhiều trỏ thành viên Mỗi trỏ trỏ tới nút khác khác Cây nhị phân tìm kiếm  Một vài quy luật lưu trữ đặc biệt giúp cho việc tìm kiếm nhanh 49 GIÁO TRÌNH THAM KHẢO Giáo trình chính: W Savitch, Absolute C++, Addison Wesley, 2002  Tham khảo:    A Ford and T Teorey, Practical Debugging in C++, Prentice Hall, 2002 Nguyễn Thanh Thủy, Kĩ thuật lập trình C++, NXB Khoa học Kĩ Thuật, 2006 50 ... return NULL; 22 THUẬT TOÁN CHO HÀM TÌM KIẾM  while (here->getData() != target && here->getLink() != NULL) here = here->getLink(); if (here->getData() == target) return here; else return NULL; 23... mảng lấp đầy phần (partially-filled) 10 TRUY CẬP DỮ LIỆU TRONG NÚT 11 DANH SÁCH LIÊN KẾT  Nút gọi head   Được trỏ tới trỏ tên head Nút cuối đặc biệt   Biến trỏ thành viên NULL Dễ dàng kiểm... biến thành viên count nút trỏ trỏ head 12 Toán tử alternate ->     NÚT Được gọi toán tử mũi tên (arrow operator) Kí hiệu viết tắt kết hợp hai toán tử * Viết lại câu lệnh bằng: head->count=12;

Ngày đăng: 15/05/2017, 09:18

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan