请使用c语言按下面给定的hash函数为字典(文件名dictionary3000.txt)中单词构造一个hash表,hash冲突时按字典序依次存放单词。hash查找遇到冲突时,采用链地址法处理,在冲突链表中找到或未找到(遇到第一个比待查找的单词大的单词或链表结束)便结束查找。 /* compute hash value for string */ #define NHASH 3001 #define MULT 37 unsigned int hash(char *str) { unsigned int h=0; char *p; for(p=str; *p!='\0'; p++) h = MULT*h + *p; return h % NHASH; }
时间: 2024-01-08 15:01:49 浏览: 66
以下是使用c语言按照给定的hash函数为字典构造一个hash表的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NHASH 3001
#define MULT 37
struct node {
char *word;
struct node *next;
};
struct node *hash_table[NHASH];
/* compute hash value for string */
unsigned int hash(char *str) {
unsigned int h = 0;
char *p;
for(p = str; *p != '\0'; p++)
h = MULT * h + *p;
return h % NHASH;
}
/* insert word into hash table */
void insert_word(char *word) {
unsigned int h = hash(word);
struct node *p = hash_table[h];
struct node *prev = NULL;
while(p != NULL && strcmp(word, p->word) > 0) {
prev = p;
p = p->next;
}
struct node *new_node = (struct node*)malloc(sizeof(struct node));
new_node->word = word;
new_node->next = p;
if(prev == NULL)
hash_table[h] = new_node;
else
prev->next = new_node;
}
/* search word in hash table */
struct node* search_word(char *word) {
unsigned int h = hash(word);
struct node *p = hash_table[h];
while(p != NULL && strcmp(word, p->word) >= 0) {
if(strcmp(word, p->word) == 0)
return p;
p = p->next;
}
return NULL;
}
/* main function */
int main() {
FILE *fp = fopen("dictionary3000.txt", "r");
char word[100];
while(fgets(word, 100, fp) != NULL) {
int len = strlen(word);
if(word[len-1] == '\n')
word[len-1] = '\0';
insert_word(word);
}
fclose(fp);
char search_word[100];
printf("Enter a word to search: ");
scanf("%s", search_word);
struct node *p = search_word(search_word);
if(p != NULL)
printf("Found word: %s\n", p->word);
else
printf("Word not found.\n");
return 0;
}
```
在这个示例代码中,我们定义了一个结构体`node`,用于表示hash表中的一个节点,其中包含一个单词和指向下一个节点的指针。我们还定义了一个全局数组`hash_table`,用于存储所有的节点。
在`insert_word`函数中,我们首先计算出单词的hash值,然后遍历hash链表,找到第一个比待插入的单词大的单词或者链表结束的位置,然后在这个位置插入一个新的节点。
在`search_word`函数中,我们首先计算出待查找单词的hash值,然后遍历hash链表,找到第一个比待查找的单词大的单词或者链表结束的位置,然后判断这个位置上的单词是否与待查找单词相等,如果相等则返回这个节点,否则继续遍历链表。
在main函数中,我们首先打开字典文件,然后逐行读取所有的单词并插入到hash表中。然后让用户输入一个待查找的单词,调用`search_word`函数查找这个单词,并输出结果。
阅读全文