1. Trang chủ
  2. » Cao đẳng - Đại học

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

47 49 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

 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

Ngày đăng: 18/01/2021, 17:48

Xem thêm:

TỪ KHÓA LIÊN QUAN

w