Tải bản đầy đủ (.pdf) (46 trang)

cấu trúc dữ liệu Chương 4

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (430.76 KB, 46 trang )

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


×