×

Tạo bảng băm để tìm kiếm dữ liệu với hcreate() trong C

Để tối ưu hóa việc tìm kiếm và quản lý dữ liệu trong ngôn ngữ lập trình C, khái niệm bảng băm đã trở nên quan trọng và hữu ích. Bảng băm là một cấu trúc dữ liệu giúp lưu trữ và truy vấn dữ liệu một cách hiệu quả. Bảng băm trong C có thể được thực hiện thông qua thư viện tiêu chuẩn GNU C Library với các hàm như hcreate(), hsearch(), và hdestroy(). Bài viết này sẽ hướng dẫn bạn cách tạo và sử dụng bảng băm trong C bằng cách sử dụng các hàm này một cách cụ thể.

Khởi tạo bảng băm với hcreate()

Trước khi sử dụng bảng băm, ta phải khởi tạo nó bằng hàm hcreate(). Hàm này tạo ra một bảng băm với kích thước xác định bởi tham số truyền vào. Đối số của hàm hcreate() là một số nguyên xác định số lượng phần tử mà bảng băm có thể chứa.

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

int main() {
    // Khởi tạo bảng băm với dung lượng 30 phần tử
    if (hcreate(30) == 0) {
        fprintf(stderr, "Failed to create hash table\n");
        return 1;
    }

    // Các bước tiếp theo liên quan đến việc thêm, tìm kiếm và xóa phần tử trong bảng băm

    // Giải phóng bộ nhớ của bảng băm trước khi kết thúc chương trình
    hdestroy();
    return 0;
}

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

Sau khi đã khởi tạo bảng băm, để thêm phần tử vào bảng, ta sử dụng hàm hsearch(). Hàm này yêu cầu một cấu trúc đặc biệt có tên là ENTRY, chứa thông tin của phần tử cần thêm.

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

void add_entry(char *key, char *value) {
    ENTRY item;
    ENTRY *result;

    item.key = key;
    item.data = value;

    // Sử dụng hsearch() để thêm phần tử vào bảng băm
    result = hsearch(item, ENTER);

    if (result == NULL) {
        fprintf(stderr, "Failed to add entry to hash table\n");
    }
}

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

    add_entry("name", "John Doe");
    add_entry("email", "john.doe@example.com");

    //...

    hdestroy();
    return 0;
}

Tìm kiếm phần tử trong bảng băm

Tương tự, để tìm kiếm một phần tử trong bảng băm, ta cũng sử dụng hàm hsearch() nhưng với hành động FIND.

void find_entry(char *key) {
    ENTRY item;
    ENTRY *result;

    item.key = key;

    // Sử dụng hsearch() để tìm kiếm phần tử trong bảng băm
    result = hsearch(item, FIND);

    if (result != NULL) {
        printf("Found key '%s' with value '%s'\n", result->key, (char *)result->data);
    } else {
        printf("Key '%s' not found in hash table\n", key);
    }
}

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

    add_entry("name", "John Doe");
    add_entry("email", "john.doe@example.com");

    find_entry("name");
    find_entry("email");
    find_entry("phone");

    //...

    hdestroy();
    return 0;
}

Giải phóng tài nguyên khi kết thúc

Cuối cùng, để giải phóng tài nguyên đã sử dụng bởi bảng băm, ta sử dụng hàm hdestroy(). Hàm này sẽ làm sạch các phần tử trong bảng băm và giải phóng bộ nhớ.

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

    add_entry("name", "John Doe");
    add_entry("email", "john.doe@example.com");

    find_entry("name");
    find_entry("email");
    find_entry("phone");

    // Giải phóng bộ nhớ của bảng băm
    hdestroy();
    return 0;
}

Kết luận

Việc sử dụng các hàm hcreate(), hsearch(), và hdestroy() giúp chúng ta dễ dàng quản lý một bảng băm trong C. Thực hiện đúng các bước này sẽ giúp tối ưu hóa việc tìm kiếm dữ liệu, tiết kiệm thời gian và tài nguyên của hệ thống. Hy vọng rằng bài viết này đã cung cấp cho bạn những kiến thức cần thiết để triển khai và sử dụng bảng băm hiệu quả trong lập trình C.

Comments