用c的哈希表写通讯录
时间: 2024-09-19 13:12:12 浏览: 46
在C语言中,使用哈希表(如数组结合链表、开放寻址法等数据结构)编写一个简单的通讯录程序,可以按照名字或电话号码作为键值对存储联系人信息。下面是一个基本的示例,我们将使用数组和链表实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体表示联系人
typedef struct {
char name[50];
char phone[20];
} Contact;
#define HASH_SIZE 100 // 哈希表大小
// 哈希函数,这里简化为取字符串长度对哈希表大小取余
int hash_func(const char *key) {
int len = strlen(key);
return len % HASH_SIZE;
}
// 哈希表节点
typedef struct Node {
Contact contact;
struct Node* next;
} Node;
// 哈希表容器
Node** hash_table;
// 初始化哈希表
void init_hash_table() {
hash_table = (Node**)malloc(sizeof(Node*) * HASH_SIZE);
for (int i = 0; i < HASH_SIZE; i++) {
hash_table[i] = NULL;
}
}
// 插入联系人到哈希表
void insert_contact(char *name, char *phone) {
int index = hash_func(name);
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return;
}
newNode->contact.name = malloc(strlen(name) + 1); // 分配空间并复制名字
strncpy(newNode->contact.name, name, strlen(name) + 1);
newNode->contact.phone = malloc(strlen(phone) + 1);
strncpy(newNode->contact.phone, phone, strlen(phone) + 1);
newNode->next = hash_table[index]; // 将新节点放在相应位置
hash_table[index] = newNode;
}
// 查找联系人
Contact* find_contact(char *name) {
int index = hash_func(name);
Node* current = hash_table[index];
while (current != NULL) {
if (strcmp(current->contact.name, name) == 0) {
return ¤t->contact;
}
current = current->next;
}
return NULL; // 如果没找到,返回NULL
}
// 示例使用
int main() {
init_hash_table();
insert_contact("Alice", "1234567890");
insert_contact("Bob", "9876543210");
Contact* foundContact = find_contact("Alice");
if (foundContact) {
printf("Found Alice with phone: %s\n", foundContact->phone);
} else {
printf("Alice not found.\n");
}
free(hash_table);
return 0;
}
```
阅读全文