散列插入c语言写出
时间: 2023-07-03 10:21:27 浏览: 93
c 编写的散列法研究
下面是一个简单的散列插入的 C 语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_KEY_SIZE 128
#define TABLE_SIZE 100
struct element {
char key[MAX_KEY_SIZE];
// 其他元素信息...
};
struct list {
struct element item;
struct list* next;
};
typedef struct list* list_pointer;
list_pointer hash_table[TABLE_SIZE];
int hash(char* key) {
int hash_val = 0;
while (*key != '\0') {
hash_val = (hash_val << 4) + (*key++);
}
return (hash_val % TABLE_SIZE);
}
int insert(struct element item, list_pointer ht[]) {
int hash_val = hash(item.key);
list_pointer ptr = ht[hash_val];
while (ptr != NULL && strcmp(ptr->item.key, item.key) != 0) {
ptr = ptr->next;
}
if (ptr != NULL) {
printf("The key is already in the table.\n");
return 0;
}
ptr = (list_pointer)malloc(sizeof(struct list));
ptr->item = item;
ptr->next = ht[hash_val];
ht[hash_val] = ptr;
printf("The element has been inserted into the table.\n");
return 1;
}
int main() {
struct element item1 = {"apple"};
struct element item2 = {"banana"};
insert(item1, hash_table);
insert(item2, hash_table);
return 0;
}
```
在上面的代码中,我们首先定义了一个元素结构体 `element`,其中包含一个关键字 `key` 和其他元素信息。然后,我们定义了一个链表结构体 `list`,其中包含一个元素项和指向下一个节点的指针。我们还定义了一个指向链表节点的指针类型 `list_pointer` 和一个散列表 `hash_table`,用于存储元素。
在 `hash` 函数中,我们使用了一种简单的哈希算法,将关键字转换为一个整数值,然后对散列表的大小取模,得到对应的散列表索引。
在 `insert` 函数中,我们首先计算元素的哈希值,并遍历对应位置的链表,查找是否已经存在相同的元素。如果存在,则说明该元素已经在散列表中,直接返回 0。如果不存在,则需要在链表的头部插入该元素。
最后,在 `main` 函数中,我们简单地创建了两个元素并分别插入它们。
阅读全文