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ụ:
a Định nghĩa
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 6
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
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 8
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
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
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:
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 14Trong đó 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 16
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
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 18
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
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 20
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)
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 22
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ự
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 24
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
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 26
3 Danh sách liên kết
a Đị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 28
3 Danh sách liên kết
typedef 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;
a Định nghĩa và khai báo
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 30
2 Danh sách liên kết
i.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 32
2 Danh sách liên kết
iii 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))
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 35iv Chèn phần tử vào danh sách
Trang 36
2 Danh sách liên kết
v 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);}
}
b Các phép toán
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 38
2 Danh sách liên kết
i Ư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 40
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
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ển 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
Trang 43Ngăn xếp (Stack) là danh sách mà việc thêm vào hoặc loại bỏ một phần tử chỉ thực hiện tại một đầu được gọi là đỉnh (TOP) của ngăn xếp Theo nguyên tắc vào sau ra trước LIFO (last in - first out )
Trang 44
4 Ngăn xếp
MAKE_STACK(S): Khởi tạo ngăn xếp
POP(S,x) lấy phần tử đỉnh của ngăn xếp gán cho x
PUSH(x,S) thêm một phần tử x vào đầu ngăn xếp
EMPTY_STACK(S) kiểm tra ngăn xếp rỗng
FULL_STACK(S): Kiểm tra ngăn xếp đầy
b Các phép toán trên ngăn xếp
Trang 45Khai báo ngăn xếp
#define MaxLength //độ dài của mảng
typedef ElementType; //kiểu các phần tử trong ngăn xếp
typedef struct {
ElementType Elements[MaxLength];
int Top_idx; //giữ vị trí đỉnh ngăn xếp
} Stack;
Trang 47Kiểm tra ngăn xếp rỗng
int Empty_Stack(Stack S){
return S.Top_idx==MaxLength; }
Trang 49Chương trình con xóa phần tử ra khỏi ngăn xếp
void Pop(Stack *S,int *y){
Trang 50
4 Ngăn xếp
Chương trình con thêm phần tử vào ngăn xếp :
void Push(ElementType X, Stack *S){
if (Full_Stack(*S)) printf("Loi! Ngan xep day!");
Trang 51Khai báo ngăn xếp
typedef ElementType;
typedef struct Node{
ElementType Element;
struct Node *link;} Stack;
d Tổ chức theo danh sách liên kết
Trang 53Kiểm tra ngăn xếp rỗng:
Trang 54
4 Ngăn xếp
Thêm phần tử vào ngăn xếp
void Push(int X, Stack **S)
{Stack *p;
p=(Stack*)malloc(sizeof(Stack));p->Element=X;
p->link=(*S);(*S)=p;
}
d Tổ chức theo danh sách liên kết
Trang 55Xóa phần tử ra khỏi ngăn xếp
void Pop (Stack **S,int *y)
{Stack *p;
if((S)!=NULL){ *y=(*S)->Element;
p=(*S);(*S)=p->link;
delete(p);
}}
d Tổ chức theo danh sách liên kết
Trang 57Thuật toán chuyển đổi cơ số
e Ứng dụng
Thuật toán này chuyển đổi biểu diễn cơ số 10 của một
số nguyên dương Number sang cơ số 2 và hiển thị biểu diễn cơ số 2
(1)Lặp lại các bước sau cho đến khi Number = 0:
(a)Tính số dư Remaider của phép chi Number cho 2(b)Đặt số dư remaider vào đỉnh ngăn xếp
(c)Thay Number bằng phần nguyên của kết quả phép Number chia cho 2
Trang 58
4 Ngăn xếp
Thuật toán chuyển đổi cơ số
e Ứng dụng
Thuật toán này chuyển đổi biểu diễn cơ số 10 của một
số nguyên dương Number sang cơ số 2 và hiển thị biểu diễn cơ số 2
(2) Lặp lại các bước sau cho đến khi ngăn xếp số dư rỗng:
(a)Lấy ra remaider từ đỉnh ngăn xếp
(b)Hiển thị Remaider
Trang 59Ký pháp nghich đảo Ba lan
Trang 60
4 Ngăn xếp
Ký pháp nghich đảo Ba lan
e Ứng dụng
(1) Khởi động ngăn xếp rỗng của các toán hạng:
(2) Lặp lại các bước sau cho đến khi gặp dấu kết thúc
biểu thức được đọc:
(a) Đọc phần tử (hằng, biến, phần tử)
Trang 61Ký pháp nghich đảo Ba lan
(ii) áp dụng toán tử trên vào hai giá trị vừa lấy
(iii) đẩy kết quả vào ngăn xếp
(c) Khi gặp dấu kết thức biểu thức, giá trị biểu thức là giá trị duy nhất ở
đỉnh ngăn xếp.
Trang 63Hàng đợi, hay ngắn gọn là hàng (queue) là danh sách
mà phép thêm vào thực hiện tại một đầu gọi là cuối hàng (REAR), còn phép loại bỏ thì thực hiện ở đầu kia của danh sách, gọi là đầu hàng (FRONT) Hàng tuân thủ nguyên tắc vào trước - ra trước FIFO (first in - first
out)
Hàng đợi
Trang 64
4 Hàng đợi
• MAKE_QUEUE(Q) khởi tạo một hàng
• I_QUEUE(x,Q) thêm phần tử x vào cuối hàng Q
• O_QUEUE(Q,y) lấy ra phần tử y tại đầu của hàng Q
• EMPTY_QUEUE(Q) hàm kiểm tra hàng rỗng
• FULL_QUEUE(Q) kiểm tra hàng đầy
b Các phép toán cơ bản trên hàng
Trang 65Các khai báo cần thiết
#define MaxLength //chiều dài tối đa của mảng typedef ElementType;
//Kiểu dữ liệu của các phần tử trong hàng
typedef struct {
ElementType Elements[MaxLength];
//Lưu trữ nội dung các phần tử
int Front, Rear; //chỉ số đầu và đuôi hàng
} Queue;
c Tổ chức theo danh sách đặc
Trang 68
4 Hàng đợi
Kiểm tra đầy
Hàng đầy nếu số phần tử hiện có trong hàng bằng
Trang 69Xóa phần tử ra khỏi hàng
Khi xóa một phần tử đầu hàng ta chỉ cần cho front tăng lên 1 Nếu front > rear thì hàng thực chất là hàng đã rỗng, nên ta sẽ khởi tạo lại hàng rỗng
(tức là đặt lại giá trị front = rear =-1)
Trang 70*x=Q->Elements[Q->Front]; Q->Front=Q->Front+1;
if (Q->Front>Q->Rear) Make_Queue(Q);
} else cout<<"Loi: Hang rong!";
}
c Tổ chức theo danh sách đặc
Trang 71Q->Rear=MaxLength - Q->Front-1; Q->Front=0; }
Q->Rear=Q->Rear+1; Q->Elements[Q->Rear]=X; } else cout<<"Loi: Hang day!";
}
Trang 72
4 Hàng đợi
Khai báo cần thiết
typedef ElementType; //kiểu phần tử của hàng typedef struct Node{
Position Front, Rear;
//là hai trường chỉ đến đầu và cuối của hàng } Queue;
d Tổ chức theo danh sách liên kết
Trang 75}else {p=(Node*)malloc(sizeof(Node));
p->Element=X;p->Next=NULL;
Q->Rear->Next=p; Q->Rear=p;
} }
d Tổ chức theo danh sách liên kết
Trang 76d Tổ chức theo danh sách liên kết
Trang 77Hàng đợi là một cấu trúc dữ liệu được dùng khá phổ biến trong thiết kế giải thuật Bất kỳ nơi nào ta cần
quản lí dữ liệu, quá trình theo kiểu vào trước-ra
trước đều có thể ứng dụng hàng đợi
Ví dụ rất dễ thấy là quản lí in trên mạng, nhiều máy tính yêu cầu in đồng thời và ngay cả một máy tính
cũng yêu cầu in nhiều lần Nói chung có nhiều yêu
cầu in dữ liệu, nhưng máy in không thể đáp ứng tức thời tất cả các yêu cầu đó nên chương trình quản lí in
sẽ thiết lập một hàng đợi để quản lí các yêu cầu Yêu cầu nào mà chương trình quản lí in nhận trước nó sẽ giải quyết trước
e Ứng dụng
Trang 78
4 Hàng đợi
Một ví dụ khác là duyệt cây theo mức được trình bày chi tiết trong chương sau Các giải thuật duyệt theo chiều rộng một đồ thị có hướng hoặc vô hướng cũng dùng hàng đợi để quản lí các nút đồ thị Các giải thuật đổi biểu thức trung tố thành hậu tố, tiền tố
e Ứng dụng
Trang 79Chúc các bạn thành công !
Trang 80
Bài tập Ngăn xếp & Hàng đợi
1 Viết chương trình dùng ngăn xếp để chuyển một số thập
phân sang số nhị phân
2 Dùng các hàm cơ bản trên ngăn xếp như: MAKE_STACK(S) ,
POP(S,x), PUSH(x,S), EMPTY_STACK(S), FULL_STACK(S
1 Lấy ra phần tử đáy của ngăn xếp, nhưng để lại nguyên
nội dung của ngăn xếp
2 Lấy ra phần tử thư n của ngăn xếp, nhưng để lại
nguyên nội dung của ngăn xếp.
3 Dùng các hàm cơ bản trên hàng đợi như: MAKE_QUEUE(Q) ,
I_QUEUE(x,Q) , O_QUEUE(Q,y) , EMPTY_QUEUE(Q) ,
1 Lấy ra phần tử ởcuối hàng đợi, nhưng để lại nguyên nội
dung của hàng đợi.
2 Lấy ra phần tử thứ n của hàng đợi, nhưng để lại nguyên
nội dung của hàng đợi.
4 Dùng các phép toán cơ bản trên hàng đợi và ngăn xếp Viết
chương trình đảo ngược các phần tử của hàng đợi.