c语言哈希表就基本操作
时间: 2023-05-16 16:03:17 浏览: 167
哈希表(Hash Table)是一种又称为散列表的数据结构,它的主要目的是用于快速查找,它能够通过关键字快速确定唯一的数据位置,从而实现常数时间复杂度的查找。在C语言中,哈希表也拥有基本操作,下面是我对这些操作的简介:
1. 初始化哈希表:初始化哈希表需要确定哈希表的大小(通常是质数),并申请一块连续的内存空间用来存储哈希表的数据。同时,需要设置哈希表的散列函数。
2. 插入数据:首先,需要通过散列函数计算出数据所应该存储的位置,然后将数据存入哈希表中。如果该位置已经被占用,则需要进行解决冲突的处理,通常使用的是开放地址法或链地址法。
3. 查找数据:同样需要通过散列函数计算出数据所存储的位置,然后在哈希表中查找是否存在该数据。如果该位置为空,表示数据不存在;如果不为空,需要比较关键字是否与要查找的一致。
4. 删除数据:与插入数据类似,需要先计算出数据所存储的位置,然后将该位置设置为空。如果该位置处存在多个数据,同时需要将后续的数据重新散列。
总的来说,哈希表是C语言中比较常见的数据结构之一,它有着高效的查找操作,同时适用于大多数的数据类型。在实际开发中,我们可以通过调用现有库或手写代码,来完成相关的哈希表操作。
相关问题
C语言哈希表基本操作请用代码展示
好的,以下是C语言哈希表的基本操作代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TABLE_SIZE 100
typedef struct Node {
char* key;
char* value;
struct Node* next;
} Node;
Node* table[TABLE_SIZE];
unsigned int hash(char* key) {
unsigned int hash = 0;
for (int i = 0; i < strlen(key); i++) {
hash = hash * 31 + key[i];
}
return hash % TABLE_SIZE;
}
void put(char* key, char* value) {
unsigned int index = hash(key);
Node* node = table[index];
while (node != NULL) {
if (strcmp(node->key, key) == 0) {
node->value = value;
return;
}
node = node->next;
}
node = (Node*)malloc(sizeof(Node));
node->key = key;
node->value = value;
node->next = table[index];
table[index] = node;
}
char* get(char* key) {
unsigned int index = hash(key);
Node* node = table[index];
while (node != NULL) {
if (strcmp(node->key, key) == 0) {
return node->value;
}
node = node->next;
}
return NULL;
}
void remove_key(char* key) {
unsigned int index = hash(key);
Node* node = table[index];
Node* prev = NULL;
while (node != NULL) {
if (strcmp(node->key, key) == 0) {
if (prev == NULL) {
table[index] = node->next;
} else {
prev->next = node->next;
}
free(node);
return;
}
prev = node;
node = node->next;
}
}
void print_table() {
for (int i = 0; i < TABLE_SIZE; i++) {
printf("%d: ", i);
Node* node = table[i];
while (node != NULL) {
printf("(%s, %s) ", node->key, node->value);
node = node->next;
}
printf("\n");
}
}
int main() {
put("apple", "red");
put("banana", "yellow");
put("orange", "orange");
print_table();
printf("apple: %s\n", get("apple"));
printf("banana: %s\n", get("banana"));
printf("orange: %s\n", get("orange"));
remove_key("banana");
print_table();
return 0;
}
```
这段代码实现了哈希表的基本操作,包括插入、查找、删除和打印哈希表。其中,哈希函数使用了简单的字符串哈希算法,冲突解决采用了链表法。
c语言哈希表创建电话
在C语言中,我们可以使用数组结合哈希函数来创建一个简单的电话簿数据结构,即哈希表(也叫散列表)。这里是一个基本的概念示例:
首先,定义一个结构体来表示联系人,包括姓名和电话号码:
```c
typedef struct {
char name[50];
char phone_number[20];
} Contact;
```
接下来,我们选择一个合适的哈希函数来计算联系人的名字作为键值对的索引。常见的哈希函数如取模运算(键除以数组长度并取余数),然后分配一个动态大小的数组作为我们的哈希表:
```c
#define MAX_CONTACTS 100 // 假设最大存储量
Contact contacts[MAX_CONTACTS] = {0}; // 初始化所有元素为0
int contact_count = 0; // 记录当前已添加的联系人数
// 哈希函数示例(取字符串长度取模)
size_t hash_name(const char *name) {
return strlen(name) % MAX_CONTACTS;
}
```
现在你可以编写插入、查找和删除函数来操作这个哈希表:
- 插入(假设名字未重复):
```c
void add_contact(char *name, char *phone_number) {
if (contact_count < MAX_CONTACTS) {
contacts[hash_name(name)].name = name;
strcpy(contacts[hash_name(name)].phone_number, phone_number);
contact_count++;
}
else {
printf("电话簿已满,无法添加更多联系人。\n");
}
}
```
- 查找:
```c
char* find_phone_by_name(const char *name) {
size_t index = hash_name(name);
if (contacts[index].name != NULL && strcmp(contacts[index].name, name) == 0) {
return contacts[index].phone_number;
} else {
return "找不到该联系人";
}
}
```
- 删除(假设你知道名字并且它存在):
```c
void remove_contact(const char *name) {
size_t index = hash_name(name);
if (contacts[index].name != NULL && strcmp(contacts[index].name, name) == 0) {
memmove(&contacts[index], &contacts[index+1], (MAX_CONTACTS - index - 1) * sizeof(Contact));
contact_count--;
contacts[MAX_CONTACTS-1].name = NULL; // 清理最后一个元素
}
}
```
阅读全文