Professional Documents
Culture Documents
▪ Cài đặt danh sách theo hai phương pháp: cài đặt danh sách
theo kiểu kế tiếp và kiểu liên kết.
▪ Hiện thực danh sách kề và danh sách liên kết, áp dụng vào
bài toán thực tế.
08/09/2023 2
Nội Dung
2.1 Khái Niệm
2.2 Cấu Trúc Danh Sách
2.3 Phương Pháp Cài Đặt Danh Sách
2.4 Hiện Thực Danh Sách Kề
2.5 Hiện Thực Danh Sách Liên Kết Đơn
2.6 Các Loại Danh Sách Liên Kết Khác
Tóm Tắt
Câu Hỏi Ôn Tập
08/09/2023 3
2.1 Khái Niệm (1)
Danh sách (List) là một trong những cấu trúc cơ bản nhất được
cài đặt trong hầu hết các chương trình ứng dụng.
Danh sách là một kiểu dữ liệu trừu tượng gồm nhiều nút
cùng kiểu dữ liệu, các nút trong danh sách có thứ tự.
- Cài đặt theo kiểu liên kết, ta có danh sách liên kết.
08/09/2023 4
2.1 Khái Niệm (2)
2 cách cài đặt
08/09/2023 5
2.1 Khái Niệm (3)
• Các thao tác cơ bản
– Truy xuất nút tại vị trí position trong danh sách (Retrieve)
08/09/2023 8
2.3 Phương pháp cài đặt danh sách (2)
▪ Mảng 1 chiều (danh sách kế tiếp)
• Kích thước cố định (fixed size)
• Các phần tử tuần tự theo chỉ số 0 n-1
• Truy cập ngẫu nhiên (random access)
• Chèn, xóa 1 phần tử vào mảng rất khó
• Cài đặt mảng Chèn, xóa Chậm!!!
1 chiều (SV
tự cài đặt)
…
0 1 2 3 4 n-2 n-1
08/09/2023 9
2.3 Phương pháp cài đặt danh sách (3)
▪ Danh sách liên kết
• 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
Insert, Nhanh,
• SV sẽ được Delete đơn giản
học cách cài
đặt
08/09/2023 10
2.4 Hiện Thực Danh Sách Liên Kết Đơn
08/09/2023 11
2.4.1. DSLK Đơn - định nghĩa (1)
• DSLK đơn là một danh sách các node, mỗi node
gồm 2 thành phần:
info next
08/09/2023 13
2.4.1. DSLK Đơn - định nghĩa (3)
Header Node Tail Node
NULL
Next Next Next Next
pHead
A B C D
Data Data Data Data
08/09/2023 14
2.4.1. DSLK Đơn - định nghĩa (4)
Địa chỉ
Ví dụ:
800 200 500 100
800 200 500 100 NULL
Next Next Next
pHead
‘X’ ‘Y’ ‘U’ ‘V’
Data Data Data Data
08/09/2023 17
2.4.2.khởi tao &Kiểm tra danh sách rỗng
08/09/2023 18
2.4.2. DSLK đơn – Thêm đầu
•void InsertFirst(Node* &pHead, int x){…}
p new
pHead X
pHead
1
p p
pHead
pHead
22 33 pHead=p
p→next=pHead
08/09/2023 19
2.4.2. DSLK đơn – Thêm đầu
void InsertFirst(Node* &pHead, int x)
{
Node* p = CreateNode(x);
p->next = pHead;
pHead = p;
}
08/09/2023 20
2.4.2. DSLK đơn – Thêm sau 1 nút
void InsertAfter(Node* p, int x){…}
p tam
p new
1
tam tam
p 2 p
3
P->next P->next
P→next = tam
2 tam→next = p→next 3
08/09/2023 21
2.4.2. DSLK đơn – Thêm sau 1 nút
void InsertAfter(Node* p, int x)
{
Node* q;
if (p!=NULL){
q = createNode(x);
q->next = p->next;
p->next = q
}
}
08/09/2023 22
2.4.2. DSLK đơn – Xóa đầu
void DeleteFirst(Node* &pHead){…}
pHead pHead
p p = pHead 1
pHead pHead->next pHead
1
1 q = p->next
p q q->next
2
2 p->next = q->next
p q q->next
3
3 delete q
08/09/2023 25
2.4.2. DSLK đơn – Xóa sau
void DeleteAfter(Node* p)
{ Node* q;
if (p==NULL || p->next ==NULL)
//kiem tra nut sau p co ton tai ko
printf(“Khong the xoa nut nay!”);
else
{ q = p->next;
p->next = q->next;
delete q;
}
08/09/2023 } 26
2.4.2. DSLK đơn –Xóa toàn bộ
pHead pHead
p p
p = pHead; pHead = pHead->next;
1 delete p; 2
pHead
pHead
p p
3 4
08/09/2023 27
2.4.2. DSLK đơn –Xóa toàn bộ
void ClearList(Node* &phead)
{ Node* p;
while (pHead!=NULL)
{ p = pHead;
pHead = p->next;
delete p;
}
}
08/09/2023 28
2.4.2. Duyệt 1 ds liên kết
//dùng while void ShowList(Node* pHead)
{ Node* p = pHead;
if(p == NULL)
printf(“\n Danh sach bi rong”);
while(p != NULL)
{ printf(“%d \t”,p->info);
p = p->next;
}
08/09/2023
} 29
2.4.2. Duyệt 1 ds liên kết
//dùng for void ShowList(Node* pHead)
{
if(pHead == NULL)
printf(“\n Danh sach bi rong”);
else
for (Node* p = pHead; p!=NULL; p = p->next)
printf(“%d \t”,p->info);
}
08/09/2023 30
2.4.2.Tìm kiếm 1 nút trong dslk có giá trị x
//dùng while
Node* Search(Node* pHead, int x)
{ Node* p = pHead;
while(p->info !=x && p!=NULL)
p = p->next;
return p;
}
08/09/2023 31
2.4.2.Tìm kiếm 1 nút trong dslk có giá trị x
//dùng for Node* Search(Node* pHead, int x)
{ Node* p;
for(p = pHead; p!=NULL; p = p->next)
if (p->info ==x ) return p;
return NULL;
}
08/09/2023 32
2.4.2. DSLK đơn – sắp xếp theo selection sort
void Sort(Node * &pHead) 1
{ Node * p, *q, *pmin;
int min;
for(p = phead; p->next != NULL; p = p->next)
{ min = p->info;
pmin = p;
for(q = p->next;q != NULL;q = q->next)
{ if (q->info < min) {
08/09/2023 33
2.4.2. DSLK đơn – sắp xếp theo selection sort
min = q->info; 2
pmin = q;
} // hết if (q->info < min)
} // hết for(q ….)
pmin->info = p->info;
p->info = min
} // hết for (p …)
} // hết void Sort(..)
08/09/2023 34
2.5. Các loại DSLK khác
08/09/2023 35
2.5.1. DSLK vòng
• 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
Tail Node
A B C D
Data Data Data Data
08/09/2023 37
2.5.1. DSLK vòng
• Khai báo & khởi tạo
typedef struct node
{
DataType info;
struct node *next;
}Node;
08/09/2023 41
Câu Hỏi Ôn Tập Bài 4
Thông tin mỗi sv gồm: mã sv, họ tên, điểm trung bình.
Chương trình có các chức năng sau:
– Tạo 1 danh sách gồm n SV (n nhập từ bàn phím,
thông tin của mỗi sv nhập từ bàn phím)
– Xuất danh sách sinh viên
– Xuất thông tin các sv có ĐTB>5
– Tìm sinh viên có tên là X
– Sắp xếp danh sách tăng theo ĐTB
08/09/2023 42
Câu Hỏi Ôn Tập Bài 4
3. Viết chương trình hiện thực danh sách liên kết đôi.
08/09/2023 43