哈希表电话号码查询系统
时间: 2023-06-07 17:08:55 浏览: 115
,你能否简单介绍一下哈希表的实现原理和优缺点?
哈希表是一种基于数组实现的数据结构,它利用哈希函数将键映射为数组索引。通过此方法,可以快速、高效地进行查找、插入和删除等操作。其实现原理是将键值通过哈希函数计算出唯一的哈希值,然后将哈希值与数组长度进行取模,得到键在数组中存储的位置。通过哈希函数的正确设计,可以保证数组的散列性和键的唯一性,来提高哈希表的查找速度和效率。
哈希表的优点是查找与操作速度快,时间复杂度O(1),适用于大量查找或索引数据的场景;合理设计哈希函数能够优化空间的利用率。
哈希表的缺点包括冲突的发生,冲突过多时会导致哈希表退化并且操作性能下降;哈希函数设计不好会产生哈希碰撞。
相关问题
c语言哈希表电话号码查询系统源代码
以下是一个简单的基于哈希表实现的电话号码查询系统的C语言源代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 100
typedef struct node {
char name[20];
char phone[20];
struct node *next;
} Node;
Node *table[TABLE_SIZE];
unsigned int hash(char *str) {
unsigned int hash = 5381;
int c;
while ((c = *str++))
hash = ((hash << 5) + hash) + c;
return hash % TABLE_SIZE;
}
Node *find(char *name) {
unsigned int index = hash(name);
Node *p;
for (p = table[index]; p != NULL; p = p->next)
if (strcmp(name, p->name) == 0)
return p;
return NULL;
}
void insert(char *name, char *phone) {
unsigned int index = hash(name);
Node *p;
for (p = table[index]; p != NULL; p = p->next)
if (strcmp(name, p->name) == 0) {
strcpy(p->phone, phone);
return;
}
p = (Node *) malloc(sizeof(Node));
strcpy(p->name, name);
strcpy(p->phone, phone);
p->next = table[index];
table[index] = p;
}
void delete(char *name) {
unsigned int index = hash(name);
Node *p, *q;
for (q = NULL, p = table[index]; p != NULL; q = p, p = p->next)
if (strcmp(name, p->name) == 0) {
if (q == NULL)
table[index] = p->next;
else
q->next = p->next;
free(p);
return;
}
}
void display() {
int i;
Node *p;
for (i = 0; i < TABLE_SIZE; ++i)
for (p = table[i]; p != NULL; p = p->next)
printf("%s\t%s\n", p->name, p->phone);
}
int main() {
char name[20], phone[20];
int choice;
while (1) {
printf("\nTelephone directory\n");
printf("1. Find\n2. Insert\n3. Delete\n4. Display\n5. Exit\n");
printf("Enter your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("Enter name: ");
scanf("%s", name);
Node *p = find(name);
if (p)
printf("%s\t%s\n", p->name, p->phone);
else
printf("Name not found\n");
break;
case 2:
printf("Enter name: ");
scanf("%s", name);
printf("Enter phone number: ");
scanf("%s", phone);
insert(name, phone);
break;
case 3:
printf("Enter name: ");
scanf("%s", name);
delete(name);
break;
case 4:
display();
break;
case 5:
exit(0);
default:
printf("Invalid choice\n");
}
}
return 0;
}
```
该程序使用了一个大小为100的哈希表来存储电话号码。它实现了四个基本操作:查找、插入、删除和显示。在运行程序时,用户可以选择要执行的操作。如果选择插入操作,则需要输入姓名和电话号码。如果选择查找操作,则需要输入姓名,程序将输出该姓名对应的电话号码。如果选择删除操作,则需要输入姓名,程序将从哈希表中删除该用户的信息。如果选择显示操作,则程序将输出哈希表中所有用户的姓名和电话号码。
哈希表实现电话号码查询系统
电话号码查询系统可以使用哈希表来实现,具体步骤如下:
1. 定义一个哈希表,将每个电话号码作为键值,将对应的信息作为值。
2. 将电话号码转换成哈希表的索引值,可以使用取模运算或者其他哈希算法。
3. 将每个电话号码及其对应信息插入哈希表中。
4. 当需要查询电话号码时,将该电话号码转换成哈希表的索引值,然后在哈希表中查找该索引对应的值即可。
5. 如果出现哈希冲突,可以使用链表或其他解决冲突的方法。
6. 在实现时需要考虑哈希表的大小、负载因子、扩容等问题,以及对哈希表进行增删改查的操作。
以上是哈希表实现电话号码查询系统的基本步骤,具体实现还需要根据实际情况进行调整和优化。