请设计HashTable * create(int size); 该函数创建一个槽数不少于size素数个空散列表,并返回散列表指针. 在散列表中的每个槽链表都带头结点。 以下函数已经定义,可以直接调用 int nextPrime(int n); 请注意,本题有预置代码,只需提交所要求的函数定义代码即可。
时间: 2024-02-13 10:03:08 浏览: 107
Project03:散列(在具有大量键的问题中创建结构“散列表”)
以下是实现HashTable * create(int size)的代码:
```c++
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
class HashTable {
private:
vector<ListNode*> table;
int size;
public:
HashTable(int n) {
size = nextPrime(n);
table.resize(size, new ListNode(0));
}
int hash(int key) {
return key % size;
}
void insert(int key) {
int index = hash(key);
ListNode* node = new ListNode(key);
node->next = table[index]->next;
table[index]->next = node;
}
bool search(int key) {
int index = hash(key);
ListNode* node = table[index]->next;
while (node) {
if (node->val == key) {
return true;
}
node = node->next;
}
return false;
}
void remove(int key) {
int index = hash(key);
ListNode* prev = table[index];
ListNode* curr = table[index]->next;
while (curr) {
if (curr->val == key) {
prev->next = curr->next;
delete curr;
break;
}
prev = curr;
curr = curr->next;
}
}
~HashTable() {
for (int i = 0; i < size; i++) {
ListNode* node = table[i];
while (node) {
ListNode* temp = node;
node = node->next;
delete temp;
}
}
}
};
int nextPrime(int n) {
while (true) {
bool flag = true;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) {
flag = false;
break;
}
}
if (flag) {
return n;
}
n++;
}
}
HashTable* create(int size) {
return new HashTable(size);
}
```
解释:
1. HashTable类定义了散列表的相关操作,包括插入、查找和删除元素等等。
2. hash函数用于计算键在散列表中的下标。
3. insert函数将元素插入到对应的槽的链表中。
4. search函数在散列表中查找指定的键。
5. remove函数从散列表中删除指定的键。
6. nextPrime函数用于计算不小于n的下一个素数。
7. create函数创建一个槽数不少于size素数个空散列表,并返回散列表指针。
阅读全文