1.Cách tìm kiếm phần tử trong danh sách
Giả sử một danh sách ban đầu là một mảng gồm các phần tử: 1,2,3,4,5,6,7,8,9,10,11 (như hình dưới)
Công việc tìm kiếm phần tử trong danh sách với yêu cầu đầu vào là giá trị X cần tìm và đầu ra là index (chỉ số) của phần tử X mà ta tìm ra được. Ví dụ dưới đây, tôi cần tìm kiếm giá trị phần tử X = 6 ở trong mảng trên thì kết quả nhận được sẽ là index = 5.
Để thực hiện được công việc tìm kiếm trên ta cần thực hiện 3 bước:
- Bước đầu tiên: Duyệt toàn bộ phần tử có trong danh sách
- Bước thứ hai: Kiểm tra giá trị đầu vào X với từng giá trị phần tử có trong danh sách và sau đó lưu lại index tìm được.
- Bước thứ ba: Lưu lại toàn bộ index vừa tìm được ở bước thứ hai vào một mảng.
2. Hàm tìm kiếm các phần tử có trong danh sách
2.1 Xây dựng hàm tìm kiếm các phần tử
Hàm void TimKiem(DSKe ds, int x) duới đây nhận đầu vào là DSKe ds chính là danh sách cần được tìm kiếm các phần tử và tham số int x chính là giá trị cần tìm kiếm. Hàm này sẽ thực hiện duyệt từ vị trí p = 0 (đầu danh sách) cho đến vị trí p < ds.n (cuối danh sách). Nếu như có phần tử tại vị trí ds.A[p] = X thì sẽ lưu vị trí p đó vào mảng chứa các địa chỉ được tìm thấy.
void TimKiem(DSKe ds, int x){ //khai bao vi tri p ban dau int p = 0; //khai bao bien dem int d = 0; //khai bao mang chua dia chi khi tim thay int B[10]; //duyet qua danh sach while (p<ds.n){ //neu co phan tu trong mang = x if (ds.A[p]==x){ //them vi tri p vao mang chua dia chi tim thay B[d] = p; //tang bien dem len 1 don vi d++; } p += 1; } //neu bien dem lon hon 0 if (d>0){ //hien thi cac vi tri duoc luu trong mang B printf("Cac vi tri tim thay: "); //duyet mang B for (int i=0; i<d; i++){ printf("%d ", B[i]); } }else{//nguoc lai d < 0 thi khong tim thay printf("Khong co phan tu can tim!\n"); } }
Chú ý:
- Vì việc tìm kiếm sẽ không làm thay đổi các giá trị có trong mảng nên danh sách truyền vào không cần truyền theo kiểu tham chiếu DSKe &ds
- Mảng B chính là nơi lưu trữ các địa chỉ được tìm thấy
- Biến đếm d chính là việc kiểm tra xem có kết quả nào được tìm thấy hay không.
2.2 Chương trình hoàn chỉnh sử dụng hàm tìm kiếm phần tử trong danh sách
Trước khi thực hiện tìm kiếm phần tử trong danh sách, ta cần đảm bảo rằng trong danh sách đã có phần tử. Vì thế tôi sẽ thêm một số phần tử vào danh sách trước bằng cách gọi hàm void ChenDau(ds,x)
Sau đó tôi sẽ thực hiện việc tìm kiếm phần tử trong danh sách với đầu vào X = 6. Bằng cách gọi hàm void TimKiem(ds, 6)
#include <stdio.h> #define MAX 100 //dinh nghia so luong phan tu cua mang co the luu tru typedef struct DSKe{ //mang int a voi kich thuoc MAX = 100 int A[MAX]; //quan ly so luong N phan tu int n; }DSKe; //khai bao ham khoi tao void KhoiTao(DSKe &ds){ //ban dau danh sach la rong (n = 0) ds.n = 0; } int KiemTraRong(DSKe ds){ //neu ds.n == 0 thi rong if (ds.n==0){ return 1; } return 0; } int KiemTraDay(DSKe ds){ //neu ds.n == MAX thi da day if (ds.n == MAX){ return 1; } return 0; } void ChenCuoi(DSKe &ds, int x){ //neu day thi khong duoc phep chen if (KiemTraDay(ds)==1){ return; } //truy cap vao phan tu cuoi cung cua danh sach va chen X vao ds.A[ds.n]=x; //tang phan tu trong danh sach len ds.n += 1; } void DuyetDS(DSKe ds){ //duyet tu phan tu dau tien int p = 0; //chua den dia chi cuoi cung trong danh sach thi tiep tuc duyet while (p<ds.n){ //Xu ly cac phan tu duoc xet printf("%d ",ds.A[p]); //tang den vi tri den phan tu tiep theo trong danh sach p++; } } void TimKiem(DSKe ds, int x){ //khai bao vi tri p ban dau int p = 0; //khai bao bien dem int d = 0; //khai bao mang chua dia chi khi tim thay int B[10]; //duyet qua danh sach while (p<ds.n){ //neu co phan tu trong mang = x if (ds.A[p]==x){ //them vi tri p vao mang chua dia chi tim thay B[d] = p; //tang bien dem len 1 don vi d++; } p += 1; } //neu bien dem lon hon 0 if (d>0){ //hien thi cac vi tri duoc luu trong mang B printf("\nCac vi tri tim thay: "); //duyet mang B for (int i=0; i<d; i++){ printf("%d ", B[i]); } }else{//nguoc lai d < 0 thi khong tim thay printf("Khong co phan tu can tim!\n"); } } int main(){ //khai bien ds co kieu DSKe DSKe ds; //dua ds vao ham khoitao KhoiTao(ds); //nhap N so luong phan tu cua danh sach can chen int n; printf("Nhap N: "); scanf("%d", &n); //nhap gia tri cho tung phan tu X for(int i = 0; i < n; i++){ int x; printf("Nhap phan tu thu [%d] trong danh sach: ",i); scanf("%d",&x); //chen gia tri cua cac phan tu vao danh sach theo cach chen cuoi ChenCuoi(ds,x); } //goi ham duyet danh sach printf("\nDANH SACH BAN DAU\n"); DuyetDS(ds); //nhap gia tri can tim kiem trong danh sach vao bien x int x; printf("\nNhap gia tri can tim kiem: "); scanf("%d",&x); //goi ham tim kiem TimKiem(ds,x); }
Nhap N: 11
Nhap phan tu thu [0] trong danh sach: 1 Nhap phan tu thu [1] trong danh sach: 2 Nhap phan tu thu [2] trong danh sach: 3 Nhap phan tu thu [3] trong danh sach: 4 Nhap phan tu thu [4] trong danh sach: 5 Nhap phan tu thu [5] trong danh sach: 6 Nhap phan tu thu [6] trong danh sach: 7 Nhap phan tu thu [7] trong danh sach: 8 Nhap phan tu thu [8] trong danh sach: 9 Nhap phan tu thu [9] trong danh sach: 10 Nhap phan tu thu [10] trong danh sach: 11 DANH SACH BAN DAU 1 2 3 4 5 6 7 8 9 10 11 Nhap gia tri can tim kiem: 6 Cac vi tri tim thay: 5 |