Chương 4
Danh sách
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 1
Nội dung
Ðịnh nghĩa danh sách.
Các tác vụ trên danh sách.
Danh sách đặc.
Danh sách liên kết.
Hàng.
Chồng.
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 2
Các định nghĩa
Đị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, …, an 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ừ ai
thì sẽ biết được vị trí của phần tử ai+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ả).
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 3
Các tác vụ trên danh sách
Khởi tạo danh sách rỗng.
Thêm một phần tử vào danh sách.
Loại bỏ một phần tử của danh sách.
Tìm kiếm một phần tử trong danh sách.
Sắp thứ tự một danh sách.
Kiểm tra danh sách là rỗng.
…
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 4
Danh 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
ai là vị trí của ai+1.
Định nghĩa kiểu
type tênmảng = array [min .. max] of kiểuthànhphần;
f Ví
dụ:
const nmax = 100;
type
list_type = record
info: array [1..nmax] of integer;
n: integer
end;
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 5
Danh sách đặc
a1
a2
a3
...
anmax
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 6
Danh sách đặc
Khởi
tạo danh sách rỗng
procedure List_Init (var List: list_type);
begin
List.n := 0;
end;
Lệnh gọi: List_Init (List);
a
1
n := 0
a2
a3
...
anmax
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 7
Danh sách đặc
Kiểm
tra danh sách đầy
function List_Full (List: list_type): boolean;
begin
List_Full := List.n = nmax;
end;
Lệnh gọi: full := List_Full (List);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 8
Danh sách đặc
Thêm một phần tử vào danh sách có thứ
tự tăng dần.
ai-1
x
ai
...
di chuyển xuống 1 vị trí
an
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 9
Danh 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
List.info[j+1] := List.info[j];
List.info[i] := x; List.n := List.n + 1
end;
Lệnh gọi:
if not List_Full (List) then List_Insert (List, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 10
Danh sách đặc
Loại bỏ một phần tử của danh sách có thứ
tự tăng dần.
ai
x
ai+1
...
di chuyển lên 1 vị trí
an
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 11
Danh sách đặc
procedure List_Delete
(var List: list_type; x: integer);
var i, j: integer; found: boolean;
begin
i := 1; found := false;
while (i <= List.n) and not found do
if List.info[i] < x then i := i + 1
else if List.info[i] = x then found := true
else i := List.n + 1;
if found then
begin
for j := i to n-1 do
List.info[j] := List.info[j+1];
List.n := List.n - 1
end
end;
Lệnh gọi: List_Delete (List, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 12
Danh sách đặc
Tìm kiếm một phần tử trong danh 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;
begin
i :=1; found := false;
while (i <= List.n) and not found do
if List.info[i] < x then i := i + 1
else if List.info[i] = x then found := true
else i := List.n + 1;
if found then List_Search := i
else List_Search := 0
end;
Lệnh gọi: location := List_Search (List, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 13
Danh sách đặc
Tìm kiếm một phần tử trong danh 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
begin k := (i + j) div 2;
if List.info[k] < x then i := k + 1
else if List.info[k] = x then found := true
else j := k - 1;
end;
if found then List_Search := k
else List_Search := 0
end;
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 14
Danh sách đặc
Ví dụ: Tìm x = 3 trong dãy số sau
1 3 4 5 8 9 10 15 17
Thực hiện:
1 2 3 4 5 6 7 8 9
1 3 4 5 8 9 10 15 17
i
k
j
1 3 4 5 8 9 10 15 17
i k
j
Kết quả: Tìm thấy a[2]
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 15
Danh sách đặc
Ví dụ: Tìm x = 6 trong dãy số sau
1 3 4 5 8 9 10 15 17
Thực hiện:
1 2 3 4 5 6 7 8 9
1 3 4 5 8 9 10 15 17
i
k
j
1 3 4 5 8 9 10 15 17
i k
j
1 3 4 5 8 9 10 15 17
ik j
1 3 4 5 8 9 10 15 17
ikj
1 3 4 5 8 9 10 15 17
j i
Kết quả: Không tìm thấy 6.
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 16
Danh 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 ai chứa địa chỉ của ai+1.
Định
nghĩa kiểu
f Ví
dụ:
ai
info
type lptr = ^list_item;
list_item = record
info: integer;
next: lptr
end;
Chương 4. Danh sách
2006
next
Nguyễn Trung Trực - Khoa CNTT 17
Danh sách liên kết
Head
a1
a2
…
an
nil
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 18
Danh sách liên kết
Khởi tạo danh sách rỗng
procedure List_Init (var Head: lptr);
begin
new (Head);
Head^.next := nil
end;
Lệnh gọi: List_Init (Head);
Head
nil
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 19
Danh sách liên kết
Thêm một phần tử vào danh sách có thứ
tự tăng dần.
Head
b
p
1
2
q
3
…
nil
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 20
Danh 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;
new(q); q^.info := x;
q^.next := p; b^.next := q
end;
Lệnh gọi: List_Insert (Head, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 21
Danh sách liên kết
Loại bỏ một phần tử của danh sách có thứ
tự tăng dần.
Head
b
p
1
2
3
…
nil
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 22
Danh 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
if p^.info < x then
begin b := p; p := p^.next end
else if p^.info = x then found := true
else p := nil;
if found then
begin b^.next := p^.next; dispose(p) end
end;
Lệnh gọi: List_Delete (Head, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 23
Danh sách liên kết
Tìm kiếm một phần tử trong danh sách có
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
else p := nil;
List_Search := p
end;
Lệnh gọi: location := List_Search (Head, x);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 24
Danh sách liên kết
Kiểm tra danh sách rỗng
function List_Empty (Head: lptr): boolean;
begin
List_empty := Head^.next = nil
end;
Lệnh gọi: empty := List_Empty (Head);
Chương 4. Danh sách
2006
Nguyễn Trung Trực - Khoa CNTT 25