You are on page 1of 33

CẤU TRÚC DANH

SÁCH
Nội dung
chính
1. Khái niệm danh sách
2. Trừu tượng hóa danh sách
3. Phương pháp cài đặt danh sách
4. Hiện thực danh sách kề
5. Hiện thực danh sách liên kết
đơn
6. Các loại danh sách liên kết khác
• Danh sách liên kết vòng
• Danh sách liên kết kép

2
Khái niệm danh
•sách
Là cấu trúc dữ liệu tuyến tính, trong đó các phần tử dữ liệu
đượcsắp xếp theo một thứ tự xác định
• Là một tập sắp thứ tự các phần tử cùng một kiểu
• Ví dụ
• Danh sách sinh viên
• Danh sách điện thoại
• Danh sách môn học
• Danh sách bài hát
• Danh sách công việc

3
Trừu tượng hóa danh
•sách
Đặc tả dữ liệu
• Tất cả các phần tử của danh sách sắp theo thứ tự nào
đó.

• Đặc tả các phép toán


1. Khởi tạo/xóa danh sách
2. Kiểm tra danh sách rỗng/đầy
3. Đếm số phần tử có trong danh sách
4. Truy xuất một phần tử trong danh sách theo vị trí
5. Thêm/xóa/thay thế một phần tử
6. Duyệt tất cả các nút

4
Trừu tượng hóa danh
•sách
Đặc tả dữ liệu
A = (a0, a1, …, an), trong đó ai là phần tử thứ i của danh
sách A. Ví dụ:
A = (1, 2, 3, 4, 5)
A = (‘Toán’, ‘Lý’, ‘Hóa’, ‘Văn’, ‘Anh’)

• Đặc tả các phép toán


1. Khởi tạo/xóa danh sách: init(A)
2. Kiểm tra danh sách rỗng/đầy: isEmpty(A) / isFull(A)
3. Đếm số phần tử có trong danh sách: length(A)
4. Truy xuất một phần tử trong danh sách theo vị trí: retrieve(A, i)
5. Thêm phần tử x vào vị trí i trong danh sách: insert(A, i, x)
6. Thêm phần tử x vào đuôi danh sách: append(A, x)
7. Xóa phần tử ở vị trí i trong danh sách: remove(A, i)
8. Thay thế phần tử ở vị trí i trong danh sách: replace(A, i, x)
5
Phương pháp cài đặt danh
sách
Hai
phương
pháp

Sử dụng Sử dụng
mảng danh
một sách liên
chiều kết

Mảng Mảng DSLK DSLK DSLK


tĩnh động đơn kép vòng

6
Cài đặt danh sách bằng
mảng
Mảng
•(array)
Tập hợp các phần tử (các biến) có cùng một kiểu.
• Một phần tử cụ thể trong mảng sẽ được xác định và truy cập bởi một chỉ
số.
• Trong C/C++, các phần tử của mảng được đặt cạnh nhau tạo thành một
khối liên tục. Địa chỉ thấp nhất tương ứng với phần tử đầu tiên, địa chỉ
cao nhất tương ứng với phần tử cuối cùng.
• Mảng thì có thể là một chiều hoặc nhiều chiều.
• Mảng một chiều tĩnh:
• int A[100];
• phanso dayphanso[1000];
• Mảng một chiều động:
• int *A = new int[100];
• phanso *dayphanso = new phanso[1000]; 8
Cài đặt danh sách bằng mảng
tĩnh

9
Cài đặt
•hàm
ArrayList(); // initialize an empty list
• bool isEmpty() // check if the list is
const; // get empty
the number of elements in a
•• int
voidlength() const;int x,
insert(const listint i); // insert x at the
• position i
void append(const int // insert x at the end of the
x); list
•• void remove(int i);
int& retrieve(int i) const; // //return
remove thethe ith element
reference to the ith
element
• void print() const; // print all element values

10
Cài đặt danh sách bằng mảng
động

11
Hàm insert, append của
•Dlist
Khi mảng đầy
• Cấp phát động một mảng mới có cỡ gấp đôi mảng

• Chép đoạn đầu của mảng cũ sang mảng mới
• Đưa phần tử cần xen vào mảng mới
• Chép đoạn còn lại của mảng cũ sang mảng mới
• Hủy mảng cũ
• Cập nhật size, last
• Ví dụ:
• A = (1, 3, 4, 8); size = 4; last = 3
• insert(A, 3, 50)

12
Bài tập về
•nhà
Viết chương trình C++ cài đặt danh sách bằng mảng tĩnh và mảng
động.

13
Danh sách liên
kết
Độ phức tạp khi cài đặt danh sách bằng
•mảng
Truy cập phần
tử
• Cập nhật?
• Chèn phần tử?
• Xóa phần tử?

