Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 3: Danh sách liên kết - Ngô Công Thắng

CHƯƠNG 3  
DANH SÁCH LIÊN KẾT  
1. Giới thiệu về danh sách liên kết  
2. Danh sách liên kết đơn  
3. Danh sách liên kết vòng  
4. Danh sách liên kết kép  
5. Cài đặt ngăn xếp và hàng đợi bằng danh  
sách liên kết đơn  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.1  
1. Giới thiệu về danh sách liên kết  
l Danh sách liên kết là danh sách tuyến tính  
khi sử dụng cấu trúc lưu trữ phân tán. Các  
phần tử dữ liệu của danh sách được lưu  
trữ trong các phần tử nhớ mà ta gọi là nút  
(node). Trong mỗi nút nhớ, ngoài phần tử  
dữ liệu còn có địa chỉ của nút lân cận. Nếu  
giữa các nút nhớ có 1 liên kết thì ta có  
DSLK đơn, nếu giữa các nút có 2 liên kết  
thì ta có DSLK kép.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.2  
2. Danh sách liên kết đơn  
2.1. Quy tắc tổ chức danh sách liên kết đơn  
l Mỗi nút trong danh sách có hai trường,  
trường INFOR chứa thông tin của phần tử  
và trường LINK chứa địa chỉ của nút đứng  
sau (đây chính là địa chỉ liên kết).  
INFOR LINK  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.3  
2.1. Quy tắc tổ chức danh sách  
liên kết đơn (tiếp)  
l Nút cuối cùng trong danh sách không có  
nút đứng sau nên trường địa chỉ LINK là  
rỗng (Æ).  
l Để truy nhập vào tất cả nút trong danh  
sách thì phải có con trỏ F trỏ tới nút đầu  
tiên.  
l Khi danh sách rỗng thì F = Æ  
A1  
A2  
A3  
A4  
Æ
F
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.4  
2.1. Quy tắc tổ chức danh sách  
liên kết đơn (tiếp)  
l Để tổ chức lưu trữ một danh sách liên kết thì phải  
có:  
l Phải có phương tiện chia bộ nhớ ra thành các nút và ở  
mỗi nút có thể truy nhập vào từng trường.  
l Phải có cơ chế để xác định một nút đang được sử  
dụng hoặc chưa được sử dụng (nút trống).  
l Phải có cơ chế cung cấp các nút trống khi có yêu cầu  
sử dụng và thu hồi lại các nút khi không cần dùng nữa.  
l Ta ký hiệu:  
l P Ü AVAIL là phép lấy ra một nút trống có địa chỉ là P  
(cấp phát một nút)  
l P Þ AVAIL là phép thu hồi một nút có địa chỉ là P  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.5  
2.2. Một số phép toán trên  
danh sách liên kết đơn  
l Ký hiệu: Một nút có địa chỉ là p (được trỏ  
bởi p) thì INFOR(p) và LINK(p) tương ứng  
chỉ trường INFOR và LINK của nút đó.  
a) Bổ sung một nút mới vào danh sách  
Cho danh sách liên kết đơn F, M là con trỏ  
trỏ tới một nút trong danh sách. Viết thủ  
tục bổ sung phần tử dữ liệu x vào sau nút  
M.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.6  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
a) Bổ sung một nút mới vào danh sách:  
- Vào: F, M, x  
- Ra: Không có  
{Thủ tục này bổ sung phần tử x vào sau nút  
trỏ bởi M trong danh sách liên kết đơn F}  
Procedure SLPostInsert(Var F; M,x)  
1. {Tạo nút mới}  
N Ü AVAIL  
infor(N):=x; link(N):= Æ;  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.7  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
2. {Nối nút mới vào sau nút M}  
If F=Æ then F:=N  
Else begin  
link(N) := link(M);  
link(M) := N;  
end;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.8  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
b) Loại bỏ một nút khỏi danh sách  
- Vào: F, M  
- Ra: Không  
{Thủ tục này loại bỏ nút trỏ bởi M khỏi danh sách  
liên kết đơn F}  
Procedure SLDelete(Var F; M)  
1. { Trường hợp danh sách rỗng}  
If F=Æ then begin  
Write(‘danh sách rỗng’)  
Return  
end  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.9  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
b) Loại bỏ một nút khỏi danh sách  
2. {Ngắt kết nối với nút M}  
{Nút M là nút đầu tiên của danh sách }  
If M=F then F:=link(F)  
Else begin  
{Tìm đến nút đứng trước nút M }  
P:=F;  
While link(P) # M do P:=link(P)  
{Nối nút trước M với nút sau M}  
link(P):=link(M); end;  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.10  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
3. {Hủy nút M}  
M Þ AVAIL  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.11  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
c) Duyệt danh sách  
- Vào: F  
- Ra: Không  
{Thủ tục này duyệt danh sách liên kết đơn F và  
đưa ra các phần tử dữ liệu trong ds}  
Procedure SLDisplay(F)  
1) P := F;  
2) While P # Æ do  
begin  
Write(infor(P)); P := link(P);  
end;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.12  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
d) Ghép hai danh sách liên kết đơn  
Cho 2 danh sách liên kết đơn lần lượt trỏ bởi p  
và q, ghép 2 danh sách trở thành một danh sách  
và cho p trỏ tới. Thuật toán có các bước sau:  
Procedure SLConcat(Var p, q)  
1. {Danh sách trỏ bởi q rỗng}  
If q = Æ then Return  
2. {Trường hợp danh sách trỏ bởi p rỗng}  
If p = Æ then begin  
p:=q  
return  
end  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.13  
2.2. Một số phép toán trên  
danh sách liên kết đơn (tiếp)  
d) Ghép hai danh sách liên kết đơn  
3. {Tìm đến nút cuối danh sách p}  
p1:= p  
While link(p1) # Æ do p1:=link(p1);  
4. {Ghép}  
link(p1):=q;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.14  
Ưu nhược điểm của danh sách liên kết đơn  
l Với danh sách tuyến tính động, trong quá  
trình xử lý luôn có bổ sung, loại bỏ thì tổ  
chức danh sách liên kết là hợp lý, tận  
dụng được các vùng nhớ nằm rải rác  
trong bộ nhớ.  
l Chỉ có phần tử đầu tiên là truy nhập trực  
tiếp, các phần tử khác phải truy nhập qua  
phần tử đứng trước nó.  
l Tốn bộ nhớ do phải lưu cả 2 trường infor  
và link ở mỗi nút.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.15  
3. Danh sách liên kết vòng  
l Danh sách liên kết vòng (Circularly Linked  
List) là một dạng cải tiến của danh sách  
liên kết đơn.  
l Trong danh sách liên kết vòng, trường địa  
chỉ của nút cuối cùng không phải là rỗng  
mà lại chứa địa chỉ của nút đầu tiên của  
danh sách.  
A1  
A2  
A3  
A5  
F
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.16  
3. Danh sách liên kết vòng (tiếp)  
l Ưu nhược điểm của danh sách nối vòng:  
l Danh sách nối vòng làm cho việc truy nhập  
vào các nút trong danh sách linh hoạt hơn. Ta  
có thể truy nhập vào danh sách bắt đầu từ  
một nút nào cũng được, không nhất thiết phải  
từ nút đầu tiên. Nút nào cũng có thể là nút  
đầu tiên và con trỏ F trỏ vào nút nào cũng  
được.  
l Nhược điểm của danh sách nối vòng là trong  
xử lý nếu không cẩn thận sẽ dẫn tới một chu  
trình không kết thúc.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.17  
3. Danh sách liên kết vòng (tiếp)  
l Để khắc phục nhược điểm của danh sách  
nối vòng ta đưa thêm vào một nút đặc biệt  
gọi là “nút đầu danh sách” (list head  
node). Trường Infor của nút này không  
chứa dữ liệu, con trỏ HEAD trỏ tới nút đầu  
danh sách này cho phép ta truy nhập vào  
danh sách.  
Head  
A1  
A2  
A3  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.18  
3. Danh sách liên kết vòng (tiếp)  
l Việc dùng thêm nút đầu danh sách đã làm cho  
danh sách luôn có ít nhất 1 nút nên không bao  
giờ rỗng. Danh sách có 1 nút HEAD có  
LINK(Head)= Head.  
Head  
l Các phép toán bổ sung và loại bỏ nút trong  
danh sách liên kết vòng tương tự danh sách liên  
kết đơn .  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.19  
4. Danh sách liên kết kép  
4.1. Giới thiệu  
l Trong danh sách liên kết kép (double linked list)  
mỗi nút có cấu trúc gồm 3 trường:  
LEFT INFOR RIGHT  
LEFT: Con trỏ trỏ tới nút đứng trước  
RIGHT: Con trỏ trỏ tới nút đứng sau  
INFOR: Chứa phần tử dữ liệu  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.20  
4.1. Giới thiệu (tiếp)  
l LEFT của nút cực trái và RIGHT của nút  
cực phải có giá trị là Æ.  
l Để truy nhập vào danh sách cả 2 chiều ta  
phải dùng 2 con trỏ: Con trỏ L trỏ vào nút  
cực trái, con trỏ R trỏ vào nút cực phải.  
l Khi danh sách rỗng thì L = R = Æ.  
L
R
A
B
C
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.21  
4.2. Các phép toán trên danh sách  
liên kết kép  
a) Chèn thêm một nút vào danh sách  
l Chèn phần tử dữ liệu X vào trước nút M trong  
danh sách liên kết kép L, R.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.22  
4.2. Các phép toán trên danh sách  
liên kết kép  
- Vào: (L,R),M,x  
- Ra: Không có  
{Thủ tục này bổ sung phần tử x vào trước nút M trong  
DSLK kép L, R}  
Procedure DLPreInsert(Var L, R; M, x)  
1. {Tạo nút mới}  
N Ü AVAIL;  
{Đưa dữ liệu vào trong nút mới và cho các trường con trỏ rỗng}  
infor(N) := x;  
left(N) := right(N) := Æ;  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.23  
a) Chèn thêm một nút vào danh sách  
2. {Trường hợp danh sách rỗng}  
If L=R=Æ then begin  
L := R:=N;  
Return;  
end  
3. {M trỏ tới nút cực trái}  
If M=L then begin  
right(N) := L;  
left(L) := N;  
L := N;  
Return;  
end  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.24  
a) Chèn thêm một nút vào danh sách  
4. {Bổ sung vào nút mới vào trước M}  
right(left(M)) := N;  
left(N) := left(M);  
right(N) := M;  
left(M) := N;  
5. {Kết thúc}  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.25  
b) Loại bỏ một nút ra khỏi danh  
sách liên kết kép  
l Cho danh sách liên kết kép L, R. M là con trỏ trỏ tới một  
nút trong danh sách cần loại bỏ.  
- Vào: (L,R), M  
- Ra: Không có  
{Thủ tục này loại bỏ nút trỏ bởi M trong DSLK kép L, R}  
Procedure DLDelete(Var L, R; M)  
1. { Trường hợp danh sách rỗng }  
If L=R=Æ then begin  
Write(‘ danh sach rong ‘)  
Return  
end  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.26  
b) Loại bỏ một nút ra khỏi danh  
sách liên kết kép  
2. {Thay đổi liên kết}  
Case  
L= R=M: Begin {Danh sach chỉ còn 1 nút M}  
L := Æ;  
R := Æ;  
end  
M=L: Begin { Nút cực trái bị loại }  
L := right(L);  
left(L) := Æ;  
end  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.27  
b) Loại bỏ một nút ra khỏi danh  
sách liên kết kép  
M=R: Begin { Nút cực phải bị loại }  
R := left(R);  
right(R) := Æ;  
end  
ELSE  
right(left(M)) := right(M);  
left(right(M)) := left(M);  
End Case  
3.{Hủy nút M}  
M Þ AVAIL;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.28  
c) Duyệt danh sách liên kết kép và  
đưa ra các phần tử của danh sách  
- Vào: L, R  
- Ra: Không có  
{Thủ tục này duyệt DSLKK L,R từ trái sang phải}  
Procedute DLDisplay(L, R);  
1) P:= L;  
2) While P # Æ do  
begin  
Write(infor(P));  
P := right(P);  
end;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.29  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
5.1. Sử dụng cấu trúc lưu trữ phân tán cho  
ngăn xếp  
l Các phần tử dữ liệu của ngăn xếp lưu trữ  
trong các nút nhớ nằm rải rác khắp nơi  
trong bộ nhớ, mỗi nút nhớ có cấu trực  
gồm 2 trường  
l Nút dưới cùng (nút đáy),  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.30  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
- Vào: T, x  
- Ra: Không có  
{Thủ tục này bổ sung phần tử x vào ngăn xếp T lưu trữ phân tán}  
Procedure push(Var T; x)  
1) {Tạo nút mới}  
N <= AVAIL; infor(N) := x; link(N) := Æ;  
2) {Nối nút mới vào trên nút T}  
link(N) := T;  
3) {Cho T trỏ tới nút mới}  
T := N;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.31  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
- Vào: T  
- Ra: Phần tử dữ liệu loại bỏ  
{Hàm này loại bỏ phần tử đỉnh ngăn xếp T sử dụng cấu trúc  
lưu trữ phân tán và trả về phần tử này}  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.32  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
Function pop(Var T)  
1) {Kiểm tra ngăn xếp rỗng}  
If T = Æ then begin  
write(‘Ngan xep da rong’); return; end;  
2) {Giữ lại phần tử đỉnh sẽ loại bỏ}  
tg := infor(T); P:=T;  
3) {Cho T trỏ xuống nút bên dưới}  
T := link(T);  
4) {Hủy nút đỉnh và trả về phần tử đỉnh}  
P => AVAIL; pop := tg;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.33  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
- Vào: T  
- Ra: TRUE nếu ngăn xếp rỗng, FALSE nếu không rỗng  
{Hàm kiểm tra ngăn xếp T lưu trữ phân tán, trả về TRUE  
nếu n.xếp rỗng và FALSE nếu chưa rỗng}  
Function isEmpty(T)  
If T = Æ then isEmpty:=TRUE;  
Else isEmpty:=FALSE;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.34  
5. Sử dụng cấu trúc lưu trữ  
phân tán cho ngăn xếp và hàng đợi  
- Vào: T  
- Ra: Phần tử dữ liệu đỉnh ngăn xếp  
{Hàm này trả về phần tử đỉnh ngăn xếp T lưu trữ phân tán}  
Function top(T)  
1) {Kiểm tra ngăn xếp rỗng}  
If T = Æ then begin  
write(‘Ngan xep da rong’); return; end;  
2) {Trả về phần tử đỉnh}  
top := infor(T);  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.35  
5.2. Sử dụng cấu trúc lưu trữ  
phân tán cho hàng đợi  
l Trong cấu trúc lưu trữ phân tán, các phần  
tử dữ liệu của hàng đợi được lưu trữ trong  
các nút nhớ nằm rải rác khắp nơi trong bộ  
nhớ nhưng có liên kết với nhau về địa chỉ.  
Mỗi nút nhớ có cấu trực gồm 2 trường,  
trường Infor chứa phần tử dữ liệu, trường  
Link chứa địa chỉ nút đứng sau.  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.36  
5.2. Sử dụng cấu trúc lưu trữ phân tán cho hàng đợi  
- Vào: (F, R), x  
- Ra: Không có  
{Thủ tục này bổ sung phần tử x vào lối sau của hàng đợi (F, R)  
sử dụng cấu trúc lưu trữ phần tán}  
Procedure QInsert(Var F,R; x)  
1) {Tạo nút mới}  
N <= AVAIL;  
infor(N) := x; link(N) := Æ;  
2) {Nối nút mới vào sau R}  
If F=R=Æ Then begin F:=R:=N; return; end  
Else link(R) := N;  
3) {Cho R trỏ tới nút mới}  
R := N;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.37  
5.2. Sử dụng cấu trúc lưu trữ  
phân tán cho hàng đợi  
- Vào: (F, R)  
- Ra: Phần tử dữ liệu loại bỏ  
{Hàm này loại bỏ phần tử ở lối trước của hàng đợi  
(F, R) lưu trữ phân tán và trả về phần tử loại bỏ}  
Function QDelete(Var F, R)  
1){Kiểm tra hàng đợi rỗng}  
If F=R=Æ then begin  
write(‘Hàng đợi đã rỗng.’);  
return;  
end;  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.38  
5.2. Sử dụng cấu trúc lưu trữ  
phân tán cho hàng đợi  
2) {Giữ lại nút lối trước (nút đầu hàng)}  
tg := tnfor(F); P := F;  
3) {Cho F trỏ tới nút đứng sau}  
If F=R then F:=R:=Æ  
Else F := link(F);  
4) {Hủy nút và trả về phần tử dữ liệu}  
P => AVAIL;  
QDelete := tg;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.39  
5.2. Sử dụng cấu trúc lưu trữ  
phân tán cho hàng đợi  
- Vào: (F, R)  
- Ra: True - rỗng, False - không rỗng  
{Hàm này kiểm tra hàng đợi rỗng}  
Function QIsEmpty(F, R)  
If F=R=Æ then QIsEmpty := True  
Else QIsEmpty := False;  
Return  
Ngô Công Thắng  
Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03  
3.40  
Tải về để xem bản đầy đủ
pdf 21 trang yennguyen 22540 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 3: Danh sách liên kết - Ngô Công Thắng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_cau_truc_du_lieu_va_giai_thuat_chuong_3_danh_sach.pdf