编辑代码

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

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

// 定义散列表
typedef struct {
    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* newNode = (Node*)malloc(sizeof(Node));
    newNode->key = key;
    newNode->next = NULL;

    // 插入节点到链表头部
    newNode->next = hashTable->table[index];
    hashTable->table[index] = newNode;
}

// 检查是否已经投过票
bool hasVoted(HashTable* hashTable, int key) {
    int index = hashFunction(key, hashTable->size);

    // 在链表中查找键值对
    Node* current = hashTable->table[index];
    while (current != NULL) {
        if (current->key == key)
            return true;
        current = current->next;
    }

    return false;
}

int main() {
    int votes[] = {1, 2, 3, 1, 2, 4, 5, 3, 6, 7, 1};
    int numVotes = sizeof(votes) / sizeof(votes[0]);

    // 创建散列表,假设散列表大小为两倍投票选项的数量
    HashTable* hashTable = createHashTable(2 * numVotes);

    printf("投票结果:\n");
    for (int i = 0; i < numVotes; i++) {
        int vote = votes[i];
        if (!hasVoted(hashTable, vote)) {
            printf("投票给 %d\n", vote);
            insert(hashTable, vote);
        } else {
            printf("已经投过票给 %d,不能重复投票\n", vote);
        }
    }

    // 释放散列表的内存
    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);

    return 0;
}