Tải bản đầy đủ (.ppt) (59 trang)

Chương 3: danh sách tuyến tính pptx

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 (513.67 KB, 59 trang )

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
Cha 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;
}

×