C语言构造一个哈希表,哈希函数采用除留余数法,哈希冲突解决方法采用链地址法。设计一个测试程序进行测试。
时间: 2024-03-24 07:40:38 浏览: 75
好的,我可以帮您回答这个问题。
首先,我们需要定义哈希表的结构体,包括哈希表的大小、存储数据的数组和单链表的结构体。
```c
#define HASHSIZE 7 // 哈希表大小
typedef struct node {
int data;
struct node* next;
} Node;
typedef struct {
Node* head;
} List;
typedef struct {
List lists[HASHSIZE];
} HashTable;
```
接下来,我们需要实现哈希函数和哈希表的插入、查找和删除操作。
```c
// 哈希函数
int hash(int key) {
return key % HASHSIZE;
}
// 插入操作
void insert(HashTable* ht, int key) {
int index = hash(key);
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = key;
newNode->next = NULL;
if (ht->lists[index].head == NULL) {
ht->lists[index].head = newNode;
} else {
Node* node = ht->lists[index].head;
while (node->next != NULL) {
node = node->next;
}
node->next = newNode;
}
}
// 查找操作
Node* search(HashTable* ht, int key) {
int index = hash(key);
Node* node = ht->lists[index].head;
while (node != NULL) {
if (node->data == key) {
return node;
}
node = node->next;
}
return NULL;
}
// 删除操作
void delete(HashTable* ht, int key) {
int index = hash(key);
Node* node = ht->lists[index].head;
Node* prevNode = NULL;
while (node != NULL) {
if (node->data == key) {
if (prevNode == NULL) {
ht->lists[index].head = node->next;
} else {
prevNode->next = node->next;
}
free(node);
return;
}
prevNode = node;
node = node->next;
}
}
```
最后,我们可以设计一个测试程序进行测试。
```c
int main() {
HashTable ht = {0};
insert(&ht, 1);
insert(&ht, 8);
insert(&ht, 15);
insert(&ht, 22);
insert(&ht, 29);
insert(&ht, 36);
insert(&ht, 43);
Node* node = search(&ht, 15);
if (node != NULL) {
printf("Found node with data %d\n", node->data);
} else {
printf("Node not found\n");
}
delete(&ht, 15);
node = search(&ht, 15);
if (node != NULL) {
printf("Found node with data %d\n", node->data);
} else {
printf("Node not found\n");
}
return 0;
}
```
这样我们就可以通过测试程序进行测试,看看我们实现的哈希表是否能够正常工作。
阅读全文