Professional Documents
Culture Documents
CHUONG 4 - Danh Sach Lien Ket - 2015
CHUONG 4 - Danh Sach Lien Ket - 2015
CHUONG 4 - Danh Sach Lien Ket - 2015
MỤC TIÊU
1
30/03/2015
Nội dung
Giới thiệu
Mảng 1 chiều
Có kích thước cố định (cấp phát tĩnh)
Thêm/ xóa có độ phức tạp cao
Các phần tử tuần tự theo chỉ số 0 n-1
Truy cập ngẫu nhiên
chèn
0 1 2 3 4 n-2 n-1
ThS. Trần Văn Thọ 6
2
30/03/2015
Giới thiệu
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/xóa đơn giản
Insert,
Delete
1FF0 1FF4
int i, *pi; i ? pi ?
1FF4
pi = &i; i 1FF0
*pi ? pi 1FF0
Định nghĩa
Danh sách liên kết đơn là chuỗi các phần tử
(Node), được tổ chức theo thứ tự tuyến tính. Mỗi
phần tử liên kết với 1 phần tử đứng liền kế sau trong
danh sách.
3
30/03/2015
Minh Họa
Mô tả danh sách
Data Link
A0 A1 A2 An-1
null
Minh Họa
Ví dụ:
Địa chỉ
700 500
‘D’ 500 ‘S’ 600
Tail
4
30/03/2015
SNode* Head; // Lưu địa chỉ SNode đầu tiên trong List
SNode* Tail; // Lưu địa chỉ của SNode cuối cùng trong List
5
30/03/2015
Head Tail
3f 4f 5f
4 4f 7 5f 6 NULL
6
30/03/2015
7
30/03/2015
Head 2f 3f 4f
3 3f 4 4f 8…
9f
10 2f
NULL
p→Next=Head
Head=p
P new
8
30/03/2015
Tail
3f 4f 5f
4 4f 8 5f 5 NULL
8f Tail=p
Tail→Next=p 8f
6 NULL
new
P
Sử dụng hàm CreateSNode
Giải thuật:
- Bước 1: Nếu phần tử q hoặc phần tử muốn
thêm p không tồn tại thì không thực hiện.
- Bước 2:
+ pNext =qNext;
+ qNext=p;
+ Nếu q là phần tử cuối thì: Tail=p;
9
30/03/2015
3f 4f q 5f
4 4f 8 5f
6f 5 ..
6f
q→Next=p
7 5f
NULL
p→Next=q→Next
P new
Giải thuật:
- Bước 1: Nếu (Head==NULL) thì: trả về NULL;
- Bước 2: Gán p=Head; //địa chỉ của phần tử đầu trong SList
- Bước 3:
Lặp lại trong khi ( p!=NULL và pInfo!=x ) thì thực hiện:
p=pNext; //xét phần tử kế sau
- Bước 4: Trả về p; //nếu (p!=NULL) thì p lưu địa chỉ của
phần tử có khóa bằng x, hoặc NULL là không có phần tử
cần tìm.
ThS. Trần Văn Thọ 30
10
30/03/2015
Head 1f 2f 3f 4f 5f
34 3 4 8 56
P
Tìm thấy, và
trả về địa chỉ
X = 8
của nút tìm
thấy là 4f
11
30/03/2015
Head=Head→Next
Head 1f 2f 3f 4f
7 2f 6 3f 3 4f 8 …
p=Head
P
delete p
ThS. Trần Văn Thọ 36
12
30/03/2015
Giải thuật:
- Bước 1: Nếu (q==NULL hoặc qNext==NULL) thì:
không thực hiện.
- Bước 2: Khi (q!=NULL và qNext!=NULL) thì: thực
hiện các công việc sau:
+ Bước 2.1: p=qNext;
+ Bước 2.2: qNext=pNext;
+ Bước 2.3: Nếu (p==Tail) thì : Tail=q;
+ Bước 2.4: Lưu lại thông tin nút bị xóa;
p=q→Next
q p delete p
Head 1f 2f 3f 4f
7 2f 6 3f
4f 3 4f 8 …
q→Next=p→Next
13
30/03/2015
14
30/03/2015
Head Tail
1f 2f 3f 4f 5f
7 2f 6 3f 3 4f 8 5f 9 NULL
p p p p p
NULL
15
30/03/2015
Xử lý danh sách
16
30/03/2015
p = sl.Head;
while(p!=NULL)
{ Kết thúc
printf(“ %5d”, p→Info);
p = p→Next;
}
17
30/03/2015
18
30/03/2015
19
30/03/2015
A1 A2 An
20
30/03/2015
21
30/03/2015
Head
A B C D NULL
NULL
(2) (3)
(4)
X NULL
Tail
p (1)
NULL
22
30/03/2015
Tail
Head
(4)
A B C D NULL
(2)
(3) X NULL
NULL
p (1)
NULL
Tail
Head
r (1) q
A B C D NULL
(6) (5)
(4) (3)
NULL X NULL
NULL p (2)
23
30/03/2015
A B C D NULL
(6)
(5)
(4) (3)
NULL X NULL
NULL p (2)
24
30/03/2015
A B C D NULL
Head→Prev = NULL
p=Head (3)
NULL P (1)
delete p
(4)
25
30/03/2015
(2)
Tail=Tail→Prev
Head Tail
A B C D NULL
(1) (2)
p=q→Next r=p→Next
Head
q p r
A B C D NULL
q→Next=r r→Prev=q
(3) (4)
Tail
NULL delete p
(5)
26
30/03/2015
27
30/03/2015
Cách 1:
for(DNode* p = dl.Head; p!=NULL; p = p→Next)
< xử lý p >;
Cách 2:
for(DNode* q = dl.Tail; q !=NULL; q = q→Prev)
< xử lý q >;
28
30/03/2015
Tail
A1 A2 A3 An
Head
Trường Next của nút cuối không còn trỏ đến
NULL, mà trỏ đến nút đầu
ThS. Trần Văn Thọ 87
29
30/03/2015
30
30/03/2015
Head
A B C D
p
Tail
X
31
30/03/2015
Tail
Head
A B C D
X
p
32
30/03/2015
33