算法设计题:从散列表中删除一个关键词为k的记录,设散列函数为h,解决冲突的方法为拉链法。c语言
时间: 2024-05-12 18:15:44 浏览: 91
CBHT分析-java数据结构算法10
假设散列表的定义如下:
```c
struct Node { // 链表节点
int val;
struct Node* next;
};
struct HashTable { // 散列表
int size; // 散列表大小
struct Node** table; // 指向链表头结点的指针数组
};
```
其中,`size`表示散列表的大小,`table`是一个指向链表头结点的指针数组。
删除关键词为k的记录的过程如下:
```c
void delete(HashTable* table, int k) {
int index = h(k) % table->size; // 计算哈希值
Node* head = table->table[index]; // 找到链表头结点
Node* pre = NULL;
Node* cur = head;
while (cur) { // 遍历链表
if (cur->val == k) { // 找到了要删除的节点
if (pre) { // 如果不是头结点
pre->next = cur->next; // 跳过当前节点
} else { // 如果是头结点
table->table[index] = cur->next; // 更新头结点
}
free(cur); // 释放当前节点
return;
}
pre = cur;
cur = cur->next;
}
}
```
首先,我们根据散列函数h计算关键词k的哈希值,然后找到对应的链表头结点。接着,我们遍历链表,查找要删除的节点。如果找到了,我们将当前节点从链表中删除,并释放其内存。需要注意的是,如果要删除的节点是链表的头结点,我们要更新`table`数组中的对应元素。
阅读全文