电话号码查询系统 [基本要求] (1)使用哈希查找表存储信息 (2)实现查找、插入、删除、统计、输出等功能。 提示: (1)构建电话号码表 (2)编写一个电话号码查询系统,要求实现对电话号码记录的录入(插入)存储、查询、记录删除、排序、打印等模块的具体c语言代码
时间: 2023-12-20 10:05:57 浏览: 139
以下是一个基于哈希表的电话号码查询系统的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100 // 哈希表的大小
// 电话号码节点结构体
typedef struct PhoneNode {
char name[20]; // 姓名
char number[12]; // 电话号码
struct PhoneNode *next; // 下一个节点指针
} PhoneNode;
// 哈希表结构体
typedef struct HashTable {
PhoneNode *data[SIZE]; // 存储节点的数组
} HashTable;
// 哈希函数,将字符串转换为哈希表的索引
int hash(char *s) {
int hash = 0;
for (int i = 0; s[i]; i++) {
hash = (hash * 31 + s[i]) % SIZE;
}
return hash;
}
// 创建一个新的电话号码节点
PhoneNode *create_node(char *name, char *number) {
PhoneNode *node = (PhoneNode *)malloc(sizeof(PhoneNode));
strcpy(node->name, name);
strcpy(node->number, number);
node->next = NULL;
return node;
}
// 在哈希表中查找指定姓名的电话号码
char *find_number(HashTable *hash_table, char *name) {
int index = hash(name);
PhoneNode *node = hash_table->data[index];
while (node) {
if (strcmp(node->name, name) == 0) {
return node->number;
}
node = node->next;
}
return NULL;
}
// 向哈希表中插入一个电话号码节点
void insert_node(HashTable *hash_table, char *name, char *number) {
int index = hash(name);
PhoneNode *node = hash_table->data[index];
if (node == NULL) {
hash_table->data[index] = create_node(name, number);
} else {
while (node->next) {
node = node->next;
}
node->next = create_node(name, number);
}
}
// 从哈希表中删除指定姓名的电话号码节点
void delete_node(HashTable *hash_table, char *name) {
int index = hash(name);
PhoneNode *node = hash_table->data[index];
if (node == NULL) {
return;
}
if (strcmp(node->name, name) == 0) {
hash_table->data[index] = node->next;
free(node);
return;
}
while (node->next) {
if (strcmp(node->next->name, name) == 0) {
PhoneNode *temp = node->next;
node->next = temp->next;
free(temp);
return;
}
node = node->next;
}
}
// 统计哈希表中电话号码节点的个数
int count_nodes(HashTable *hash_table) {
int count = 0;
for (int i = 0; i < SIZE; i++) {
PhoneNode *node = hash_table->data[i];
while (node) {
count++;
node = node->next;
}
}
return count;
}
// 输出哈希表中的所有电话号码节点
void print_nodes(HashTable *hash_table) {
for (int i = 0; i < SIZE; i++) {
PhoneNode *node = hash_table->data[i];
while (node) {
printf("%s\t%s\n", node->name, node->number);
node = node->next;
}
}
}
int main() {
HashTable hash_table;
memset(&hash_table, 0, sizeof(hash_table));
// 插入节点
insert_node(&hash_table, "Alice", "1234567890");
insert_node(&hash_table, "Bob", "2345678901");
insert_node(&hash_table, "Charlie", "3456789012");
// 查找节点
char *number = find_number(&hash_table, "Alice");
if (number) {
printf("Alice's number is %s\n", number);
} else {
printf("Alice is not in the phonebook\n");
}
// 删除节点
delete_node(&hash_table, "Bob");
// 统计节点个数
int count = count_nodes(&hash_table);
printf("There are %d phone numbers in the phonebook\n", count);
// 输出所有节点
print_nodes(&hash_table);
return 0;
}
```
这个程序使用哈希表存储电话号码节点,支持插入、查找、删除、统计和输出节点的操作。哈希函数使用了简单的取模方法,将姓名字符串转换为哈希表的索引。由于哈希表可能会出现哈希冲突,所以每个索引位置都是一个指向链表的指针,用于存储多个节点。
阅读全文