Top.Mail.Ru
Ответы

C++,Хеш таблица на базе массива и списка.

Написал реализацию таблицы. Есть функция Add. Если среднее кол-во элементов в строке >= 5, она должна создавать новый массив удвоенный, и все наши нынешние элементы переписать туда. Потом добавить новый элемент.
Именно с этим условием у меня проблемы, вообще без понятия, что не так.
вот код---------------------------------------------------------------------------------

#include
#include

using namespace std;

struct Cell {
char* data;
int key;
Cell* next;

Cell() : next(NULL)
{
}
Cell(int key, const char* data, Cell* nnext) : data(_strdup(data)), key(key), next(nnext)
{
}
Cell(int key, const char* data) : data(_strdup(data)), key(key)
{
}
};

class Hash_table {
private:
Cell** table;
int table_size;
char* not_found;

int hash(int key)
{
return key % table_size;
}
public:
Hash_table(int ts, const char* nf)
{
table_size = ts;
// not_found = nf;
not_found = _strdup(nf);

table = new Cell * [table_size];
for (int i = 0; i < table_size; i++)
table[i] = NULL;
}
void remove(int kkey)
{//}
char* find(int kkey)
{///}
~Hash_table()
{
Cell* cur = new Cell;
Cell* cur_next = new Cell;

for (int i = 0; i < table_size; i++) {
cur = cur_next = table[i];
while (cur != NULL) {
cur_next = cur->next;
delete cur;
cur = cur_next;
}
}
delete[]table;
}
bool add(const char* cc, int k)
{
int row = hash(k);
Cell* cur = new Cell;

cur = table[row];

while (cur != NULL && cur->key != k)
cur = cur->next;

if (cur!=NULL && cur->key == k) return 0;
else {

//значит надо вставить элемент
//надо ли увеличивать массив?
if (size() / table_size < 5) {
Cell* cur = table[row];
table[row] = new Cell(k, cc, cur);
return 1;
}
else {
table_size = 2 * table_size;

Cell** table_new = new Cell * [table_size];
for (int i = 0; i < table_size; i++) {
table_new[i] = NULL;
//создали новый массив
}

for (int i = 0; i < table_size / 2; i++) {
Cell* cur = table[i];

while (cur != NULL) {
int hash_new = hash(cur->key);
Cell* cur_new = table_new[hash_new];
table_new[hash_new] = new Cell(cur->key, cur->data, cur_new);

cur = cur->next;
}
}
//заполнили новый массив
Cell* cur2 = new Cell;
Cell* cur_next = new Cell;

for (int i = 0; i < table_size; i++) {
cur = cur_next = table[i];
while (cur2 != NULL) {
cur_next = cur->next;
delete cur2;
cur2 = cur_next;
}
}
delete[]table;
//удаляем старый массив

//переопределяем table
table = table_new;
//вставляем новый элемент
row = hash(k);
Cell* cur = table[row];
table[row] = new Cell(k, cc, cur);
return 1;
}
}
}
void print()
{
Cell* cur = new Cell;

for (int i = 0; i < table_size; i++) {
cout << i << ":";
cur = table[i];
while (cur != NULL) {
cout << "[" << cur->key << "," << cur->data << "]";
cur = cur->next;
}
cout << endl;
}
cout << endl;
}
int size()
{
int sz = 0;

for (int i = 0; i < table_size; i++) {
Cell* cur = table[i];
while (cur != NULL) {
cur = cur->next;
sz++;
}
}
return sz;
}
};

int main()
{
Hash_table hash(5, "not_found");

for (int i = 0; i < 25; i++)hash.add("xyz", i);
hash.print();

hash.add("rrr", 55);

hash.print();

}

По дате
По рейтингу
Аватар пользователя
Новичок
5лет

У меня ругается что не хватает закрывающей фигурной скобки. А та, которой должна закрывать class Hash_table у меня показывает на то что она относится вот к char* find(int kkey) этому методу. То есть где то удачно прое.. на фигурная скобка для начала! Так что плиз код скидываем на pastebin.com, только уже без ошибок и потом уже можно посмотреть. А самому пытаться отловить где скобочка пропущена, это долго. Мне лень. При чем я удивляюсть как у вас так получилось, если сама IDE подставляет сразу закрывающую скобку.

Аватар пользователя
Оракул
5лет

не компиляется
скинь пастой

и да, _strdup в том виде, в котором используется у тебя, не годится
нужно или убедиться, что каждому strdup соответствует free, или убрать strdup вообще и заменить чем-то другим - например, нормальным человеческим std::string, что, конечно же, будет правильнее, чем первый вариант