c语言实现哈希表(链地址法)
时间: 2023-08-04 13:03:21 浏览: 191
下面是一个简单的C语言实现哈希表(链地址法)的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10 // 哈希表大小
// 哈希表节点结构体
typedef struct Node {
int data;
struct Node *next;
} Node;
// 哈希表结构体
typedef struct HashTable {
Node *head[SIZE];
} HashTable;
// 哈希函数
int hash(int data) {
return data % SIZE;
}
// 初始化哈希表
HashTable* init() {
HashTable *hashTable = (HashTable*)malloc(sizeof(HashTable));
for (int i = 0; i < SIZE; i++) {
hashTable->head[i] = NULL;
}
return hashTable;
}
// 插入数据
void insert(HashTable *hashTable, int data) {
int key = hash(data);
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (hashTable->head[key] == NULL) {
hashTable->head[key] = node;
} else {
Node *p = hashTable->head[key];
while (p->next != NULL) {
p = p->next;
}
p->next = node;
}
}
// 查找数据
int search(HashTable *hashTable, int data) {
int key = hash(data);
Node *p = hashTable->head[key];
while (p != NULL) {
if (p->data == data) {
return 1;
}
p = p->next;
}
return 0;
}
// 删除数据
void delete(HashTable *hashTable, int data) {
int key = hash(data);
Node *p = hashTable->head[key];
Node *prev = NULL;
while (p != NULL) {
if (p->data == data) {
if (prev == NULL) {
hashTable->head[key] = p->next;
} else {
prev->next = p->next;
}
free(p);
return;
}
prev = p;
p = p->next;
}
}
// 打印哈希表
void print(HashTable *hashTable) {
for (int i = 0; i < SIZE; i++) {
printf("%d: ", i);
Node *p = hashTable->head[i];
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
int main() {
HashTable *hashTable = init();
insert(hashTable, 1);
insert(hashTable, 11);
insert(hashTable, 21);
insert(hashTable, 31);
insert(hashTable, 41);
print(hashTable);
printf("search %d: %d\n", 11, search(hashTable, 11));
printf("search %d: %d\n", 12, search(hashTable, 12));
delete(hashTable, 11);
print(hashTable);
return 0;
}
```
以上代码中,哈希表使用链表法解决哈希冲突。其中,哈希表结构体中包含一个指向节点链表头的指针数组,节点结构体包含一个数据域和一个指向下一个节点的指针。初始化哈希表时,将每个链表头初始化为NULL。插入数据时,先计算数据的哈希值,然后将节点插入到对应的链表尾部。查找数据时,先计算数据的哈希值,然后遍历对应链表查找数据。删除数据时,也是先计算数据的哈希值,然后遍历对应链表查找数据,找到后删除节点并释放空间。最后,打印哈希表时,遍历指针数组中的每个链表,输出链表中的数据。
阅读全文