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

Bài giảng cấu trúc dữ liệu thuật toán chương 3 nguyễn đức nghĩa

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 (5.98 MB, 130 trang )

Ch

ng 3

CÁC C U TRÚC D

LI U C

B N

(Basic Data Structures)
Structures)

CTDL&TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

N i dung
3.1. Các khái ni m
3.2. M ng
3.3. Danh sách
3.4. Ng n x p
3.5. Hàng đ i

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-2



Ch

ng 3. Các c u trúc d li u c b n

3.1. Các khái ni m
3.2. M ng
3.3. Danh sách
3.4. Ng n x p
3.5. Hàng đ i

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-3

Ki u d li u (Data types)

• Ki u d li u (data type) đ

c đ c tr ng b i:

t p các giá tr (a set of values)
cách bi u di n d li u (data representation) đ c s
d ng chung cho t t c các giá tr này và
t p các phép toán (set of operations) có th th c hi n
trên t t c các giá tr

CTDL & TT – NGUY N


C NGH A – B môn KHMT – HBK Hà n i

4


Các ki u d li u d ng s n
(Built--in data types)
(Built

• Trong các ngôn ng l p trình th ng có m t s ki u
d li u nguyên thu đã đ c xây d ng s n. Ví d
Ki u s nguyên (Integer numeric types)
• byte, char, short, int, long
Ki u s th c d u ph y đ ng (floating point numeric types)
• float, double
Các ki u nguyên thu khác (Other primitive types)
• boolean
Ki u m ng (Array type)
• m ng các ph n t cùng ki u

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

BGA

D li u đ i v i ki u nguyên thu
Trong ngôn ng l p trình C

Type


Bits

Minimum value

Maximum value

byte

8

-128

127

short

16

-32768

32767

char

16

0

65535


int

32

-2147483648 = -231

2147483647 = 231-1

long

64

-9223372036854775808

9223372036854775807

float

32

  1.40  10 45

  3.40  1038

double

64

  4.94  10324


  1.80  10308

Có th có ki u boolean v i hai giá tr true ho c false
6


Phép toán đ i v i ki u d li u nguyên thu




i v i ki u: byte, char, short, int, long
+, - , *, /, %, đ i thành xâu, ...
i v i ki u: float, double
+, -, *, /, round, ceil, floor, ...
i v i ki u: boolean
ki m giá tr true, hay ki m giá tr false

• Nh n th y r ng: Các ngôn ng l p trình khác nhau
có th s d ng mô t ki u d li u khác nhau.
Ch ng h n, PASCAL và C có nh ng mô t các d
li u s khác nhau.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Ki u d li u tr u t

BGA


ng

(Abstract Data Types)

• Ki u d li u tr u t
g m:

ng (Abstract Data Type -ADT) bao

t p các giá tr (set of values) và
t p các phép toán (set of operations) có th th c hi n v i t t c
các giá tr này

• Ph n nào c a ki u d li u (Data Type) đã b b qua trong
ADT ?
cách bi u di n d li u (data representation) đ
chung cho t t c các giá tr này

c s

d ng

• Vi c làm này có ý ngh a làm tr u t ng hoá khái ni m ki u
d li u. ADT không còn ph thu c vào cài đ t, không ph
thu c ngôn ng l p trình.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


8


Ki u d li u tr u t

ng

(Abstract Data Type - ADT)

• Ví d :
ADT

i t ng
(Object)

Phép toán
(Operations)

Danh sách (List)

các nút

chèn, xoá, tìm,...

đ nh, c nh

duy t, đ

Integer


-∞...,-1, 0, 1,... +∞

+, -, *, v.v...

Real

-∞, ...., +∞

+, -, *, v.v...

Ng n x p

các ph n t

pop, push,
isEmpty,...

Hàng đ i

Các ph n t

enqueue,
dequeue,...

Cây nh phân

các nút

traversal, find,...


th (Graphs)

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Ki u d li u tr u t

ng đi, ...

Chap02-9

ng

(Abstract Data Type - ADT)



i u d hi u là các ki u d li u nguyên thu mà các ngôn
ng l p trình cài đ t s n c ng đ c coi là thu c vào ki u d
li u tr u t ng. Trên th c t chúng là cài đ t c a ki u d
li u tr u t ng trên ngôn ng l p trình c th .



nh ngh a. Ta g i vi c cài đ t (implementation) m t
ADT là vi c di n t b i các câu l nh c a m t ngôn ng l p
trình đ mô t các bi n trong ADT và các th t c trong
ngôn ng l p trình đ th c hi n các phép toán c a ADT,
ho c trong các ngôn ng h ng đ i t ng, là các l p

(class) bao g m c d li u (data) và các ph ng th c x lý
(methods).

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-10


Ki u d

li u - Ki u d

li u tr u t

ng và C u trúc d

li u

(Data Types, Data Structures and Abstract Data Types)

• Có th nói nh ng thu t ng : ki u d li u, ki u d li u tr u
t ng và c u trúc d li u nghe r t gi ng nhau, nh ng th c
ra chúng có ý ngh a khác nhau.
Trong ngôn ng l p trình, ki u d li u c a bi n là t p các giá
tr mà bi n này có th nh n. Ví d , bi n ki u boolean ch có
th nh n giá tr đúng ho c sai. Các ki u d li u c b n có th
thay đ i t ngôn ng l p trình này sang NNLT khác. Ta có
th t o nh ng ki u d li u ph c h p t nh ng ki u d li u c

b n. Cách t o c ng ph thu c vào ngôn ng l p trình.
Ki u d li u tr u t ng là mô hình toán h c cùng v i nh ng
phép toán xác đ nh trên mô hình này. Nó là không ph thu c
vào ngôn ng l p trình.
bi u di n mô hình toán h c trong ADT ta s d ng c u
trúc d li u.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-11

C u trúc d li u
(Data Structures)

• C u trúc d li u (Data Structures) là m t h các bi n, có
th có ki u d li u khác nhau, đ c liên k t l i theo m t
cách th c nào đó.
• Vi c cài đ t ADT đòi h i l a ch n c u trúc d li u đ bi u
di n ADT.
• Ta s xét xem vi c làm đó đ c ti n hành nh th nào?
• Ô (cell) là đ n v c s c u thành c u trúc d li u. Có th
hình dung ô nh là cái h p đ ng giá tr phát sinh t m t
ki u d li u c b n hay ph c h p.
• C u trúc d li u đ c t o nh đ t tên cho m t nhóm các ô
và đ t giá tr cho m t s ô đ mô t s liên k t gi a các ô.
• Ta xét m t s cách t o nhóm.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Chap02-12


C u trúc d li u
(Data Structures)

• M t trong nh ng cách t o nhóm đ n gi n nh t trong các
ngôn ng l p trình đó là m ng (array). M ng là m t dãy
các ô có cùng ki u xác đ nh nào đó.
• Ví d : Khai báo trong PASCAL (C) sau đây
PASCAL

C

name: array[1..10] of integer;

int name[10]

khai báo bi n name g m 10 ph n t ki u c s nguyên
(integer).
• Có th truy xu t đ n ph n t c a m ng nh ch ra tên m ng
cùng v i ch s c a nó.
• Ta s xét k h n ki u m ng trong m c ti p theo.

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-13


C u trúc d li u
(Data Structures)







M t ph ng pháp chung n a hay dùng đ nhóm các ô là c u trúc b n
ghi (record structure).
B n ghi (record) là ô đ c t o b i m t h các ô (g i là các tr ng) có
th có ki u r t khác nhau.
Các b n ghi l i th ng đ c nhóm l i thành m ng; ki u đ c xác đ nh
b i vi c nhóm các tr ng c a b n ghi tr thành ki u c a ph n t c a
m ng.
Ví d : Trong PASCAL/C mô t

PASCAL

C

var
reclist: array[1..100] of record
data: real;
next: integer;
end;

struct record {

float data;
int next; } reclist[100];

khai báo reclist là m ng 100 ph n t , m i ô là m t b n ghi g m 2
tr ng: data và next.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-14


C u trúc d li u
(Data Structures)

• Ph ng pháp th ba đ nhóm các ô là file. File, c ng gi ng
nh m ng m t chi u, là m t dãy các giá tr cùng ki u nào
đó.
• Tuy nhiên, các ph n t trong file ch có th truy xu t đ c
m t cách tu n t , theo th t mà chúng xu t hi n trong file.
• Trái l i, m ng và b n ghi là các c u trúc tr c truy
("random-access"), ngh a là th i gian đ truy xu t đ n các
thành ph n c a m ng (hay b n ghi) là không ph thu c vào
ch s m ng (hay tr ng đ c l a ch n).
• Bên c nh đó c n nh n m nh m t u đi m c a ki u file là s
ph n t c a nó là không b gi i h n!

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Chap02-15

C u trúc d li u
(Data Structures)

• Khi l a ch n c u trúc d li u cài đ t ADT m t v n đ c n
đ c quan tâm là th i gian th c hi n các phép toán đ i v i
ADT s nh th nào. B i vì, các cách cài đ t khác nhau có
th d n đ n th i gian th c hi n phép toán khác nhau.
• Ví d : Xét cài đ t ADT t đi n (Dictionary ADT)
• ADT t đi n bao g m:
C n l u tr t p các c p <key, value> , đ tìm ki m value theo
key. M i key có không quá m t value.
Các phép toán c b n:
• insert(k,v) : chèn c p (k,v) vào t đi n
• find(k): N u (k,v) có trong t đi n thì tr l i v, trái l i tr v 0;
• remove(k) : Xoá b c p (k,v) trong t đi n

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-16


C u trúc d li u
(Data Structures)

• Xét ba ph


ng pháp cài đ t t đi n:

Danh sách móc n i (Linked list);
M ng s p x p (Sorted array);
Cây tìm ki m (Search tree).

• B ng d i đây cho đánh giá th i gian c a vi c th c hi n
các phép toán:
Cài đ t

Insert

Find

Remove

Linked List

O(n)

O(n)

O(n)

Sorted Array

O(n)

O(log n)


O(n)

Search Tree

O(log n)

O(log n)

O(log n)

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-17

Con tr
(Pointer)



M t trong nh ng u th c a ph ng pháp nhóm các ô trong các NNLT
là ta có th bi u di n m i quan h gi a các ô nh s d ng con tr .



nh ngh a. Con tr (pointer) là ô mà giá tr c a nó ch ra m t ô khác.




Khi v các c u trúc d li u, đ th hi n ô A là con tr đ n ô B, ta s s
d ng m i tên h ng t A đ n B.

A


B

Ví d :
t o bi n con tr ptr đ tr đ n ô có ki u cho tr
h n celltype, ta có th khai báo:
Trong PASCAL

Trong C

var

celltype *ptr

c, ch ng

ptr: ^celltype;
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-18



Phân lo i các c u trúc d li u
• Trong nhi u tài li u v CTDL th
phân lo i c u trúc d li u sau đây:

ng s

d ng

C u trúc d li u c s (Base data structures).
Ví d : trong Pascal: integer, char, real, boolean, ...;
trong C: int, char, float, double,...
C u trúc d li u tuy n tính (Linear data structures).
Ví d : M ng (Array), Danh sách liên k t (Linked list),
Ng n x p (Stack), Hàng đ i (Queue),
C u trúc d li u phi tuy n (Nonlinear data structures).
Ví d : Cây (trees), đ th (graphs), b ng b m (hash
tables),...
CTDL & TT – NGUY N

Ch

C NGH A – B môn KHMT – HBK Hà n i

Chap03-19

ng 3. Các c u trúc d li u c b n

3.1. Các khái ni m
3.2. M ng
3.3. Danh sách

3.4. Ng n x p
3.5. Hàng đ i

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-20


3.2. M ng
3.2.1. Ki u d li u tr u t

ng m ng

3.2.2. Phân b b nh cho m ng
3.2.3. Các thao tác v i m ng

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Ki u d li u tr u t

Chap03-21

ng m ng

(ADT Array )


• M ng đ c đ nh ngh a nh ki u d li u tr u t ng nh sau:

i t ng (object): t p các c p <index, value> trong đó v i
m i giá tr c a index có m t giá tr t t p item. Index là t p có
th t m t chi u hay nhi u chi u, ch ng h n, {0, … , n-1} đ i
v i m t chi u, {(0,0), (0,1), (0,2), (1,0), (1,1), (1,2), (2,0),
(2,1), (2,2)} đ i v i 2 chi u, v.v.
• Các hàm (Functions):
V i m i A  Array, i  index, x  item, j, size  integer
Kh i t o m ng:
Array Create(j, list) ::= tr l i m ng j chi u, trong đó list là
b j thành ph n v i thành ph n th i là kích th c c a chi u
th i. Item không đ c đ nh ngh a.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Ki u d li u tr u t

ng m ng (ADT Array )

• Truy xu t ph n t : Item Retrieve(A, i)
if (i  index) return item t ng ng v i giá tr
else return error

ch s i trong m ng A

• C t gi ph n t : Array Store(A, i, x)
if (i in index) return m ng gi ng h t m ng A ngo i tr

c p m i <i, x> đ c chèn vào
else return error
• Ta xét vi c cài đ t m ng trong các ngôn ng l p trình. Ta
h n ch
vi c xét m ng m t chi u và hai chi u
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

C u trúc d li u m ng
(Array data structures)

• M ng (array) là dãy các thành ph n đ

c đánh ch s .

Thông th ng m ng chi m gi m t dãy t máy liên ti p
trong b nh (cách l u tr này đ c g i là l u tr k ti p)
dài c a m ng đ c xác đ nh khi kh i t o và không th
thay đ i.
M i thành ph n c a m ng có m t ch s c đ nh duy nh t
• Ch s nh n giá tr trong kho ng t m t c n d i đ n m t
c n trên nào đó
M i thành ph n c a m ng đ c truy xu t nh s d ng ch s
c a nó
• Phép toán này đ c th c hi n m t cách hi u qu : v i th i
gian (1)
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Chap02-24


M ng trong các ngôn ng l p trình
• Các ch s có th là s nguyên (C, Java) ho c là các
giá tr ki u r i r c (Pascal, Ada)
• C nd
b i ng

i là 0 (C, Java), 1 (Fortran), ho c tu ch n
i l p trình (Pascal, Ada)

• Trong h u h t các ngôn ng , m ng là thu n nh t
(ngh a là t t c các ph n t c a m ng có cùng m t
ki u); trong m t s ngôn ng (nh Lisp, Prolog) các
thành ph n có th là không thu n nh t (có các ki u
khác nhau)
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

25

M ng trong các ngôn ng l p trình
• Chú ý: Có ngôn ng (nh PASCAL) th c hi n ki m tra l i
v t m ng (truy xu t đ n thành ph n v i ch s không
trong ph m vi t c n d i đ n c n trên) và ch m d t th c
hi n ch ng trình n u x y ra l i này. Nh ng nhi u ngôn
ng khác (C, C++, JAVA) l i không th c hi n đi u này.

Trong tr ng h p x y ra l i v t m ng, ch ng trình có
th ti p t c ch y, c ng có th b d ng, tu thu c vào thao
tác truy xu t trong tình hu ng c th . N u ch ng trình
không d ng thì s r t khó phát hi n l i!

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

26


Khai báo m ng m t chi u trong PASCAL/C
PASCAL

C

<tên bi n>:
array[ch _s ] of ki u_thành_ph n;

<ki u thành ph n> <tên bi n>[size]

Ví d : list: array[0..4] of integer

Ví d : int list[5];

Khai báo trên s khai báo bi n m ng tên name v i 5 ph n t
có ki u là s nguyên (2 byte).
a ch c a các ph n t trong m ng m t chi u
list[0]

đ a ch g c = 
list[1]
 + sizeof(int)
list[2]
 + 2*sizeof(int)
list[3]
 + 3*sizeof(int)
list[4]
 + 4*size(int)
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-27

Ví d :
• Ch ng trình trên C sau đây đ a ra đ a ch c a các ph n t
c a m ng m t chi u trên C:
K t qu ch y trong DEVC
(sizeof(int)=4)
#include <stdio.h>
#include <conio.h>
int main()
{ int one[] = {0, 1, 2, 3, 4};
int *ptr; int rows=5;
/* in đ a ch c a m ng m t chi u nh dùng con tr
int i; ptr= one;
printf("Address Contents\n");
for (i=0; i < rows; i++)
printf("%8u%5d\n", ptr+i, *(ptr+i));

printf("\n");
getch();
}

CTDL & TT – NGUY N

*/

C NGH A – B môn KHMT – HBK Hà n i

K t qu ch y trong TC:
(sizeof(int)=2)
Address Contents
65516
0
65518
1
65520
2
65522
3
65524
4
Chap03-28


M ng hai chi u
• Khai báo m ng hai chi u trong C:
<element-type> <arrayName> [size 1][size2];
Ví d :

double table[5] [4];
Truy xu t đ n ph n t c a m ng: table[2] [4];

• Khai báo m ng hai chi u trong PASCAL:
<arrayName> : array [ch _s 1][ch _s 2] of <ki u_ph n_t >;
Ví d :
table: array[0..4] [0..5] of real;
Truy xu t đ n ph n t c a m ng: table[2] [4];

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-29

Phân b b nh cho m ng hai chi u
• Xét khai báo
int a [4] [3];
• Thông th

ng có th coi nó nh m t b ng.

dòng 0

a[0,0]

a[0,1]

a[0,2]


dòng 1
dòng 2
dòng 3

a[1,0]

a[1,1]

a[1,2]

a[2,0]

a[2,1]

a[2,2]

a[3,0]

a[3,1]

a[3,2]

c t0

c t1

c t2

CTDL & TT – NGUY N


C NGH A – B môn KHMT – HBK Hà n i

Chap03-30


Phân b b nh cho m ng hai chi u
• Trong b nh (ch có m t chi u) các hàng c a m ng hai chi u
đ c s p x p k ti p nhau theo m t trong hai cách sau:
H t dòng này đ n dòng khác: th t s p x p này đ
là th t u tiên dòng - row major order).

cg i

• Ví d : PASCAL và C s d ng cách s p x p này.
theo chi u t ng d n c a đ a ch b nh

a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

dòng 0
CTDL & TT – NGUY N

dòng 1

dòng 2

dòng 3

C NGH A – B môn KHMT – HBK Hà n i

Chap03-31


Phân b b nh cho m ng hai chi u
• H t c t này đ n c t khác: Th t s p x p này g i là th
t u tiên c t (column major order).
Ví d FORTRAN, MATLAB s d ng cách s p x p này.
theo chi u t ng d n c a đ a ch b nh

a[0][0] a[1][0] a[2][0] a[3][0]

c t0

CTDL & TT – NGUY N

c t1

C NGH A – B môn KHMT – HBK Hà n i

c t2

Chap03-32


Phân b b nh cho m ng hai chi u
• Chú ý: N u bi t đ a ch c a ph n t đ u tiên c a m ng, ta d
dàng tính đ c đ a ch c a ph n t tu ý trong m ng.
• Ví d : Xét cách phân b b nh cho bi n m ng khai báo b i
int a[4] [3];
theo th t u tiên dòng:
theo chi u t ng d n c a đ a ch b nh


a[0][0]

a[0][1]

dòng 0
CTDL & TT – NGUY N

a[0][2]

a[1][0]

a[1][1]

a[1][2]

dòng 1

a[2][0]

a[2][1]

a[2][2]

a[3][0]

dòng 2

C NGH A – B môn KHMT – HBK Hà n i

a[3][1]


a[3][2]

dòng 3
Chap03-33

Phân b b nh cho m ng hai chi u


a ch c a các ph n t trong
m ng hai chi u:
int a[4][3]
a[0][0]
có đ a ch là 
a[0][1]
 + sizeof(int)
a[0][2]
 + 2*sizeof(int)
a[1][0]
 + 3*sizeof(int)
a[1][1]
 + 4*sizeof(int)
a[1][2]
 + 5*sizeof(int)
a[2][0]
 + 6*sizeof(int)
...

CTDL & TT – NGUY N


• T ng quát: Xét khai báo
int a[m][n]
• Gi s : đ a ch c a ph n t
đ u tiên c a m ng (a[0][0]) là
.
• Khi đó đ a ch c a a[i][j] s là
 + (i*n + j)*sizeof(int)

C NGH A – B môn KHMT – HBK Hà n i

Chap03-34


Các thao tác v i m ng

CTDL&TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chèn ph n t vào m ng
(Inserting an element into an array)

• Gi s ta mu n chèn 8 vào m t m ng đ
dãy v n là đ c s p x p

c s p x p (và đ m b o

1 3 3 7 12 14 17 19 22 30
• Ta có th th c hi n đi u này nh vi c chuy n d ch sang ph i m t
ô t t c các ph n t đ ng sau v trí đánh d u

T t nhiên, ta ph i lo i b 30 khi th c hi n đi u này

1

3

3

7

8

12 14 17 19 22

• Vi c d ch chuy n t t c các ph n t là m t thao tác ch m
(đòi h i th i gian tuy n tính đ i v i kích th

c m ng)

36


Xoá b m t ph n t
(Deleting an element from an array)

• Vi c xoá b (Deleting) m t ph n t đ c th c hi n t
t , ta ph i d ch sang trái t t c các ph n t sau nó
1

3


3

7

1

3

3

7

8

ng

12 14 17 19 22

12 14 17 19 22

?

• Phép toán xoá là phép toán ch m; vi c th c hi n th ng xuyên
thao tác này là đi u không mong mu n.
• Phép xoá s làm xu t hi n m t v trí t do cu i m ng
Chúng ta đánh d u nó là t do b ng cách nào?
• Ta c n gi s l

ng ph n t đ


c c t gi trong m ng
37

Ch

ng 3. Các c u trúc d li u c b n

3.1. Các khái ni m
3.2. M ng
3.3. Danh sách
3.4. Ng n x p
3.5. Hàng đ i

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap02-38


3.3. Danh sách
3.3.1. Danh sách tuy n tính
3.3.2. Cài đ t danh sách tuy n tính
Bi u di n d i d ng m ng
Danh sách móc n i
Danh sách n i đôi
3.3.3. Các ví d ng d ng
3.3.4. Phân tích s d ng linked list
3.3.5. M t s bi n th c a danh sách móc n i


CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-39

Danh sách tuy n tính


nh ngh a
Danh sách tuy n tính (Linear List) dãy g m 0 ho c nhi u h n
các ph n t cùng ki u cho tr c: (a1,a2,…,an), n ≥ 0.
ai là ph n t c a danh sách.
a1 là ph n t đ u tiên và an là ph n t cu i cùng.
n là đ dài c a danh sách.
Khi n = 0, ta có danh sách r ng (empty list).
Các ph n t đ c s p th t tuy n tính theo v trí c a chúng
trong danh sách. Ta nói ai đi tr c ai+1, ai+1 đi sau ai và ai
v trí i.

• Ví d
Danh sách các sinh viên đ c s p th t theo tên
Danh sách đi m thi s p x p theo th t gi m d n
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Danh sách tuy n tính

a vào ký hi u:
L
x
p
END(L)

D

:
:
:
:

danh sách các đ i t ng có ki u element_type
m t đ i t ng ki u element_type
ki u v trí
hàm tr l i v trí đi sau v trí cu i cùng trong danh sách L

i đây ta k ra m t s phép toán đ i v i danh sách tuy n tính:

0. Creat() Kh i t o danh sách r ng
1. Insert (x, p, L)
• Chèn x vào v trí p trong danh sách L
• N u p = END(L), chèn x vào cu i danh sách
• N u L không có v trí p, k t qu là không xác đ nh
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-41


Danh sách tuy n tính: Các phép toán
2. Locate (x, L)
Tr l i v trí c a x trong L
tr l i END(L) n u x không xu t hi n
3. Retrieve (p, L)
tr l i ph n t

v trí p trong L

không xác đ nh n u p không t n t i ho c p = END(L)
4. Delete (p, L)
xoá ph n t
v trí p trong L . N u L là a1, a2, . . . ,an, thì L s tr
thành a1, a2, . . . , ap- 1, ap+1, . . . , an.
k t qu là không xác đ nh n u L không có v trí p ho c p = END(L)
5. Next (p, L)
tr l i v trí đi ngay sau v trí p
N u p là v trí cu i cùng trong L, thì NEXT(p, L) = END(L). NEXT
không xác đ nh n u p là END(L) ho c p không t n t i.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-42


Danh sách tuy n tính: Các phép toán
6. Prev (p, L)
tr l i v trí tr c p

Prev là không xác đ nh n u p là 1 ho c n u L không có v trí
p.

7. Makenull (L)
hàm này bi n L tr thành danh sách r ng và tr l i v trí
END(L)

8. First (L)
tr l i v trí đ u tiên trong L. N u L là r ng hàm này tr l i
END(L).

9. Printlist (L)
In ra danh sách các ph n t c a L theo th t xu t hi n.
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-43

3.3. Danh sách
3.3.1. Danh sách tuy n tính
3.3.2. Cài đ t danh sách tuy n tính
Bi u di n d i d ng m ng
Danh sách móc n i
Danh sách n i đôi
3.3.3. Các ví d ng d ng
3.3.4. Phân tích s d ng linked list
3.3.5. M t s bi n th c a danh sách móc n i

CTDL & TT – NGUY N


C NGH A – B môn KHMT – HBK Hà n i

Chap03-44


3.3.2. Các cách cài đ t danh sách tuy n tính
(Implementations of Linear List)

• Dùng m ng (Array-based)
C t gi các ph n t c a danh sách vào các ô liên ti p c a m ng

• Danh sách liên k t (Linked list / Pointer-based)
Các ph n t c a danh sách có th c t gi
nh .

các ch tu ý trong b

M i ph n t có con tr (ho c móc n i - link) đ n ph n t ti p theo



a ch không tr c ti p (Indirect addressing)
Các ph n t c a danh sách có th c t gi

các ch tu ý trong b nh

T o b ng trong đó ph n t th i c a b ng cho bi t n i l u tr ph n t
th i c a danh sách


• Mô ph ng con tr (Simulated pointer)
T ng t nh bi u di n liên k t nh ng các s nguyên đ
con tr c a C++
CTDL & TT – NGUY N

c thay b i

C NGH A – B môn KHMT – HBK Hà n i

3.3. Danh sách
3.3.1. Danh sách tuy n tính
3.3.2. Cài đ t danh sách tuy n tính
Bi u di n d i d ng m ng
Danh sách móc n i
Danh sách n i đôi
3.3.3. Các ví d ng d ng
3.3.4. Phân tích s d ng linked list
3.3.5. M t s bi n th c a danh sách móc n i

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-46


3.3.2.1. Bi u di n d

i d ng m ng


(Array--based Representation of Linear List)
(Array

• Ta c t gi các ph n t c a danh sách tuy n tính vào các ô (liên
ti p) c a m ng (array).
• Danh sách s là c u trúc g m hai thành ph n.
Thành ph n 1 : là m ng các ph n t
Thành ph n 2 : last - cho bi t v trí c a ph n t cu i cùng
trong danh sách
• V trí có ki u nguyên (integer) và ch y trong kho ng t 0 đ n
maxlength-1 . Hàm END(L) tr l i giá tr last+1.

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Bi u di n d

i d ng m ng - C

(Array--based Representation of Linear List)
(Array
# define maxlength 1000
typedef int elementtype; /* elements are integers */
typedef struct list_tag {
elementtype elements [maxlength];
int last;
} list_type;

Hàm End(L)

int end (list_type *lp)
{
return (lp->last +1)
}

CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Cài đ t Insert
Insert (x, p,L): Chèn x vào v trí p trong danh sách
void insert (elementtype x , int p , list_type * lp)
{
int v; // running position
if (lp -> last >= maxlength - 1)
{
printf("\n%s ","list is full");
return;
}
if ((p < 0) || (p > lp -> last + 1))
{
printf("\n%s ","position does not exist");
return;
}
else {
for (int q = lp -> last; q <= p; q--)
lp -> elements [q+1] = lp -> elements [q];
lp -> last = lp -> last +1 ;
lp -> elements[p] = x;

}
}
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i

Chap03-49

Cài đ t DELETE
Delete (p, L): lo i ph n t

v trí p trong danh sách L

void deleteL(int p , list_type * lp)
{
int q; /* running position */
if ((p > lp-> last) || (p < 0))
{
printf("\n%s ","position does not exist");
return;
}
else /* shift elements */ {
lp -> last --;
for (int q = p; q <= lp ->last; q++)
lp -> elements [q] = lp -> elements [q+1];
}
}
CTDL & TT – NGUY N

C NGH A – B môn KHMT – HBK Hà n i


Chap03-50


×