01_data_struct_hashtable

1.hashtable的定义

2.hashtable的测试代码

#include <stdio.h>
#include <stdlib.h>
#include "main.h"

#define TABLE_SIZE 10

typedef struct Node {
    int key;
    int value;
    struct Node* next;
} Node;

typedef struct {
    Node* head;
} HashTable;

HashTable* createHashTable() {
    HashTable* hashtable = (HashTable*)malloc(sizeof(HashTable) * TABLE_SIZE);
    for (int i = 0; i < TABLE_SIZE; i++) {
        hashtable[i].head = NULL;
    }
    return hashtable;
}

int hashFunction(int key) {
    return key % TABLE_SIZE;
}

void insert(HashTable* hashtable, int key, int value) {
    int index = hashFunction(key);
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->key = key;
    newNode->value = value;
    newNode->next = NULL;

    if (hashtable[index].head == NULL) {
        hashtable[index].head = newNode;
    }
    else {
        Node* currentNode = hashtable[index].head;
        while (currentNode->next != NULL) {
            currentNode = currentNode->next;
        }
        currentNode->next = newNode;
    }
}

int search(HashTable* hashtable, int key) {
    int index = hashFunction(key);
    Node* currentNode = hashtable[index].head;

    while (currentNode != NULL) {
        if (currentNode->key == key) {
            return currentNode->value;
        }
        currentNode = currentNode->next;
    }

    return -1; // 返回-1表示未找到对应的值
}

void delete(HashTable* hashtable, int key) {
    int index = hashFunction(key);
    Node* currentNode = hashtable[index].head;
    Node* prevNode = NULL;

    while (currentNode != NULL) {
        if (currentNode->key == key) {
            if (prevNode == NULL) {
                hashtable[index].head = currentNode->next;
            }
            else {
                prevNode->next = currentNode->next;
            }
            free(currentNode);
            return;
        }
        prevNode = currentNode;
        currentNode = currentNode->next;
    }
}

void display(HashTable* hashtable) {
    for (int i = 0; i < TABLE_SIZE; i++) {
        printf("Index %d: ", i);
        Node* currentNode = hashtable[i].head;
        while (currentNode != NULL) {
            printf("(%d, %d) ", currentNode->key, currentNode->value);
            currentNode = currentNode->next;
        }
        printf("\n");
    }
}

void destroyHashTable(HashTable* hashtable) {
    for (int i = 0; i < TABLE_SIZE; i++) {
        Node* currentNode = hashtable[i].head;
        while (currentNode != NULL) {
            Node* tempNode = currentNode;
            currentNode = currentNode->next;
            free(tempNode);
        }
    }
    free(hashtable);
}

int hash_table_test() {
    HashTable* hashtable = createHashTable();

    insert(hashtable, 1, 10);
    insert(hashtable, 2, 20);
    insert(hashtable, 11, 30);
    insert(hashtable, 21, 40);
    insert(hashtable, 12, 50);

    printf("Initial hash table:\n");
    display(hashtable);

    int keyToSearch = 11;
    int searchResult = search(hashtable, keyToSearch);
    if (searchResult != -1) {
        printf("Value found for key %d: %d\n", keyToSearch, searchResult);
    }
    else {
        printf("Value not found for key %d\n", keyToSearch);
    }

    int keyToDelete = 2;
    delete(hashtable, keyToDelete);
    printf("Hash table after deletion of key %d:\n", keyToDelete);
    display(hashtable);

    destroyHashTable(hashtable);

    return 0;
}

3.程序运行结果如下图:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值