Professional Documents
Culture Documents
2 List
2 List
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
đó.
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’)
Sử dụng Sử dụng
mảng danh
một sách liên
chiều kết
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
cũ
• 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
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
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
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
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
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