You are on page 1of 46

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 next
type lptr = ^list_item;
list_item = record
info: integer;
next: lptr
end;
Chương 4. Danh sách 2006 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
1
q
2
p
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
1
p
2

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


Danh sách liên kết kép
™ Định nghĩa
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).

ai previous info next

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 26


Danh sách liên kết kép vòng

Head

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 27


Danh sách liên kết kép vòng
™ Định nghĩa kiểu
f Vídụ:
type dlptr = ^dlist_item;
dlist_item = record
info: integer;
previous, next: dlptr
end;

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 28


Danh sách liên kết kép vòng
™ Khởi tạo danh sách rỗng
procedure Dlist_Init (var Head: dlptr);
begin
new (Head);
Head
Head^.next := Head;
Head^.previous := Head
end;
Lệnh gọi: Dlist_Init (Head);

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 29


Danh sách liên kết kép vòng
™ Kiểm tra danh sách rỗng
function Dlist_Empty (Head: dlptr): boolean;
begin
Dlist_Empty := Head^.next = Head
end;
Lệnh gọi: empty := Dlist_Empty (Head);

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 30


Danh sách liên kết kép vòng
™ Thêm một phần tử vào danh sách có thứ
tự tăng dần.

Head

b 1
2 q
p 3

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 31


Danh 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
if p^.info < x then
p := p^.next
else cont := false;
new(q); q^.info := x;
b := p^.previous;
q^.next := p; b^.next := q;
p^.previous := q; q^.previous := b
end;
Lệnh gọi: Dlist_Insert (Head, x);
Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 32
Danh sách liên kết kép vòng
™ Loại bỏ một phần tử của danh sách có thứ
tự tăng dần.
Head

b
1
p
3
a
4

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 33


Danh 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
else p := Head;
if found then
begin
b := p^.previous; a := p^.next;
b^.next := a; a^.previous := b; dispose(p)
end
end;
Lệnh gọi: Dlist_Delete (Head, x);
Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 34
Hàng
™ Định nghĩa
f Hàng (queue) là một danh sách mà phép
thêm vào được thực hiện ở đầu này và phép
loại bỏ được thực hiện ở đầu kia.
f Hàng còn được gọi là danh sách FIFO (First-
In First-Out): vào trước ra trước.

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 35


Hàng
™ Định nghĩa kiểu
f Ví
dụ:
type qptr = ^queue_item;
queue_item = record
info: integer;
next: qptr
end;
queue_type = record
front, rear: qptr
end;

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 36


Hàng
™ Khởi tạo hàng rỗng
procedure Queue_Init (var Queue: queue_type);
begin
Queue.front = nil; Queue.rear := nil
end;
Lệnh gọi: Queue_Init (Queue);

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 37


Hàng
™ Kiểm tra hàng rỗng
function Queue_Empty
(Queue: queue_type): boolean;
begin
Queue_Empty := Queue.front = nil;
end;
Lệnh gọi: empty := Queue_Empty (Queue);

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 38


Hàng
™ Thêm một phần tử vào hàng
procedure Queue_Insert
(var Queue: queue_type; x: integer);
var p: qptr;
begin
new(p); p^.info := x, p^.next := nil;
if Queue.rear = nil then Queue.front := p
else Queue.rear^.next := p;
Queue.rear := p
end;
Lệnh gọi: Queue_Insert (Queue, x);
Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 39
Hàng
™ Loại bỏ một phần tử của hàng
procedure Queue_Delete
(var Queue: queue_type; var x: integer);
var p: qptr;
begin
p := Queue.front;
Queue.front := p^.next;
x := p^.info;
if Queue.front = nil then Queue.rear := nil;
dispose(p)
end;
Lệnh gọi: Queue_Delete (Queue, x);
Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 40
Chồng
™ Định nghĩa
f 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.

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 41


Chồng
™ Định nghĩa kiểu
f Ví
dụ:
type sptr = ^stack_item;
stack_item = record
info: integer;
next: qptr
end;

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 42


Chồng
™ Khởi tạo chồng rỗng
procedure Stack_Init (var sp: sptr);
begin
sp := nil;
end;
Lệnh gọi: Stack_Init (Stack);

Stack

nil

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 43


Chồng
™ Kiểm tra chồng rỗng
function Stack_Empty (sp: sptr): boolean;
begin
Stack_Empty := sp = nil;
end;
Lệnh gọi: empty := Stack_Empty (Stack);

Stack

nil

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 44


Chồng
™ Thêm một phần tử vào chồng
procedure Stack_Push
(var sp: sptr; x: integer); p
x
var p: sptr;
begin
Stack
new(p); p^.info := x;
p^.next := sp;

sp := p
end;
Lệnh gọi: Stack_Push (Stack, x);
nil

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 45


Chồng
™ Lấy một phần tử của chồng
procedure Stack_Pop
(var sp: sptr; var x: integer); p
x
var p: sptr; Stack
begin
p := sp;
sp := p^.next;

x := p^.info;
dispose(p)
end;
nil
Lệnh gọi: Stack_Pop (Stack, x);

Chương 4. Danh sách 2006 Nguyễn Trung Trực - Khoa CNTT 46

You might also like