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

Thông tin cơ bản

Định dạng
Số trang 47
Dung lượng 1,3 MB

Nội dung

 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

TỪ KHÓA LIÊN QUAN

w