哈希表数据结构c语言代码
时间: 2023-12-04 13:04:12 浏览: 36
以下是一个简单的哈希表数据结构的C语言实现代码,包括头文件和实现文件:
头文件hash.h:
```c
#ifndef HASH_H
#define HASH_H
typedef struct Hash {
int key;
int val;
struct Hash *next;
} Hash;
typedef struct {
int size;
Hash **table;
} HashTable;
HashTable *createHashTable(int size);
void destroyHashTable(HashTable *ht);
void insert(HashTable *ht, int key, int val);
int search(HashTable *ht, int key);
void delete(HashTable *ht, int key);
#endif
```
实现文件hash.c:
```c
#include <stdio.h>
#include <stdlib.h>
#include "hash.h"
HashTable *createHashTable(int size) {
HashTable *ht = (HashTable *)malloc(sizeof(HashTable));
ht->size = size;
ht->table = (Hash **)calloc(size, sizeof(Hash *));
return ht;
}
void destroyHashTable(HashTable *ht) {
for (int i = 0; i < ht->size; i++) {
Hash *node = ht->table[i];
while (node != NULL) {
Hash *temp = node;
node = node->next;
free(temp);
}
}
free(ht->table);
free(ht);
}
void insert(HashTable *ht, int key, int val) {
int index = key % ht->size;
Hash *node = ht->table[index];
while (node != NULL) {
if (node->key == key) {
node->val = val;
return;
}
node = node->next;
}
Hash *newNode = (Hash *)malloc(sizeof(Hash));
newNode->key = key;
newNode->val = val;
newNode->next = ht->table[index];
ht->table[index] = newNode;
}
int search(HashTable *ht, int key) {
int index = key % ht->size;
Hash *node = ht->table[index];
while (node != NULL) {
if (node->key == key) {
return node->val;
}
node = node->next;
}
return -1;
}
void delete(HashTable *ht, int key) {
int index = key % ht->size;
Hash *node = ht->table[index];
Hash *prev = NULL;
while (node != NULL) {
if (node->key == key) {
if (prev == NULL) {
ht->table[index] = node->next;
} else {
prev->next = node->next;
}
free(node);
return;
}
prev = node;
node = node->next;
}
}
```
使用示例:
```c
#include <stdio.h>
#include "hash.h"
int main() {
HashTable *ht = createHashTable(10);
insert(ht, 1, 10);
insert(ht, 2, 20);
insert(ht, 11, 30);
printf("%d\n", search(ht, 1)); // 输出:10
printf("%d\n", search(ht, 2)); // 输出:20
printf("%d\n", search(ht, 11)); // 输出:30
delete(ht, 2);
printf("%d\n", search(ht, 2)); // 输出:-1
destroyHashTable(ht);
return 0;
}
```