c语言中文人名哈希表
时间: 2024-10-21 09:03:28 浏览: 36
C语言:基于哈希表的姓名查找(含完整注释)
5星 · 资源好评率100%
在C语言中,创建一个包含中文人名的哈希表(也叫散列表或关联数组)通常会涉及到字符串处理、哈希函数计算以及动态内存分配。以下是一个简单的示例:
首先,你需要一个哈希函数,用于将中文姓名映射到哈希表中的索引。由于中文字符不是单字节,可以考虑使用UTF-8编码的每个字符的ASCII码值的组合。
```c
#include <stdio.h>
#include <string.h>
// 假设我们使用一个简单的平均值哈希函数,这里仅做演示
size_t hash_function(const char* name) {
size_t hash = 0;
for (const unsigned char *p = (unsigned char*)name; *p != '\0'; ++p) {
hash += p[0];
}
return hash % TABLE_SIZE; // 表大小为TABLE_SIZE
}
typedef struct Entry {
char* name;
int value;
} Entry;
typedef struct HashTable {
Entry** table; // 指向Entry的指针数组
size_t size;
} HashTable;
HashTable* create_hash_table(size_t size) {
HashTable* htable = malloc(sizeof(HashTable));
htable->table = malloc(size * sizeof(Entry*));
htable->size = size;
memset(htable->table, 0, size * sizeof(Entry*));
return htable;
}
// 添加元素
void insert(HashTable* htable, const char* name, int value) {
size_t index = hash_function(name);
if (!htable->table[index]) {
htable->table[index] = malloc(sizeof(Entry));
htable->table[index]->name = strdup(name); // 深拷贝名称防止冲突
htable->table[index]->value = value;
} else {
printf("Name already exists in the table.\n");
}
}
// 示例操作,这里假设有一个哈希表h
// ...
```
注意,这只是一个基础的示例,并未处理冲突(两个名字哈希到相同的索引),实际应用中你可能需要使用链地址法或者其他解决碰撞的策略。
阅读全文