tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ
Trang 1Chương 4
Danh sách
Trang 3Các định nghĩa
f Danh sách (list) là một tập hợp rỗng hoặc gồm nhiều phần tử a1, a2, …, a n mà tính chất cấu trúc của nó là mối liên hệ tương đối giữa các phần tử với nhau: biết được phần từ a i thì sẽ biết được vị trí của phần tử a i+1.
f Chiều dài (length) của danh sách là số lượng
phần tử của danh sách.
f Danh sách rỗng (empty list) là danh sách có
chiều dài bằng 0 (không có phần tử nào cả).
Trang 4Các tác vụ trên danh sách
Trang 5Danh sách đặc
Định nghĩa
f Danh sách đặc (condensed list) là một danh
sách mà các phần tử được sắp xếp kế tiếp nhau trong bộ nhớ: đứng ngay sau vị trí của
Trang 7Danh sách đặc
Khởi tạo danh sách rỗng
procedure List_Init ( var List: list_type);
Trang 8Danh sách đặc
Kiểm tra danh sách đầy
function List_Full (List: list_type): boolean;
Trang 10Danh sách đặc
procedure List_Insert
( var List: list_type; x: integer);
var i, j: integer; cont: boolean;
begin
i := 1; cont := true;
while (i <= List.n) and cont do
if List.info[i] < x then i := i + 1
else cont := false;
for j := List.n downto i do
Trang 12Danh sách đặc
procedure List_Delete
( var List: list_type; x: integer);
var i, j: integer; found: boolean;
Trang 13Danh sách đặc
thứ tự tăng dần: tìm kiếm tuần tự.
function List_Search
(List: list_type; x: integer): integer;
var i: integer; found: boolean;
Trang 14Danh sách đặc
thứ tự tăng dần: tìm kiếm nhị phân.
function List_Search
(List: list_type; x: integer): integer;
var i, j, k: integer; found: boolean;
begin
i :=1; j := List.n; found := false;
while (i <= j) and not found do
Trang 17Danh sách liên kết
Định nghĩa
f Danh sách liên kết (linked list) là một danh
sách mà các phần tử được nối kết với nhau nhờ vào các vùng liên kết của chúng: vùng liên kết của a i chứa địa chỉ của a i+1.
Trang 19Danh sách liên kết
procedure List_Init ( var Head: lptr);
Trang 21Danh sách liên kết
procedure List_Insert (Head: lptr; x: integer);
var b, p, q: lptr; cont: boolean;
begin
b := Head; p := b^.next; cont := true;
while (p <> nil) and cont do
if p^.info < x then
begin
b := p; p := p^.next
end else cont := false;
Trang 22b p
Trang 23Danh sách liên kết
procedure List_Delete (Head: lptr; x: integer);
var b, p: lptr; found: boolean;
begin
b := Head; p := b^.next; found := false;
while (p <> nil) and not found do
Trang 24Danh sách liên kết
thứ tự tăng dần.
function List_Search (Head: lptr; x: integer): ptr;
var p: lptr; found: boolean;
begin
p := Head^.next; found := false;
while (p <> nil) and not found do
if p^.info < x then p := p^.next
else if p^.info = x then found := true
Trang 25Danh sách liên kết
function List_Empty (Head: lptr): boolean;
Trang 26Danh sách liên kết kép
f Danh sách liên kết kép (doubly linked list) là
một danh sách liên kết mà mỗi phần tử có hai vùng liên kết: một vùng liên kết chỉ đến phần
tử đứng ngay trước nó (được gọi là liên kết ngược) và một vùng liên kết chỉ đế phần tử đứng ngay sau nó (được gọi là liên kết thuận).
next
a i previous info
Trang 27Danh sách liên kết kép vòng
Head
Trang 29Danh sách liên kết kép vòng
procedure Dlist_Init ( var Head: dlptr);
Trang 30Danh sách liên kết kép vòng
function Dlist_Empty (Head: dlptr): boolean;
Trang 315
q p
b
Trang 32Danh sách liên kết kép vòng
procedure Dlist_Insert (Head: dlptr; x: integer);
var b, p, q: dlptr; cont: boolean;
begin
p := Head^.next; cont := true;
while (p <> Head) and cont do
Trang 33a
Trang 34Danh sách liên kết kép vòng
procedure Dlist_Delete (Head: dlptr; x: integer);
var b, p, q: dlptr; found: boolean;
begin
p := Head^.next; found := true;
while (p <> Head) and cont do
if p^.info < x then p := p^.next
else if p^.info = x then found := true
Trang 35f Hàng còn được gọi là danh sách FIFO
(First-In First-Out): vào trước ra trước.
Trang 36front, rear: qptr
end ;
Trang 39new(p); p^.info := x, p^.next := nil;
if Queue.rear = nil then Queue.front := p
Trang 41f Chồng (stack) là một danh sách mà cả hai
phép thêm vào và phép loại bỏ đều được thực hiện ở cùng một đầu.
f Chồng còn được gọi là danh sách LIFO
(Last-In First-Out) hoặc pushdown list: vào sau ra
trước.
Trang 45p
Trang 46p