Kết thúc của danh sách liên kết với con trỏ NULL Ngăn xếp có cấu trúc LIFO. Hàng đợi có cấu trúc FIFO[r]
(1)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
(2)Nội dung
2
1 Các nút (Nodes) Danh sách liên kết
1 Tạo, tìm kiếm
2 Ứng dụng danh sách liên kết
1 Ngăn xếp (Stack),
2 Hàng đợi (Queue)
3 Iterators
1 Con trỏ iterators
4 Cây (Trees)
(3)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 này
Sử dụng biến động
Thư viện mẫu chuẩn (STL)
(4)Cách tiếp cận
4
Có cách để xử lý cấu trúc liệu này
1 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
2 Sử dụng lớp với biến thành viên private hàm
accessor – mutator
3 Sử dụng lớp bạn
Danh sách liên kết sử dụng phương thức (hoặc 2)
Ngăn xếp, Hàng đợi sử dụng phương thức 2
(5)Nút danh sách liên kết
Danh sách 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 của
lớp (có thể tạo tự động với lệnh new)
(6)Nút trỏ
(7)Định nghĩa nút
struct ListNode {
string item; int count;
ListNode *link; };
typedef ListNode* ListNodePtr;
(8)Con trỏ head
8
Đối tượng với nhãn “head” nút:
ListNodePtr head;
Là trỏ đơn giản tới nút Trỏ tới nút danh sách
Head sử dụng để lưu trữ vị trí danh
sách
(9)Ví dụ truy cập nút
(*head).count = 12;
Đặt biến thành viên count nút trỏ trỏ head
12
Toán tử thay thế ->
Được gọi tố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:
(10)Dấu hiệu kết thúc (end markers)
10
Sử dụng NULL cho trỏ nút
Được xem “lính canh” (sentinel) cho nút Chỉ định khơng cịn liên kết sau nút
(11)(12)Danh sách liên kết
12
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
(13)Định nghĩa lớp danh sách liên kết
class IntNode {
public:
IntNode() { }
IntNode(int theData, IntNode* theLink) : data(theData), link(theLink) { } IntNode* getLink() {return link;}
int getData() {return data;}
void setData(int theData) {data = theData;} void setLink(IntNode* pointer) {link=pointer;} private:
int data;
IntNode *link; };
(14)Lớp danh sách liên kết
14
Chú ý hàm khởi tạo tham số
Cho phép tạo nút với liệu riêng biệt thành viên liên
kết định
(15)Tạo nút đầu tiên
IntNodePtr head;
Khai báo biến trỏ head
head = new IntNode;
Cấp phát động cho nút
Nút danh sách gán cho head
head->setData(3);
head->setLink(NULL);
Đặt liệu cho nút head
Đặt liên kết nút đầu NULL, có
(16)Minh họa thêm nút cho head của danh sách liên kết
(17)(18)Chèn nút vào danh sách liên kết (1/2)
(19)(20)Xóa nút
(21)Tìm kiếm danh sách liên kết
Hàm với hai đối số
IntNodePtr search(IntNodePtr head, int target);
// Điều kiện trước: trỏ head trỏ tới đầu danh sách liên kết // Con trỏ nút cuối NULL
// Nếu danh sách rỗng, head NULL
// Trả trỏ tới nút chứa giá trị target // Nếu khơng tìm thấy, trả NULL
Đơn giản duyệt qua (traversal) danh sách
(22)Mã giả cho hàm tìm kiếm (Pseudocode)
22
while (con trỏ here chưa trỏ tới nút đích nút cuối) {
dịch chuyển trỏ here tới nút danh sách
}
if (nút trỏ here chứa giá trị đích) return con_trỏ;
else
(23)Thuật tố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
(24)Ngăn xếp (Stack)
24
Cấu trúc liệu ngăn xếp
Lấy liệu theo thứ tự ngược với lưu trữ LIFO – Last-in/First-out (vào sau, trước)
Ngăn xếp sử dụng cho nhiều tác vụ
Truy vết lời gọi hàm Quản lý nhớ
Sử dụng danh sách liên kết để cài đặt ngăn xếp
Thao tác Push: thêm liệu vào ngăn xếp
Đẩy vào từ vị trí ngăn xếp
Thao tác Pop: lấy liệu khỏi ngăn xếp
(25)(26)File giao diện
một lớp khuôn mẫu ngăn xếp (1/2)
(27)File giao diện
(28)Driver lớp khn mẫu ngăn xếp chương trình mẫu (1/3)
(29)(30)Driver lớp khuôn mẫu ngăn xếp chương trình mẫu (3/3)
(31)Hàng đợi (Queue)
Một cấu trúc liệu phổ biến khác
Xử lý liệu theo cách First-in/First-out (vào trước/ra trước
- FIFO)
(32)File giao diện
một lớp khuôn mẫu hàng đợi (1/3)
(33)File giao diện
(34)File giao diện
một lớp khuôn mẫu hàng đợi (3/3)
(35)(36)Iterators
36
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í đầu tiên
Node_Type *iterator;
(37)Lớp iterator
Linh hoạt so với trỏ
Các toán tử nạp chồng điển hình như
++ 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
(38)Ví dụ lớp iterator
38
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
(39)Giới thiệu cây
Cây cấu trúc liệu phức tạp
Giới thiệu điều học này
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 tiếp theo
Cây có trỏ, chí nhiều hơn, tới những
(40)Cây nhị phân (1/2)
(41)(42)Thuộc tính cây
42
Đường đi
Từ đỉnh tới nút
Khơng quay vịng, theo trỏ đến vị trí cuối
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ương tự head danh sách liên kết
Nút (leaf nodes)
(43)Cây đệ quy
Thấy rằng: có cấu trúc đệ quy
Mỗi có con
Mỗi lại có hai …
(44)Xử lý – phương pháp (Tree processing)
44
1 Xử lý preorder (preorder processing)
Xử lý liệu nút gốc Xử lý bên trái Xử lý bên phải
2 Xử lý in-order
Xử lý bên trái Xử lý liệu nút gốc Xử lý bên phải
3 Xử lý post-order
(45)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:
(46)Tóm tắt
46
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
Danh sách nút mà nút trỏ tới phần 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
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
(47)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