电话号码查询系统 [基本要求] (1)使用哈希查找表存储信息 (2)实现查找、插入、删除、统计、输出等功能。 提示: (1)构建电话号码表 (2)编写一个电话号码查询系统,要求实现对电话号码记录的录入(插入)存储、查询、记录删除、排序、打印等的具体c语言代码
时间: 2023-11-27 07:03:10 浏览: 90
好的,下面是一个简单的电话号码查询系统的C语言代码实现,实现了对电话号码记录的录入(插入)存储、查询、记录删除、排序、打印等功能:
```c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_SIZE 1000 // 定义哈希表最大容量
#define EMPTY_NODE -1 // 定义空节点的值为-1
// 定义电话号码信息结构体
typedef struct phone_info {
char name[20]; // 姓名
char phone[20]; // 电话号码
char address[50]; // 地址
} PhoneInfo;
// 定义哈希表节点结构体
typedef struct hash_node {
int key; // 哈希值
PhoneInfo info; // 电话号码信息
} HashNode;
// 定义哈希表结构体
typedef struct hash_table {
HashNode nodes[MAX_SIZE]; // 哈希表节点数组
int size; // 哈希表当前存储的节点数量
} HashTable;
// 初始化哈希表
void initHashTable(HashTable *table) {
int i;
for (i = 0; i < MAX_SIZE; i++) {
table->nodes[i].key = EMPTY_NODE; // 初始化哈希表节点的key为-1
}
table->size = 0; // 初始化哈希表节点数量为0
}
// 计算哈希值
int hash(char *str) {
int hash = 0;
while (*str) {
hash = (hash << 5) + hash + (*str++); // 使用BKDR哈希算法
}
return (hash & 0x7FFFFFFF) % MAX_SIZE;
}
// 插入电话号码记录
void insertPhoneInfo(HashTable *table, PhoneInfo info) {
if (table->size >= MAX_SIZE) { // 当哈希表已满时,无法插入
printf("Error: Hash table is full!\n");
return;
}
int key = hash(info.phone); // 计算电话号码的哈希值
while (table->nodes[key].key != EMPTY_NODE) { // 处理哈希冲突
key = (key + 1) % MAX_SIZE;
}
table->nodes[key].key = key;
table->nodes[key].info = info;
table->size++;
printf("Insert success!\n");
}
// 查询电话号码记录
void searchPhoneInfo(HashTable *table, char *phone) {
int key = hash(phone); // 计算电话号码的哈希值
while (table->nodes[key].key != EMPTY_NODE) { // 处理哈希冲突
if (strcmp(table->nodes[key].info.phone, phone) == 0) { // 找到对应电话号码的记录
printf("Name: %s\n", table->nodes[key].info.name);
printf("Phone: %s\n", table->nodes[key].info.phone);
printf("Address: %s\n", table->nodes[key].info.address);
return;
}
key = (key + 1) % MAX_SIZE;
}
printf("Not found!\n"); // 未找到对应电话号码的记录
}
// 删除电话号码记录
void deletePhoneInfo(HashTable *table, char *phone) {
int key = hash(phone); // 计算电话号码的哈希值
while (table->nodes[key].key != EMPTY_NODE) { // 处理哈希冲突
if (strcmp(table->nodes[key].info.phone, phone) == 0) { // 找到对应电话号码的记录
table->nodes[key].key = EMPTY_NODE;
table->size--;
printf("Delete success!\n");
return;
}
key = (key + 1) % MAX_SIZE;
}
printf("Not found!\n"); // 未找到对应电话号码的记录
}
// 统计电话号码记录
void countPhoneInfo(HashTable *table) {
int i;
int total = 0;
int count = 0;
for (i = 0; i < MAX_SIZE; i++) {
if (table->nodes[i].key != EMPTY_NODE) {
total++; // 记录数量加1
count++; // 桶中记录数量加1
}
if (i == MAX_SIZE - 1 || table->nodes[i + 1].key == EMPTY_NODE) {
if (count > 0) {
printf("Bucket %d has %d records\n", i, count);
}
count = 0;
}
}
printf("Total records: %d\n", total);
printf("Total buckets: %d\n", MAX_SIZE);
printf("Average records per bucket: %.2f\n", (float)total / MAX_SIZE);
}
// 排序电话号码记录
int comparePhoneInfo(PhoneInfo info1, PhoneInfo info2) {
return strcmp(info1.name, info2.name); // 按照姓名进行排序
}
void sortPhoneInfo(HashTable *table) {
int i, j;
for (i = 0; i < MAX_SIZE - 1; i++) {
if (table->nodes[i].key != EMPTY_NODE) {
for (j = i + 1; j < MAX_SIZE; j++) {
if (table->nodes[j].key != EMPTY_NODE) {
if (comparePhoneInfo(table->nodes[i].info, table->nodes[j].info) > 0) {
HashNode temp = table->nodes[i];
table->nodes[i] = table->nodes[j];
table->nodes[j] = temp;
}
}
}
}
}
printf("Sort success!\n");
}
// 打印电话号码记录
void printPhoneInfo(HashTable *table) {
int i;
for (i = 0; i < MAX_SIZE; i++) {
if (table->nodes[i].key != EMPTY_NODE) {
printf("Name: %s\n", table->nodes[i].info.name);
printf("Phone: %s\n", table->nodes[i].info.phone);
printf("Address: %s\n", table->nodes[i].info.address);
printf("\n");
}
}
}
int main() {
HashTable table;
initHashTable(&table);
// 插入电话号码记录
PhoneInfo info1 = {"Tom", "12345678", "Beijing"};
insertPhoneInfo(&table, info1);
PhoneInfo info2 = {"Jerry", "87654321", "Shanghai"};
insertPhoneInfo(&table, info2);
PhoneInfo info3 = {"Lucy", "45678901", "Guangzhou"};
insertPhoneInfo(&table, info3);
// 查询电话号码记录
searchPhoneInfo(&table, "12345678");
// 删除电话号码记录
deletePhoneInfo(&table, "87654321");
// 统计电话号码记录
countPhoneInfo(&table);
// 排序电话号码记录
sortPhoneInfo(&table);
// 打印电话号码记录
printPhoneInfo(&table);
return 0;
}
```
以上是一个简单的电话号码查询系统的C语言代码实现,可以根据实际情况进行扩展和优化。
阅读全文