用c语言写他的完整程序
时间: 2023-11-27 07:06:24 浏览: 28
好的,下面是一个使用 C 语言实现的散列查找程序的示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 哈希表的最大长度
typedef struct node {
char *key; // 关键字
struct node *next; // 指向下一个节点的指针
} Node;
typedef struct {
Node *head; // 指向链表头节点的指针
} Bucket;
typedef struct {
Bucket table[MAX_SIZE]; // 哈希表
int count; // 哈希表中元素的个数
} HashTable;
// 哈希函数
int hash(char *key) {
unsigned int hashval = 0;
for (int i = 0; i < strlen(key); i++) {
hashval = hashval * 31 + key[i];
}
return hashval % MAX_SIZE;
}
// 创建一个新节点
Node *new_node(char *key) {
Node *node = (Node *)malloc(sizeof(Node));
node->key = key;
node->next = NULL;
return node;
}
// 初始化哈希表
void init_hash_table(HashTable *ht) {
ht->count = 0;
for (int i = 0; i < MAX_SIZE; i++) {
ht->table[i].head = NULL;
}
}
// 向哈希表中插入元素
void insert(HashTable *ht, char *key) {
int index = hash(key);
Node *node = new_node(key);
node->next = ht->table[index].head;
ht->table[index].head = node;
ht->count++;
}
// 在哈希表中查找元素
int search(HashTable *ht, char *key) {
int index = hash(key);
Node *node = ht->table[index].head;
int count = 0;
while (node != NULL) {
count++;
if (strcmp(node->key, key) == 0) {
return count;
}
node = node->next;
}
return -1;
}
int main() {
HashTable ht;
init_hash_table(&ht);
insert(&ht, "hello");
insert(&ht, "world");
insert(&ht, "hash");
insert(&ht, "table");
insert(&ht, "search");
printf("Comparisons: %d\n", search(&ht, "table"));
return 0;
}
```
在这个示例程序中,我们定义了一个 `HashTable` 结构体来表示哈希表,其中包含一个 `table` 数组和一个 `count` 变量。`table` 数组中的每个元素都是一个 `Bucket` 结构体,包含一个指向链表头节点的指针 `head`。通过调用 `hash()` 函数,我们可以将关键字映射到哈希表中的位置,并将元素插入到对应的链表中。在查找元素时,我们使用 `search()` 函数来遍历对应的链表,并返回比较次数。
需要注意的是,在插入元素时,我们使用了动态内存分配来创建新节点,并将它插入到链表的头部。在实际应用中,我们需要注意内存泄漏的问题,及时释放不再使用的节点。
以上是一个简单的散列查找程序的示例,你可以根据你的具体需求进行修改和扩展。