tài liệu bài giáng cấu trúc dữ liệu và giải thuật ngô công thắng học viện nông nghiệp việt nam tài liệu bài giáng cấu trúc dữ liệu và giải thuật ngô công thắng học viện nông nghiệp việt nam tài liệu bài giáng cấu trúc dữ liệu và giải thuật ngô công thắng học viện nông nghiệp việt nam
1 Giới thiệu danh sách liên kết Sử dụng trỏ để tổ chức lưu trữ danh sách tuyến tính tạo cấu trúc liệu danh sách liên kết l Mỗi phần tử danh sách lưu trữ phần tử nhớ mà ta gọi nút (node) Mỗi nút bao gồm số ô nhớ liền kề nằm chỗ nhớ Trong nút thông tin ứng với phần tử, có địa nút liền kề l CHƯƠNG DANH SÁCH LIÊN KẾT GV Ngô Công Thắng Bộ môn Công nghệ phần mềm Khoa Công nghệ thông tin Website: dse.vnua.edu.vn/ncthang Email: ncthang@vnua.edu.vn Ngô Công Thắng Danh sách liên kết chia thành danh sách liên kết đơn, danh sách liên kết vòng danh sách liên kết kép l Danh sách liên kết đơn dùng để cài đặt cho cấu trúc ngăn xếp hàng đợi Giới thiệu danh sách liên kết Danh sách liên kết đơn Danh sách liên kết vòng Danh sách liên kết kép Cài đặt ngăn xếp hàng đợi danh sách liên kết đơn Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.3 Giới thiệu danh sách liên kết (tiếp) CHƯƠNG DANH SÁCH LIÊN KẾT Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 l 3.2 Ngô Công Thắng Bài giảng Cấu trúc liệu 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) 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 danh sách có hai trường, trường INFOR chứa thông tin phần tử trường LINK chứa địa nút đứng sau (đây địa liên kết) INFOR l l l l l LINK Để tổ chức lưu trữ danh sách liên kết phải có: Ta ký hiệu: l l Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.5 Phải có phương tiện chia nhớ thành nút nút truy nhập vào trường Phải có chế để xác định nút sử dụng chưa sử dụng (nút trống) Phải có chế cung cấp nút trống có yêu cầu sử dụng thu hồi lại nút không cần dùng N ⇐ AVAIL phép lấy nút trống có địa X (cấp phát nút) P ⇒ AVAIL phép thu hồi nút có địa X Ngô Công Thắng 2.1 Quy tắc tổ chức danh sách liên kết đơn (tiếp) Nút cuối danh sách nút đứng sau nên trường địa rỗng, không chứa địa chỉ, ta ký hiệu ∅ l Để truy nhập vào tất nút danh sách phải có địa nút đầu tiên, cần phải có trỏ F trỏ tới nút l Nếu danh sách rỗng qui ước F = ∅ A1 Ngô Công Thắng A2 A3 Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.7 2.2 Một số phép toán danh sách liên kết đơn l F Bài giảng Cấu trúc liệu giải thuật - Chương 03 A4 ∅ 3.6 Ký hiệu: Một nút có địa p (được trỏ p) INFOR(p) LINK(p) tương ứng trường INFOR LINK nút a) Bổ sung nút vào danh sách Cho danh sách liên kết đơn F, M trỏ trỏ tới nút danh sách Viết thủ tục bổ sung phần tử liệu X vào sau nút M l Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.8 2.2 Một số phép toán danh sách liên kết đơn (tiếp) a) Bổ sung nút vào danh sách: - Vào: F, M, X - Ra: Không có {Thủ tục bổ sung phần tử X vào sau nút trỏ M danh sách liên kết đơn F} Procedure INSERT(F,M,X) {Tạo nút mới} new ⇐ AVAIL INFOR(new):=X; LINK(new):= ∅; Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.9 {Thực bổ sung: Nếu danh sách rỗng bổ sung nút vào thành nút Nếu danh sách không rỗng bổ sung nút vào sau nút M} If F=∅ then begin F:=new end else begin LINK(new):=LINK(M) LINK(M):=new end {Kết thúc} Return Bài giảng Cấu trúc liệu giải thuật - Chương 03 b) Loại bỏ nút khỏi danh sách - Vào: F, M - Ra: Không {Cho danh sách liên kết đơn F, loại bỏ nút trỏ M khỏi danh sách.} Procedure DELETE(F,M) { 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 liệu giải thuật - Chương 03 3.11 2.2 Một số phép toán danh sách liên kết đơn (tiếp) 2.2 Một số phép toán danh sách liên kết đơn (tiếp) Ngô Công Thắng 2.2 Một số phép toán danh sách liên kết đơn (tiếp) 3.10 b) Loại bỏ nút khỏi danh sách {Nút trỏ M nút danh sách } If M=F then begin F:=LINK(M) M ⇒ AVAIL Return end Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.12 2.2 Một số phép toán danh sách liên kết đơn (tiếp) 2.2 Một số phép toán danh sách liên kết đơn (tiếp) c) Ghép hai danh sách liên kết đơn {Tìm đến nút đứng trước nút M } P:=F While LINK(P)M P:=LINK(P) {Loại bỏ nút trỏ M} LINK(P):=LINK(M) {Thu hồi nút bị loại} M ⇒ AVAIL {Kết thúc} Return Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 {Tìm đến nút cuối danh sách p} p1:= p While link(p1) # ∅ p1:=link(p1) {Ghép} Link(p1):=q {Kết thúc} Return 3.13 2.2 Một số phép toán danh sách liên kết đơn (tiếp) {Danh sách trỏ q rỗng} If q = ∅ then Return {Trường hợp danh sách trỏ p rỗng} If p = ∅ then begin p:=q return end Bài giảng Cấu trúc liệu giải thuật - Chương 03 Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.15 Ưu điểm nhược danh sách liên kết c) Ghép hai danh sách liên kết đơn Cho danh sách liên kết đơn trỏ p q, ghép danh sách trở thành danh sách cho p trỏ tới Thuật toán có bước sau: Procedure Ghep(p,q) Ngô Công Thắng Ngô Công Thắng 3.14 Với danh sách tuyến tính động, trình xử lý có bổ sung, loại bỏ tổ chức danh sách liên kết hợp lý, tận dụng vùng nhớ nằm rải rác nhớ l Chỉ có phần tử truy nhập trực tiếp, phần tử khác phải truy nhập qua phần tử đứng trước l Tốn nhớ phải lưu trường infor link nút l Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.16 Danh sách liên kết vòng Danh sách liên kết vòng (tiếp) Danh sách liên kết vòng (Circularly Linked List) dạng cải tiến danh sách liên kết đơn l Trong danh sách liên kết vòng, trường địa nút cuối rỗng mà lại chứa địa nút danh sách l l Để khắc phục nhược điểm danh sách nối vòng ta đưa thêm vào nút đặc biệt gọi “nút đầu danh sách” (list head node) Trường Infor nút không chứa liệu, trỏ HEAD trỏ tới nút đầu danh sách cho phép ta truy nhập vào danh sách Head A1 F Ngô Công Thắng A2 A3 A5 Bài giảng Cấu trúc liệu giải thuật - Chương 03 A1 3.17 Danh sách liên kết vòng (tiếp) l Ưu nhược điểm danh sách nối vòng: Ngô Công Thắng l Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.18 A3 Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.19 Danh sách liên kết vòng (tiếp) l Danh sách nối vòng làm cho việc truy nhập vào nút danh sách linh hoạt Ta truy nhập vào danh sách nút được, không thiết phải từ nút Nút nút trỏ F trỏ vào nút l Nhược điểm danh sách nối vòng xử lý không cẩn thận dẫn tới chu trình không kết thúc A2 Việc dùng thêm nút đầu danh sách làm cho danh sách có nút nên không rỗng Danh sách có nút HEAD có LINK(Head)= Head Head l Các phép toán bổ sung loại bỏ nút 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 liệu giải thuật - Chương 03 3.20 4.2 Các phép toán danh sách liên kết kép Danh sách liên kết kép 4.1 Giới thiệu l Danh sách liên kết kép (double linked list) danh sách mà nút có trỏ, trỏ tới nút đứng trước trỏ tới nút đứng sau l Cấu trúc nút sau: LPTR INFOR a) Chèn thêm nút vào danh sách l Chèn phần tử liệu X vào trước nút M danh sách liên kết kép L, R RPTR LPTR: Con trỏ trỏ tới nút đứng trước RPTR: Con trỏ trỏ tới nút đứng sau INFOR: Trường thông tin Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.21 Ngô Công Thắng LPTR nút cực trái RPTR nút cực phải có giá trị ∅ l Để truy nhập vào danh sách chiều ta phải dùng trỏ: Con trỏ L trỏ vào nút cực trái, trỏ R trỏ vào nút cực phải l Khi danh sách rỗng L = R = ∅ l L Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 C 3.22 Vào: L,R,M,X - Ra: Không có {Thủ tục bổ sung phần tử X vào trước nút M DSLK kép L, R} Procedure Insert(L,R,M,X) {Tạo nút mới} new ⇐ AVAIL IF new= ∅ then begin write(‘Hết nhớ’); return end; INFOR(new) := X LPTR(new):=RPTR(new):= ∅ - R B 3.23 4.2 Các phép toán danh sách liên kết kép 4.1 Giới thiệu (tiếp) A Bài giảng Cấu trúc liệu giải thuật - Chương 03 Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.24 b) Loại bỏ nút khỏi danh sách liên kết kép a) Chèn thêm nút vào danh sách {Trường hợp danh sách rỗng} If L=R=∅ then begin L:=R:=new ; Return end {M trỏ tới nút cực trái} If M=L then begin RPTR(new):= M LPTR(M):= new L:=new Return end Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 Cho danh sách liên kết kép L, R M trỏ trỏ tới nút danh sách cần loại bỏ - Vào: (L,R), M - Ra: Không có {Thủ tục loại bỏ nút trỏ M DSLK kép L, R} Procedure Delete(L, R, M) { Trường hợp danh sách rỗng } If L=R=∅ then begin Write(‘ danh sach rong ‘) Return end l 3.25 3.27 {Loại bỏ} Case L= R: Begin {Danh sach nút M} L:= ∅ R:= ∅ end M=L: Begin { Nút cực trái bị loại } L:=RPTR(L) LPTR(L):= ∅ end {Bổ sung vào DS trước M} RPTR(LPTR(M)):=new LPTR(new):=LPTR(M) LPTR(M):=new RPTR(new):=M {Kết thúc} Return Bài giảng Cấu trúc liệu giải thuật - Chương 03 Bài giảng Cấu trúc liệu giải thuật - Chương 03 b) Loại bỏ nút khỏi danh sách liên kết kép a) Chèn thêm nút vào danh sách Ngô Công Thắng Ngô Công Thắng 3.26 Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.28 5.2 Cài đặt Queue danh sách liên kết đơn b) Loại bỏ nút khỏi danh sách liên kết kép Cài đặt Queue danh sách liên kết đơn trỏ F F lối trước (F) l Khi loại bỏ phần tử khỏi Queue loại bỏ lối trước, F phải trỏ tới nút l Khi bổ sung phần tử vào Queue bổ sung lối sau, phải tìm đến nút cuối thêm nút vào sau nút cuối Thực phép toán tương tự danh sách liên kết đơn M=R: Begin { Nút cực phải bị loại } R:=LPTR(R) RPTR(R):= ∅ end ELSE RPTR(LPTR(M)):=RPTR(M) LPTR(RPTR(M)):=LPTR(M) End Case M ⇒ AVAIL; {Hủy nút M} {Kết thúc} Return Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 l 3.29 Ngô Công Thắng Cài đặt ngăn xếp hàng đợi danh sách liên kết đơn Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.31 Bài tập 5.1 Cài đặt stack danh sách lk đơn Dùng danh sách liên kết đơn trỏ F để cài đặt Stack F đỉnh Stack Các phép bổ sung loại bỏ thực đỉnh Stack, tức thực đầu danh sách Thực phép toán tương tự danh sách liên kết đơn Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.30 Thế danh sách nối vòng Nêu ưu nhược điểm Để khắc phục hạn chế danh sách nối vòng người ta làm Thế danh sách nối kép? Qui ước biểu diễn nút danh sách nối kép Nêu ưu nhược điểm danh sách nối kép Cài đặt Stack danh sach nối đơn Cần ý thực phép bổ sung, loại bỏ phần tử Cài đặt Queue danh sach nối đơn Cần ý thực phép bổ sung, loại bỏ phần tử Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.32