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

Bài giảng cấu trúc dữ liệu - Chương 2 Cấu trúc dữ liệu danh sách Phần 2 pdf

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 (278.72 KB, 41 trang )


CẤU TRÚC DỮ LIỆU
CẤU TRÚC DỮ LIỆU
(BẬC CAO ĐẲNG)
Nguyễn Thanh Cẩm
Nguyễn Thanh Cẩm
BÀI GIẢNG
BÀI GIẢNG
KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH
Chương2:
Chương2:


CẤU TRÚC DỮ LIỆU DANH SÁCH
CẤU TRÚC DỮ LIỆU DANH SÁCH


1. Danh sách
2. Danh sách đặc
3. Danh sách liên kết
4. Ngăn xếp
5. Hàng đợi
NỘI DUNG TRÌNH BÀY
1
1


1. Danh sách
a. Định nghĩa
b. Các phép toán trên danh sách



1. Danh sách
Danh sách là tập hợp hữu hạn các phần tử
cùng kiểu (Elementtype) : a
1
, a
2
, …, a
n
(n>=1)
với tính chất: nếu biết được a
i
sẽ biết a
i+1

(0<= i <= n-1 )
Danh sách được sắp xếp tuyến tính theo vị trí của
chúng (position)
Số các phần tử (n) của danh sách gọi là độ dài
của danh sách. Nếu n=0 thì ta có danh sách rỗng.
Ví dụ:
a. Định nghĩa


1. Danh sách
Phép duyệt danh sách: là phép thăm tất cả các
phần tử của danh sách thỏa mãn <điều kiện> nào
đó để thực hiện công việc <xử lý>
Ví dụ:
Phép tìm kiếm: là thao tác tìm phần tử trong danh

sách thỏa mãn điều kiện nào đó
Ví dụ:
b. Các phép toán trên danh sách


1. Danh sách
Thêm phần tử vào danh sách: là thao tác thêm
phần tử mới Vào danh sách. Phần tử có thể được
thêm vào cuối, đầu hoặc giữa danh sách.
Chú ý danh sách đầy
Ví dụ:
b. Các phép toán trên danh sách


1. Danh sách
Loại bỏ phần tử khỏi danh sách: là thao tác loại
bỏ phần tử khỏi danh sách. Trước khi loại bỏ phải
xác định phần tử cần loại bỏ (tìm kiếm).
Chú ý: sau khi loại bỏ, số phần tử của danh sách
giảm đi 1 đơn vị
Ví dụ:
b. Các phép toán trên danh sách


1. Danh sách
Sửa đổi phần tử trong danh sách: là thao tác
hiệu chỉnh phần tử trong danh sách. Trước khi
hiệu chỉnh cần phải xác định phần tử cần hiệu
chỉnh (tìm kiếm)
Ví dụ:

Sắp xếp thứ tự danh sách: là thao tác sắp lại thứ
tự các phần tử trong danh sách theo một quy tắc
nào đó
Ví dụ:
b. Các phép toán trên danh sách


1. Danh sách
Tách một danh sách thành nhiều danh sách: là
thao tác tách một phần hoặc tất cả các phần tử
trong DS đưa sang các danh sách khác
Vd:
Ghép nhiều danh sách thành danh sách mới: là
thao tác ngược lại của quá trình tách.
Trộn nhiều danh sách thành danh sách mới
b. Các phép toán trên danh sách


2. Danh sách đặc
a. Định nghĩa
b. Khai báo
c. Các phép toán
d. Đặc điểm của danh sách đặc


2. Danh sách đặc
Danh sách đặc là danh sách mà các phần tử được
sắp xếp kế tiếp nhau trong bộ nhớ, phần tử a
i+1
đứng

sau phần tử a
i
.
a. Định nghĩa
a
0
a
1
… a
i
a
i+1
… a
n-2
a
n-1
add[1] add[i] add[n]← d →
add[i] = add[1] + (i-1)*d


2. Danh sách đặc
#define MaxLength //Số nguyên thích hợp để chỉ độ dài của danh sách
typedef ElementType; //kiểu của phần tử trong danh sách
typedef int Position; //kiểu vị trí cuả các phần tử
typedef struct {
ElementType Elements[MaxLength]; //mảng chứa các phần tử của DS
Position Last; //giữ độ dài danh sách
} List;
b. Khai báo
Vd:



