编辑代码

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 定义散列表的节点
typedef struct Node {
    int key;
    struct Node* next;
} Node;

// 定义散列表
typedef struct HashTable {
    int size;
    Node** table;
} HashTable;

// 创建一个新的散列表
HashTable* createHashTable(int size) {
    HashTable* hashTable = (HashTable*)malloc(sizeof(HashTable));
    hashTable->size = size;
    hashTable->table = (Node**)malloc(sizeof(Node*) * size);
    
    // 初始化散列表的每个位置为空
    for (int i = 0; i < size; i++) {
        hashTable->table[i] = NULL;
    }
    
    return hashTable;
}

// 哈希函数
int hashFunction(int key, int size) {
    return key % size;
}

// 在散列表中插入一个新的键值对
void insert(HashTable* hashTable, int key) {
    int index = hashFunction(key, hashTable->size);
    
    // 检查是否已存在相同的键
    Node* current = hashTable->table[index];
    while (current != NULL) {
        if (current->key == key) {
            printf("重复投票: %d\n", key);
            return;
        }
        current = current->next;
    }
    
    // 在链表头部插入新节点
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->key = key;
    newNode->next = hashTable->table[index];
    hashTable->table[index] = newNode;
    
    printf("投票成功: %d\n", key);
}

// 销毁散列表
void destroyHashTable(HashTable* hashTable) {
    for (int i = 0; i < hashTable->size; i++) {
        Node* current = hashTable->table[i];
        while (current != NULL) {
            Node* temp = current;
            current = current->next;
            free(temp);
        }
    }
    free(hashTable->table);
    free(hashTable);
}

int main() {
    int size = 10; // 散列表的大小
    HashTable* hashTable = createHashTable(size);
    
    // 模拟投票过程
    insert(hashTable, 1);
    insert(hashTable, 2);
    insert(hashTable, 3);
    insert(hashTable, 3); // 重复投票
    
    destroyHashTable(hashTable);
    
    return 0;
}