×

Tìm kiếm phần tử trong bảng băm đã tạo với hsearch() trong C

Tìm kiếm phần tử trong bảng băm là một thao tác quan trọng trong nhiều ứng dụng lập trình, bao gồm cả việc quản lý cơ sở dữ liệu, hệ thống caching, và nhiều hơn nữa. Trong ngôn ngữ C, thư viện chuẩn cung cấp nhiều hàm hữu ích cho việc này và một trong số đó là hsearch(), được định nghĩa trong <search.h>. Bài viết này sẽ hướng dẫn bạn cách sử dụng hsearch() để tìm kiếm phần tử trong bảng băm đã tạo.

Khởi tạo bảng băm

Trước khi tìm hiểu cách tìm kiếm, chúng ta cần khởi tạo bảng băm. Việc này đã được thực hiện bởi hàm hcreate(size_t nel), nơi nel là số lượng phần tử dự kiến. Ví dụ:

#include <search.h>
#include <stdio.h>

int main() {
    if (hcreate(30) == 0) {
        fprintf(stderr, "Couldn't create hash table\n");
        return 1;
    }
    return 0;
}

Thêm phần tử vào bảng băm

Sau khi khởi tạo, chúng ta cần thêm các phần tử vào bảng băm. Để làm việc này, ta dùng hàm hsearch(ENTRY item, ACTION action). ENTRY là một cấu trúc bao gồm một con trỏ ký tự tới khoá và một con trỏ chung tới dữ liệu. ACTION là một liệt kê với hai giá trị có thể là ENTER (thêm phần tử) hoặc FIND (tìm kiếm phần tử).

Dưới đây là ví dụ về việc thêm phần tử:

#include <search.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    hcreate(30);

    ENTRY e;
    ENTRY *ep;

    e.key = "name";
    e.data = "John Doe";
    hsearch(e, ENTER);

    e.key = "age";
    e.data = "30";
    hsearch(e, ENTER);

    e.key = "city";
    e.data = "New York";
    hsearch(e, ENTER);

    // Tiếp tục với hsearch FIND bên dưới...
}

Tìm kiếm phần tử

Khi đã có các phần tử trong bảng băm, ta có thể tìm kiếm bất kỳ phần tử nào thông qua hsearch() với hành động FIND. Chẳng hạn:

// Tiếp theo đoạn mã trên...

    e.key = "name";
    ep = hsearch(e, FIND);
    if (ep != NULL) {
        printf("Found %s: %s\n", ep->key, (char *)ep->data);
    } else {
        printf("Key not found\n");
    }

    e.key = "city";
    ep = hsearch(e, FIND);
    if (ep != NULL) {
        printf("Found %s: %s\n", ep->key, (char *)ep->data);
    } else {
        printf("Key not found\n");
    }

    hdestroy(); // Hủy bảng băm
    return 0;
}

Giải thích

Trong đoạn mã trên, chúng ta đã khởi tạo bảng băm, thêm các phần tử bằng cách sử dụng hsearch với hành động ENTER. Sau đó, để tìm kiếm các phần tử, ta tạo một ENTRY chứa khoá cần tìm và gọi hsearch với hành động FIND.

Hàm hsearch trả về con trỏ tới phần tử tìm thấy. Nếu không tìm thấy, nó trả về NULL. Ngoài ra, đừng quên gọi hàm hdestroy() để giải phóng bộ nhớ mà bảng băm đã sử dụng sau khi hoàn tất các thao tác.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu cách tạo bảng băm, thêm các phần tử và tìm kiếm các phần tử này bằng hàm hsearch trong ngôn ngữ C. Việc sử dụng đúng cách các hàm này sẽ giúp quản lý dữ liệu của bạn hiệu quả hơn, đặc biệt trong các ứng dụng yêu cầu truy cập nhanh đến các phần tử dữ liệu.

Comments