Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
KỸ THUẬT LẬP TRÌNH
DANH SÁCH LIÊN KẾT
1
Nội dung trình bày
Giới thiệu
Các loại danh sách liên kết
Các thao tác trên danh sách liên kết
So sánh danh sách liên kết và mảng
HCMUS - 2009
2
Giới thiệu
Mảng: cấu trúc dữ liệu quen thuộc
Số lượng phần tử cố định (tĩnh)
Cấp phát vùng nhớ liên tục
Truy xuất phần tử thông qua chỉ số
HCMUS - 2009
3
Giới thiệu
Đánh giá thao tác trên mảng:
Truy xuất phần tử?
Cập nhật?
Chèn phần tử?
Xoá phần tử?
HCMUS - 2009
4
Giới thiệu
Thực tế:
Không xác định được chính xác số lượng
phần tử
• Danh sách bệnh nhân: tăng/giảm.
• Danh sách sinh viên: tăng/giảm.
Vùng nhớ thay đổi trong quá trình sử dụng
=> Không đủ vùng nhớ cấp phát liên tục.
=> Cấu trúc dữ liệu động đáp ứng nhu cầu
HCMUS - 2009
5
Các loại danh sách liên kết
Danh sách liên kết đơn
singly linked list
uni-directional linked list
Danh sách liên kết kép
doubly linked list
bi-directional linked list
Danh sách liên kết vòng
circularly linked list
ring list
HCMUS - 2009
6
Các loại danh sách liên kết
Danh sách liên kết đơn
Mỗi phần tử có MỘT liên kết đến MỘT phần tử
khác (phần tử đứng sau).
HCMUS - 2009
7
Các loại danh sách liên kết
Danh sách liên kết kép
Mỗi phần tử có HAI liên kết đến hai phần tử
đứng sau và trước nó.
HCMUS - 2009
8
Các loại danh sách liên kết
Danh sách liên kết vòng
Có mối liên kết giữa phần tử cuối và phần tử
đầu
HCMUS - 2009
9
Phần tử trên danh sách liên kết
Phần tử (Node, Element)
Phần tử = Dữ liệu + Liên kết
Ví dụ:
• Phần tử có 1 liên kết
• Phần tử có 2 liên kết
HCMUS - 2009
10
Phần tử trên danh sách liên kết
Ví dụ
Ví dụ:
Phần tử có dữ liệu gồm 1 thành phần
Phần tử có dữ liệu gồm 3 thành phần
Phần tử có dữ liệu gồm 1 cấu trúc
HCMUS - 2009
11
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 1 thành phần
struct NODE
{
};
HCMUS - 2009
12
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 1 thành phần
struct NODE
{
float number;
NODE *pNext;
/* pointer to next element in list */
};
HCMUS - 2009
13
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 3 thành phần
struct NODE
{
};
HCMUS - 2009
14
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 3 thành phần
struct NODE
{
char name[50];
float number;
int id;
NODE *pNext;/*pointer to next element*/
};
HCMUS - 2009
15
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 1 cấu trúc
struct DATA
{
};
struct NODE
{
};
HCMUS - 2009
16
Phần tử trên danh sách liên kết
Cài đặt
Phần tử có dữ liệu gồm 1 cấu trúc
struct DATA
{
char name [50];
float number;
int id;
};
struct NODE
{
DATA data;
NODE *pNext; /* pointer to next element in list */
};
HCMUS - 2009
17
Phần tử trên danh sách liên kết
Cài đặt
Viết cài đặt cấu trúc phần tử trong trường hợp
HCMUS - 2009
18
Tổ chức danh sách liên kết
Tổ chức
Mỗi danh sách liên kết bao gồm:
Con trỏ đến phần tử đầu (hoặc/và cuối) danh
sách.
(Các) phần tử trên danh sách
• Dữ liệu
• Các mối liên kết
HCMUS - 2009
19
Tổ chức danh sách liên kết
Tổ chức
pHead
pHead
HCMUS - 2009
pTail
20
Tổ chức danh sách liên kết
Lưu ý
Khởi tạo:
Con trỏ đầu/cuối danh sách chưa trỏ đến phần
tử nào
• pHead = NULL
• pTail = NULL
HCMUS - 2009
21
Tổ chức danh sách liên kết
Danh sách liên kết đơn
Cấu trúc phần tử:
struct NODE
{
float number;
NODE *pNext;
};
Tạo một phần tử mới: NODE* CreateNode(float Data)
Phần tử đầu danh sách:
NODE *pHead;
pHead = NULL;
HCMUS - 2009
22
Tổ chức danh sách liên kết
Danh sách liên kết đơn
Tạo một phần tử mới
NODE* CreateNode (float Data)
{
NODE *pNode;
pNode = new NODE;
if (pNode == NULL)
return NULL;
pNode->number = Data;
pNode->pNext = NULL;
return pNode;
}
HCMUS - 2009
23
Tổ chức danh sách liên kết
Danh sách liên kết kép
Cấu trúc phần tử:
struct NODE
{
float number;
NODE *pPrevious, *pNext;
};
Tạo một phần tử mới: NODE* CreateNode(float Data)
Phần tử đầu danh sách:
NODE *pHead;
pHead = NULL;
HCMUS - 2009
24
Tổ chức danh sách liên kết
Danh sách liên kết kép
Tạo một phần tử mới
NODE* CreateNode (float Data)
{
NODE *pNode;
pNode = new NODE;
if (pNode == NULL)
return NULL;
pNode->number = Data;
pNode->pPrevious = NULL;
pNode->pNext = NULL;
return pNode;
}
HCMUS - 2009
25