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 nào đó để thực hiện công việc 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
Trang 3a Định nghĩa
b Các phép toán trên danh sách
Trang 4Số 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ụ:
Trang 5Phé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ụ:
Trang 6Thê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ụ:
Trang 7Loạ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ụ:
Trang 8Sử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ụ:
Trang 9Tá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
Trang 11Danh 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ử ai+1 đứng sau phần tử ai.
a0 a1 … ai ai+1 … an-2 an-1
add[1] add[i] d add[n]
add[i] = add[1] + (i-1)*d
Trang 12#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;
Vd:
Trang 13i 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
Trang 14i Khởi tạo danh sách rỗng
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
Trang 15ii Kiểm tra danh sách rỗng
Danh sách rỗng là một danh sách mà độ dài của
Trang 16iii 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ị
Trang 17Giả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");
Trang 18iv 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
Trang 19iv 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;
Trang 20v 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)
Trang 21v 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
Trang 22i Ư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ự
Trang 23ii 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
Trang 24Chúc các bạn thành công !
Trang 251 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
Trang 26a Định nghĩa và khai báo
b Các phép toán
Trang 27Danh sách liên kết là danh sách mà các phần tử được kết nối với nhau nhờ các vùng liên kết.
Mỗi phần tử của danh sách gọi là nút gồm có hai thành phần:
+ phần thông tin
+ và phần kết nối (chứa địa chỉ của nút kế tiếp).
Trang 28typedef ElementType; //kiểu của phần tử trong danh sách
typedef struct Node{
ElementType Element; //Chứa nội dung của phần tử
struct Node *link; /*con trỏ chỉ đến phần tử kế tiếp trong danh sách*/
}List;
List *First, *Last;
Trang 29i Khởi tạo danh sách rỗng
ii Kiểm tra danh sách rỗng
iii Xác định vị trí của phần tử trong DS
iv Chèn phần tử vào danh sách
v Loại bỏ phần tử khỏi danh sách
vi Ghép danh sách
vii Trộn danh sách
b Các phép toán
Trang 30i.Khởi tạo danh sách rỗng
void Make_List(List **First, List **Last){
(*First)=(*Last)= NULL;
}
b Các phép toán
Trang 31ii Kiểm tra danh sách rỗng
Danh sách rỗng nếu First == NULL int Empty_List(List *First)
{
return First==NULL;
}
b Các phép toán
Trang 32iii Xác định vị trí n trong danh sách
List *Locate(int n, List *T)
{ List *P,*q; int count = 0;
If(Empty(T)) cout<<“danh sách rỗng”;else{P = T;
while ((P != NULL) && (count<n))
{count++; q=P;P=P->link;}}
if(count==n) return q;
else return NULL;
}
Trang 33iv Chèn phần tử vào danh sách
Chèn ở đầu DS:
void in_sert(ElementType x,List **T){List *p;
p=(List*)malloc(sizeof(List));p->element=x;
p->link=(*T);(*T)=p;
}
b Các phép toán
Trang 34iv Chèn phần tử vào danh sách
Trang 35iv Chèn phần tử vào danh sách
Trang 36v Xóa phần tử khỏi danh sách
Xóa ở đầu danh sách:
void Delete_T(List **T)
{List *p;
if((*T)!=NULL){
p=(*T);(*T)=p->link;delete(p);}
}
Trang 37v Xóa phần tử khỏi danh sách
Xóa ở giữa danh sách:
void Delete_G(int n,List **T)
{List *p,*q;
if(Empty(*T)) cout<<"danh sach rong \n";else{ p=search(n,*T);
if(p->link!=NULL) {q=p->link; p->link=q->link;
free(q);}
}
}
Trang 38i Ưu điểm
- Thích hợp phép chèn, loại bỏ, trộn, ghép danh sách
- Rất phù hợp với các loại danh sách có nhiều biến động
c Đặc điểm của danh sách liên kết
Trang 39ii Nhược điểm
- Tốn vùng nhớ cho chỉ điểm liên kết
- Không thích hợp cho tìm kiếm
c Đặc điểm của danh sách liên kết
Trang 40Chúc các bạn thành công !
Trang 411 Viết thuật toán tạo danh sách liên kết chứa các số
nguyên nhập từ bàn phím, sau đó hiểm thị danh
4 Viết thuật toán đếm số nút trong danh sách liên kết
5 Viết thuật toán tính giá trị trung bình của các phần
tử trong danh sách
6 Viết thuật toán đảo ngược một danh sách liên kết
7 Viết thuật toán trộn 2 danh sách liên kết cho trước
Bài tập