bài giảng chi tiết và đầy đủ nhất cấu trúc dữ liệu và giải thuật giúp bạn làm quen cũng như thành thạo khả năng giải quyết các vấn đề về giải thuật trong thời gian nhanh nhất. bài giảng với những ngôn từ dễ hiểu được sắp xếp một cách logic để bạn có thể tiếp thu nhanh nhất.
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: fita.hua.edu.vn/ncthang Email: ncthang@hua.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 Ngô Công Thắng 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 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 X ⇐ AVAIL phép lấy nút trống có địa X (cấp phát nút) X ⇒ AVAIL phép thu hồi nút có địa X Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.7 2.1 Quy tắc tổ chức 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 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 = ∅ 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 có F trỏ trỏ tới nút đầu tiên, M trỏ trỏ tới nút danh sách Viết thủ tục bổ sung nút vào sau nút M Thủ tục bổ sung vào sau nút trỏ M nút new mà trường INFOR chứa giá trị X có bước sau: l F 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 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 A5 ∅ 3.6 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) 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: Procedure INSERT(F,M,X) {Tạo nút mới} new ⇐ AVAIL INFOR(new):=X; LINK(new):= ∅; {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 Ngô Công Thắng 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 (tiếp) {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 3.9 2.2 Một số phép toán danh sách liên kết đơn (tiếp) 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.11 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 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) b) Loại bỏ nút khỏi danh sách Cho danh sách trỏ 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 {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 Ngô Công Thắng {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 3.10 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) Danh sách liên kết vòng c) Ghép hai danh sách liên kết đơn 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 {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 A1 F Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.13 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 3.15 Ưu điểm nhược danh sách liên kết Danh sách liên kết vòng (tiếp) 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 l Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.14 Ưu nhược điểm danh sách nối vòng: 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 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 (tiếp) l Danh sách liên kết kép Để 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 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 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.17 Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 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 có nút nên không rỗng Danh sách có nút HEAD có LINK(Head)= Head 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 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.19 4.1 Giới thiệu (tiếp) Head l 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 Head A1 INFOR 3.18 L R A Ngô Công Thắng B Bài giảng Cấu trúc liệu giải thuật - Chương 03 C 3.20 4.2 Các phép toán danh sách liên kết kép a) Chèn thêm nút vào danh sách a) Chèn thêm nút vào danh sách l Cho trỏ L, R trỏ tới nút cực trái nút cực phải danh sách liên kết kép, M trỏ trỏ tới nút danh sách, X phần tử liệu cần chèn vào trước nút M {Bổ sung vào DS trước M} LPTR(new):=LPTR(M) RPTR(new):=M LPTR(M):=new RPTR(LPTR(new)):=new {Kết thúc} Return Procedure Insert(L,R,M,X) {Tạo nút mới} new ⇐ AVAIL INFOR(new) := X LPTR(new):=RPTR(new):= ∅ IF new= ∅ then begin write(‘Danh sach tran’); 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.21 Ngô Công Thắng {Trường hợp danh sách rỗng} If L=R=∅ then begin L:=new ; 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 Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.23 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 Bài giảng Cấu trúc liệu giải thuật - Chương 03 l Cho trỏ L, R trỏ tới nút cực trái nút cực phải danh sách liên kết kép, M trỏ trỏ tới nút danh sách cần loại bỏ Thuật giải gồm bước sau: 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 3.22 Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.24 Cài đặt ngăn xếp hàng đợi 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 {Loại bỏ} Case L= R: Begin {Danh sach chi co nút M trỏ tới} L:= ∅ R:= ∅ end M=L: Begin { Nút cực trái bị loại } L:=RPTR(L) LPTR(L):= ∅ end Ngô Công Thắng Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.25 Bài giảng Cấu trúc liệu giải thuật - Chương 03 3.27 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 {Kết thúc} Return Bài giảng Cấu trúc liệu giải thuật - Chương 03 Ngô Công Thắng 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 Ngô Công Thắng 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 l 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 Bài tập 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.29