ngtuananh_vn@yahoo
.com
1
Chương 5
KHOA CNTT, BM: TIN HỌC TRẮC ĐỊA,
Nguyễn Tuấn Anh,
ĐẠI HỌC MỎ - ĐỊA CHẤT
DANH SÁCH LIÊN KẾT
Single Linked List
ngtuananh_vn@yahoo
.com
2
Danh sách liên kết đơn
ngtuananh_vn@yahoo
.com
3
Thêm vào một danh sách liên tục(mảng)
insert(3, ‘z’)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
Lý do sử dụng ds liên kết
ngtuananh_vn@yahoo
.com
4
X=d
remove(3, x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8
count=7
Xóa một phần tử ra khỏi mảng
ngtuananh_vn@yahoo
.com
5
infor Next
Dữ liệu
Trường liên kết
L
3
Next
7
Next
8
DANH SÁCH LIÊN KẾT ĐƠN
ngtuananh_vn@yahoo
.com
6
ngtuananh_vn@yahoo
.com
7
ĐỊNH NGHĨA 1 NÚT và KHAI BÁO CON TRỎ L TRỎ ĐẾN ĐẦU
DANH SÁCH
typedef struct Node{
Data infor;
Node * next;
};
Type Node = record
ht:string[20];
ns: integer;
Node ^next;
End;
Khai báo một con trỏ L
Node * L;
ngtuananh_vn@yahoo
.com
8
Ví dụ tạo danh sách liên kết đơn các
số nguyên
typedef struct Node {
int infor;
Node * next;
};
Node *L;
ngtuananh_vn@yahoo
.com
9
Ví dụ tạo danh sách liên kết đơn các
sinh viên
typedef struct sinhvien {
char ht[25];
int namsinh;
Node * next;
};
Sinhvien *L;
ngtuananh_vn@yahoo
.com
10
L
infor Next
infor Next
…
infor
F
infor Next
infor Next
…
infor
Dạng tổng quát dùng một con trỏ
L
Dạng tổng quát dùng 2 con trỏ F và L
F: First L: Last
infor Next
Dữ liệu Trường liên kết
ngtuananh_vn@yahoo
.com
11
DSLKDON 1 CON TRỎ
infor Next
infor Next
…
infor
Dạng tổng quát dùng 1 con trỏ L
L
1
4 3
L
ngtuananh_vn@yahoo
.com
12
Các phép toán trên DSLK đơn
1. TẠO DANH SÁCH RỖNG
2. THÊM MỘT PHẦN TỬ VÀO CUỐI DANH SÁCH
3. THÊM MỘT PHẦN TỬ SAU MỘT PHẦN TỬ KHÁC
4. XÓA MỘT PHẦN TỬ RA KHỎI DANH SÁCH
5. GHÉP NỐI 2 DSLK ĐƠN THÀNH MỘT DSLK ĐƠN.
ngtuananh_vn@yahoo
.com
13
1. TẠO DANH SÁCH RỖNG
•
Procedure MakeNull( L )
L = Nil;
L
NIL
ngtuananh_vn@yahoo
.com
14
2. THÊM MỘT PHẦN TỬ VÀO CUỐI DANH SÁCH
PROCEDURE INSERT(L,X);
•
Ví dụ ta muốn thêm một phần tử X = 10 vào
cuối danh sách.
1
4 3
L
Bước 1.
New (P);
P->infor = X;
P->Next = NIL
q = L
10
ngtuananh_vn@yahoo
.com
15
2. THÊM MỘT PHẦN TỬ VÀO CUỐI
DANH SÁCH
•
Ví dụ ta muốn thêm một phần tử X = 10 vào
cuối danh sách.
1
4 3
L
Bước 1.
q
New (P);
P->infor = X;
P->Next = NIL
10
ngtuananh_vn@yahoo
.com
16
2. THÊM MỘT PHẦN TỬ VÀO CUỐI
DANH SÁCH
•
Ví dụ ta muốn thêm một phần tử X = 10 vào
cuối danh sách.
1
4 3
L
Bước 1.
q
New (P);
P->infor = X;
P->Next = NIL
10
ngtuananh_vn@yahoo
.com
17
1
4 3
L
10
DANH SÁCH SAU KHI CHÈN
ngtuananh_vn@yahoo
.com
18
3. THÊM MỘT PHẦN TỬ SAU MỘT PHẦN TỬ KHÁC
PROCEDURE INSERTAFTER(L,M,X)
CHÈN X SAU NÚT CÓ M.
10
L
M
TH 1. NÚT M ≡L
Bước 2
Bước 1
12
P
ngtuananh_vn@yahoo
.com
19
3. THÊM MỘT PHẦN TỬ SAU MỘT PHẦN TỬ KHÁC
PROCEDURE INSERTAFTER(L,M,X)
CHÈN X SAU NÚT CÓ M.
10
L
M
TH 2. CHÈN X VÀO CUỐI
Bước 2
Bước 1
12
P
ngtuananh_vn@yahoo
.com
20
3. THÊM MỘT PHẦN TỬ SAU MỘT PHẦN TỬ KHÁC
PROCEDURE INSERTAFTER(L,M,X)
CHÈN X SAU NÚT CÓ M.
1
4 3
10
L
M
Bước1
Bước 2
12
New(p)
ngtuananh_vn@yahoo
.com
21
DANH SÁCH SAU KHI THÊM NÚT MỚI X=12
1
4 3
10
L
12
ngtuananh_vn@yahoo
.com
22
4. LOẠI BỎ MỘT NÚT RA KHỎI DSLK ĐƠN
PROCEDURE DELETE ( L, M )
Trường hợp 1.
DANH SÁCH RỖNG
KẾT THÚC
ngtuananh_vn@yahoo
.com
23
Trường hợp 2. Nút M trùng với nút đầu danh sách
4. LOẠI BỎ MỘT NÚT RA KHỎI DSLK ĐƠN
PROCEDURE DELETE ( L, M )
1
3
10
L
M ≡ L
Bước 1.
Bước 2.
Xóa M
ngtuananh_vn@yahoo
.com
24
Trường hợp 2. Nút M trùng với nút đầu danh sách
4. LOẠI BỎ MỘT NÚT RA KHỎI DSLK ĐƠN
PROCEDURE DELETE ( L, M )
3
10
L
ngtuananh_vn@yahoo
.com
25
Trường hợp 3. Nút M=12 nằm ở giữa danh sách
4. LOẠI BỎ MỘT NÚT RA KHỎI DSLK ĐƠN
PROCEDURE DELETE ( L, M )
1
4
3
10
L
12
Bước 1. Tìm đến nút đứng trước M
P
M
q