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 10324
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