Tải bản đầy đủ (.pdf) (21 trang)

index of cnpmpth02003slidepdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (533.29 KB, 21 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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



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ó



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

Ngơ Cơng Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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



3.3


2.1. Quy t

c t

ch

c danh sách



liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


2.1. Quy t

c t

ch

c danh sách




liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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


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



</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


2.2. M

t s

phép toán trên


danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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):=

;



3.7


2.2. M

t s

phép toán trên


danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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;



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


2.2. M

t s

phép toán trên



danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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




3.9


2.2. M

t s

phép toán trên



danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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;



</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


2.2. M

t s

phép toán trên



danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



3. {H

y nút M}


M

AVAIL


Return



3.11


2.2. M

t s

phép toán trên




danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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;



</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


2.2. M

t s

phép toán trên



danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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 tố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


3.13


2.2. M

t s

phép toán trên



danh sách liên k

ế

t

đơ

n (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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}



</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03



Ư

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 q


trình x

lý ln 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.



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




</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

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. Danh sách liên k

ế

t vòng (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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.



3.17


3. Danh sách liên k

ế

t vòng (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



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.



A1

A2

A3



</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

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. Danh sách liên k

ế

t vòng (

<i>ti</i>

<i>ế</i>

<i>p</i>

)



l

Vi

c dùng thêm nút

đầ

u danh sách

đ

ã làm cho


danh sách ln 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.



l

Các phép tố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 .



Head



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: 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


</div>
<span class='text_page_counter'>(11)</span><div class='page_container' data-page=11>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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

Để

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 =

.



A B C


L <sub>R</sub>


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



</div>
<span class='text_page_counter'>(12)</span><div class='page_container' data-page=12>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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 <b>vào trước nút M</b> 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) := ∅;


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;


</div>
<span class='text_page_counter'>(13)</span><div class='page_container' data-page=13>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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



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


</div>
<span class='text_page_counter'>(14)</span><div class='page_container' data-page=14>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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



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


</div>
<span class='text_page_counter'>(15)</span><div class='page_container' data-page=15>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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


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



</div>
<span class='text_page_counter'>(16)</span><div class='page_container' data-page=16>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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


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ỏ


</div>
<span class='text_page_counter'>(17)</span><div class='page_container' data-page=17>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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


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;


</div>
<span class='text_page_counter'>(18)</span><div class='page_container' data-page=18>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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


3.35


5.2. S

d

ng c

u trúc l

ư

u tr



phân tán cho hàng

đợ

i



</div>
<span class='text_page_counter'>(19)</span><div class='page_container' data-page=19>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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


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;



</div>
<span class='text_page_counter'>(20)</span><div class='page_container' data-page=20>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


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



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;



</div>
<span class='text_page_counter'>(21)</span><div class='page_container' data-page=21>

Ngô Công Thắng Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 03


Bài t

p



1. Thế nào là danh sách nối vòng. Nêu ưu nhược điểm của
nó.


2. Để khắc phục hạn chế của danh sách nối vòng người ta
làm thế nào.


3. Thế nào là danh sách nối kép? Qui ước biểu diễn một
nút của danh sách nối kép.


4. Nêu ưu nhược điểm của danh sách nối kép.


5. Cài đặt Stack bằng danh sach nối đơn như thế nào. Cần
chú ý gì khi thực hiện các phép bổ sung, loại bỏ phần tử.
6. Cài đặt Queue bằng danh sach nối đơn như thế nào.


Cần chú ý gì khi thực hiện các phép bổ sung, loại bỏ
phần tử.


</div>


<!--links-->

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×