CHƯƠNG 3
DANH SÁCH TUYẾN TÍNH
2/59
NỘI DUNG
Khái niệm danh sách tuyến tính
Lưu trữ kế tiếp của danh sách tuyến
tính
Danh sách móc nối
Ngăn xếp
Hàng đợi
3/59
3.1 KHÁI NIỆM DANH SÁCH TUYẾN TÍNH
Danh sách là một dãy các phần tử thuộc cùng một lớp đối
tượng nào đó gọi là kiểu phần tử
Ví dụ : Danh sách số nguyên, danh sách sinh viên,
Trong danh sách mối quan hệ lân cận giữa các phần tử
được thể hiện gọi là danh sách tuyến tính.
Danh sách tuyến tính hoặc rỗng hoặc có dạng
L = { a
1
, a
2
, , a
n
}
4/59
3.1 KHÁI NIỆM DANH SÁCH TUYẾN TÍNH
Danh sách tuyến tính hoặc rỗng hoặc có dạng
L = { a
1
, a
2
, , a
n
}
Trong đó
n gọi là độ dài hoặc kích thước của danh sách L
n>0 thì a
1
là phần tử đầu danh sách, a
n
là phần tử cuối
danh sách
a
i
là phần tử thứ i trong danh sách với (1<=i<=n)
a
i
được gọi là đứng trước a
i+1
với (1<=i<n)
a
i
được gọi là đứng sau a
i-1
với (1<i<=n)
5/59
3.1 KHÁI NIỆM DANH SÁCH TUYẾN TÍNH
Định nghĩa các phép toán tác động vào danh sách
Khởi tạo danh sách rỗng (creat)
Kiểm tra danh sách rỗng (empty)
Kiểm tra danh sách đầy (full)
Bổ sung một phần tử vào danh sách (insert)
Loại bỏ một phần tử khỏi danh sách (del)
Sắp xếp danh sách (sort)
Tìm kiếm trên danh sách (search)
Tách danh sách hoặc ghép danh sách
6/59
3.2 LƯU TRỮ KẾ TIẾP CỦA DSTT
Khái niệm
Định nghĩa và khai báo CTDL
Định nghĩa các phép toán và chương trình thực hiện
các phép toán cơ bản
7/59
3.2.1 Khái niệm
Sử dụng mảng một chiều làm cấu trúc lưu trữ danh sách
Mỗi phần tử của mảng lưu trữ một phần tử của danh sách, các phần tử
của danh sách nằm kế tiếp nhau trong bộ nhớ
Ưu điểm
Truy cập trực tiếp tới các phần tử
Các thao tác được thực hiện khá đơn giản
Nhược điểm
Do kích thước mảng cố định khi khai báo nên có thể dẫn đến sự lãng
phí hoặc thiếu bộ nhớ.
Phải dãn hoặc dồn danh sách khi chèn thêm hoặc loại bỏ phần tử
khỏi danh sách
8/59
3.2.2 Định nghĩa và khai báo CTDL
Giả sử các phần tử của danh sách có kiểu dữ liệu là
<kiểu phần tử>
Độ dài của danh sách là một số nguyên dương n
Danh sách được biểu diễn bởi một bản ghi gồm có hai
trường
Trường thứ nhất: Là một số nguyên biểu diễn số phần tử có
trong danh sách
Trường thứ hai : Là mảng một chiều có kích thước đủ lớn để
lưu các phần tử của danh sách
9/59
3.2.2 Định nghĩa và khai báo CTDL
Khai báo cấu trúc dữ liệu :
const max = <1 số thích hợp>;
struct list
{
int sopt ;
<kiểu phần tử> ptu[max] ;
} l ;
l.sopt = 0 -> danh sách l rỗng
l.sopt = max -> ds đầy
Danh s¸ch
Cha cã
0
a
1
1
a
2
n - 1
a
n
. . . . . . . .
max - 1
Mảng lưu trữ danh sách l
10/59
3.2.3 Các phép toán cơ bản
Khởi tạo danh sách rỗng (creat)
Kiểm tra danh sách rỗng (empty)
Kiểm tra danh sách đầy (full)
Bổ sung một phần tử vào danh sách (insert)
Loại bỏ một phần tử khỏi danh sách (del)
11/59
3.2.3 Các phép toán cơ bản
Khởi tạo danh sách rỗng
void creat(list &l)
{
l.sopt = 0;
}
12/59
3.2.3 Các phép toán cơ bản
Kiểm tra danh sách rỗng
int empty(list l)
{
return l.sopt ==0 ;
}
13/59
3.2.3 Các phép toán cơ bản
Kiểm tra danh sách đầy
int full(list l)
{
return l.sopt ==max;
}
14/59
3.2.3 Các phép toán cơ bản
Phép bổ sung phần tử x vào vị trí thứ k trong danh sách l
14 23 42 11 25
Mảng l.ptu
0 1 k=2 3 4 5 max = 7
l.sopt = 5
Bổ sung x=24 vào vị trí k=2
14 23 42 11 25
Mảng l.ptu
0 1 k=2 3 4 5 max = 7
l.sopt = 6
x= 24
15/59
3.2.3 Các phép toán cơ bản
Phép bổ sung một phần tử vào vị trí k trong danh sách l
Bổ sung x=24 vào vị trí k=2
14 23 24 42 11 25
Mảng l.ptu
0 1 2 3 4 5 max = 7
l.sopt = 6
16/59
3.2.3 Các phép toán cơ bản
Phép bổ sung một phần tử x vào vị trí k trong danh
sách l
void insert (<kiểu phần tử> x, int k, list &l)
{ if (l.sopt <max && k>=0 && k <= l.sopt )
{ for (int i = l.sopt; i >k; i )
l.ptu[i] = l.ptu[i-1];
l.ptu[k] = x;
l.sopt++;
}
}
17/59
3.2.3 Các phép toán cơ bản
Phép loại bỏ một phần tử ở vị trí k trong danh sách l
14 23 42 11 25
Mảng l.ptu
0 1 k=2 3 4 5 max = 7
l.sopt = 5
Loại bỏ phần tử tại vị trí k=2
14 23 11 25
Mảng l.ptu
0 1 2 3 4 5 max = 7
l.sopt= 4
18/59
3.2.3 Các phép toán cơ bản
Phép loại bỏ một phần tử khỏi danh sách
void del(int k, list &l)
{
if (k>=0 && k < l.sopt)
{ l.sopt ;
for (int i=k; i<l.sopt; i++)
l.ptu[i] = l.ptu[i +1];
}
}
19/59
3.3 DANH SÁCH MÓC NỐI
Danh sách móc nối đơn
Danh sách móc nối vòng
Danh sách móc nối kép
Ưu nhược điểm của danh sách móc nối
20/59
3.3.1 Danh sách móc nối đơn
Định nghĩa và khai báo CTDL
Định nghĩa các phép toán và chương trình thực
hiện các phép toán cơ bản
21/59
Định nghĩa và khai báo CTDL
Mỗi phần tử của danh sách là một bản ghi gồm có 2
trường
data chứa thông tin của phần tử
next là một con trỏ,trỏ vào nút đứng sau trong danh
sách
data next
22/59
Định nghĩa và khai báo CTDL
Danh sách được định nghĩa là một con trỏ trỏ vào phần
tử đầu tiên của danh sách
Con trỏ next của phần tử cuối trong danh sách nhận
giá trị NULL báo hiệu kết thúc danh sách
a1 a2 … a
n
NULL
l
23/59
Định nghĩa và khai báo CTDL
Khai báo cấu trúc như sau :
struct node
{ <kiểu phần tử> ptu;
node *next;
} *l ;
24/59
Các phép toán cơ bản
Khởi tạo danh sách rỗng (creat)
Kiểm tra danh sách rỗng (empty)
Bổ sung một phần tử vào danh sách (insert)
Loại bỏ một phần tử khỏi danh sách (del)
25/59
Các phép toán cơ bản
Khởi tạo danh sách rỗng
void creat(node *&l)
{
l = NULL;
}