2. Danh sách đặc
i. Khởi tạo danh sách rỗng
ii. Kiểm tra danh sách rỗng
iii. Tìm kiếm phần tử trong danh sách
iv. Chèn phần tử vào danh sách
v. Loại bỏ phần tử khỏi danh sách
c. Các phép toán


2. Danh sách đặc
i. Khởi tạo danh sách rỗng
c. Các phép toán
void Make_List(List *L)
{
L->Last = 0;
}
Trong đó Last chỉ vị trí của phần tử cuối cùng
trong danh sách và đó cũng là độ dài hiện tại của
danh sách


2. Danh sách đặc
ii. Kiểm tra danh sách rỗng
Danh sách rỗng là một danh sách mà độ dài của
nó bằng 0.
int Empty_List(List L)
{
return L.Last == 0;

}
c. Các phép toán


2. Danh sách đặc
iii. Chèn phần tử vào danh sách
Giả sử ta chèn phần tử có nội dung x vào danh
sách ở vị trí p. Khi đó các phần tử từ vị trí thứ p đến
vị trí thứ last được di chuyển ra sau 1 đơn vị và độ
dài danh sách tăng lên 1 đơn vị.
c. Các phép toán


2. Danh sách đặc
Giải thuật Chèn phần tử vào danh sách
void Insert_List(ElementType X, Position P, List *L){
if (L->Last==MaxLength) printf("Danh sach day");
else
if ((P<0) || (P>L->Last)) printf("Vi tri khong hop le");
else{ Position i;
for(i=L.Last; i>=p; i ) L->element[i+1]= L->element[i];
L->Elements[p]=X;
L->Last++;
}
}
c. Các phép toán


2. Danh sách đặc
iv. Loại bỏ phần tử khỏi danh sách

Để loại bỏ phần tử vị trí p ra khỏi danh sách L ta dời
các phần tử từ vị trí p+1 đến cuối danh sách sang trái
1 vị trí.
Lưu ý: độ dài của danh sách giảm đi 1 đơn vị
c. Các phép toán


2. Danh sách đặc
iv. Loại bỏ phần tử khỏi danh sách
Giải thuật loại bỏ
void Delete_List(Position P,List *L){
if ((P<0) || (P>L->Last)) printf("Vi tri khong hop le");
else if (Empty_List(*L)) printf("Danh sach rong!");
else{ Position i;
for(i=P;i<L->Last;i++)
L->Elements[i] = L->Elements[i+1];
L->Last ;
}
}
c. Các phép toán


2. Danh sách đặc
v. Tìm kiếm phần tử trong danh sách
Trường hợp danh sách không thứ tự
Position Search_List(ElementType X,List L){
Position found=0, i=0;
if (Empty_List(L)) printf("Danh sach rong!");
else{ while (i<L.last&&found==0)
if(L.element[i]==x) found=1;

else i++;
if(found==0) return -1;
return i;
}
}
c. Các phép toán


2. Danh sách đặc
v. Tìm kiếm phần tử trong danh sách
Trường hợp danh sách có thứ tự
(tự nghiên cứu)
c. Các phép toán


2. Danh sách đặc
i. Ưu điểm
d. Đặc điểm của danh sách đặc

Sử dụng 100% ô nhớ để lưu trữ thông tin

Truy xuất trực tiếp phần tử List[i]

Dễ dàng tìm kiếm phần tử bằng phương pháp
nhị phân, nếu danh sách có thứ tự.


2. Danh sách đặc
ii. Nhược điểm
d. Đặc điểm của danh sách đặc


Không phù hợp với phép chèn và loại bỏ. Số lần
di chuyển trung bình cho một phép chèn hoặc
loại bỏ là n/2.


Chúc các bạn thành công !
KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH


2. Danh sách đặc
1. Cho dãy số n nguyên và số nguyên x. Kiểm tra
xem x có thuộc dãy đã cho hay không. Nếu có cho
biết vị trí của x. Xóa tất cả các số lớn hơn x.
2. Cho n số nguyên dương. Xóa các số trong dãy nhỏ
hơn 10. Chèn số 20 vào vị trí thứ 10.
3. Cho n số nguyên. Tìm phần tử nhỏ nhất của dãy.
4. Nhập vào một dãy n số nguyên. Kiểm tra xem dãy
đã cho có tăng hay không.
5. Cho 2 dãy A, B. Viết chương trình trộn 2 dãy A, B
thành dãy C.
Bài tập

×