c语言编写命名实体映射
时间: 2023-10-24 13:06:00 浏览: 77
命名实体映射通常是使用哈希表来实现的。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义哈希表节点
typedef struct hash_node {
char* key; // 键
char* value; // 值
struct hash_node* next; // 链表指针
} hash_node;
// 定义哈希表
typedef struct hash_table {
int size; // 哈希表大小
hash_node** table; // 哈希表数组
} hash_table;
// 哈希函数
int hash_func(char* key, int size) {
int hash = 0;
for (int i = 0; key[i] != '\0'; i++) {
hash += key[i];
}
return hash % size;
}
// 创建哈希表
hash_table* create_hash_table(int size) {
hash_table* table = malloc(sizeof(hash_table));
table->size = size;
table->table = malloc(sizeof(hash_node*) * size);
for (int i = 0; i < size; i++) {
table->table[i] = NULL;
}
return table;
}
// 添加哈希表节点
void add_hash_node(hash_table* table, char* key, char* value) {
int index = hash_func(key, table->size);
hash_node* node = table->table[index];
while (node != NULL) {
if (strcmp(node->key, key) == 0) {
// 键已存在,更新值
node->value = value;
return;
}
node = node->next;
}
// 键不存在,新建节点
node = malloc(sizeof(hash_node));
node->key = key;
node->value = value;
node->next = table->table[index];
table->table[index] = node;
}
// 查找哈希表节点
char* find_hash_node(hash_table* table, char* key) {
int index = hash_func(key, table->size);
hash_node* node = table->table[index];
while (node != NULL) {
if (strcmp(node->key, key) == 0) {
// 键存在,返回值
return node->value;
}
node = node->next;
}
// 键不存在,返回 NULL
return NULL;
}
// 销毁哈希表
void destroy_hash_table(hash_table* table) {
for (int i = 0; i < table->size; i++) {
hash_node* node = table->table[i];
while (node != NULL) {
hash_node* next = node->next;
free(node);
node = next;
}
}
free(table->table);
free(table);
}
// 示例代码
int main() {
hash_table* table = create_hash_table(100);
add_hash_node(table, "apple", "苹果");
add_hash_node(table, "banana", "香蕉");
add_hash_node(table, "orange", "橙子");
char* value = find_hash_node(table, "banana");
if (value != NULL) {
printf("%s\n", value);
}
destroy_hash_table(table);
return 0;
}
```
在这个示例中,我们使用了一个简单的哈希函数:将键中每个字符的 ASCII 码相加,然后取余哈希表大小。当键冲突时,我们使用了链表来解决冲突。这个示例只是一个简单的实现,实际应用中可能需要根据具体情况进行调整。
阅读全文