15
Danh sách liên
•kết
Là tập dữ liệu tuần tự mà mỗi phần tử chứa vị trí của phần tử tiếp
theo.
• Cấp phát động lúc chạy chương trình
• Các phần tử nằm rải rác ở nhiều nơi trong bộ nhớ
• Kích thước danh sách chỉ bị giới hạn do RAM
• Thao tác thêm xoá đơn giản
• DSLK đơn, DSLK kép, DSLK vòng.

16
Danh sách liên kết
đơn
Khái niệm DSLK đơn
• DSLK đơn là một danh sách các nút,
• Mỗi nút gồm 2 thành phần:
• Phần chứa dữ liệu – data
• Phần chỉ vị trí (địa chỉ) của phần tử tiếp theo trong danh sách –
next

data next

Node

• Phần next là con trỏ, trỏ đến nút kế tiếp 17


Danh sách liên kết đơn bằng
•C++
Mỗi nút là một biến Node.
• Nút cuối cùng có giá trị next bằng NULL.
• Xác định DSLK bằng địa chỉ của nút đầu
tiên
trong danh sách.
• Gọi biến lưu địa chỉ này là con trỏ đầu head
• Khởi tạo danh sách rỗng: Node *head =
NULL;

data next
head

18
Danh sách liên kết đơn bằng
•C++
Có thể sử dụng thêm con trỏ đuôi tail
để các thao tác trên DSLK được thuận
lợi
• Danh sách rỗng: head = tail = NULL;

head tail

19
typedef int Item;

struct Node{
Item data;
Node
*next;
};

struct SList{
Node
*head;
Node *tail;
long size;

SList();
~SList();

// Các
phương
20
Các phép toán trên DSLK
•đơn
Tạo nút mới chứa dữ liệu cho trước:
createNode(v)
• Thêm dữ liệu vào danh sách
• Thêm vào đầu danh sách: addFirst(v)
• Thêm vào sau nút p: insertAfter(p, v)
• Thêm vào trước nút p: insertBefore(p, v)
• Thêm vào cuối danh sách: addLast(v)
• Xóa dữ liệu khỏi danh sách
• Xóa nút đầu danh sách: removeFirst()
• Xóa nút cuối danh sách: removeLast()
• Xóa nút không phải đầu danh sách: remove(p)
• Duyệt danh sách: traverse()
21
Tạo nút mới chứa dữ liệu cho trước:
createNode(v)
• Tạo nút mới chứa dữ liệu
v
// Tạo nút có dữ liệu v
Node* SList::CreateNode(Item
p v NULL
v)
{
Node* p = new
Node; p->data = v;
p->next =
NULL; return
p;
}

22
Thêm vào đầu danh sách:
addFirst(v)
DSLK ban đầu
head tail
NULL
2 1

DSLK sau khi thêm vào đầu


head tail
NULL
3 2 1
Nút p
23
Thêm vào sau nút p: insertAfter(p,
v)
DSLK ban
đầu tail
head NULL

3 2 1
Nút p
DSLK sau khi thêm nút q vào sau nút
phead tail
NULL

3 2 1

4
Nút q
2
Thêm vào trước nút p: insertBefore(p,
v)
DSLK ban
đầu

DSLK sau khi thêm nút q vào trước nút


p

2
Thêm vào cuối danh sách:
addLast(v)

29
Xóa nút đầu danh sách:
removeFirst()
DSLK ban
đầu tail
head NULL

3 2 1

DSLK sau khi xóa nút đầu danh


sách

head tail
2 1 NULL

3
Xóa nút không phải đầu danh sách:
remove(p)
DSLK ban
đầu tail
phead NULL

4 3 2 1
Nút p
DSLK sau khi xóa nút p
phead tail

x
NULL

4 3 2 1
Nút p

3
Xóa nút cuối danh sách:
removeLast()

35
Duyệt danh sách:
traverse()

36
Các loại danh sách liên kết
khácsách liên kết vòng
Danh
• Tương tự như danh sách liên kết đơn.
• Trường next của nút cuối chỉ đến đầu danh
sách

A1 A2 A3 An

Trường Next của nút cuối ko còn trỏ đến


NULL, mà trỏ đến nút đầu
37
Các loại danh sách liên kết
khácsách liên kết kép
Danh
• Mỗi phần tử có hai liên kết đến phần tử đứng trước (prev) và sau
nó (next).

38
Bài tập về
nhàchương trình C++ cài đặt danh sách liên kết đơn với các thao tác
Viết
sau:
1. Các thao tác đã mô tả trong bài giảng.
2. Khởi tạo danh sách liên kết.
3. Xóa toàn bộ danh sách liên kết.
4. Tìm kiếm nút có nội dung x.
5. Xác định nút thứ i trong danh sách (trả về địa chỉ của nút thứ i).
6. Xác định vị trí của nút p trong danh sách.
7. Xác định nút trước của nút p trong danh sách.

39

You might also like