C ++ ADT Установка реализации в HashTable (разрешение коллизий с независимыми списками)

Как видно из названия, я пытаюсь реализовать Set ADT в Hashtable с независимыми списками. Дело в том, что я не знаю, где я не прав.

Код, который я собираюсь опубликовать, взят из более крупного проекта, и я взял только его основные части, чтобы показать вам.

SetADT.h:

    #pragma once
#pragma once
#include <stdio.h>

#define CAPACITY 10

using namespace std;

template <typename TElement>
class IteratorSet;

template<typename TElement>
class Set {

class Nod {
public:
TElement element;
Nod* next;

};

public:

Set();void add(TElement element);int size();void sterge(TElement element);bool cauta(TElement element);friend class IteratorSet<TElement>;
IteratorSet<TElement> iterator() { return IteratorSet<TElement>(this); }

private:

int dimensiune;typename Set<TElement>::Nod* prim;int max;Nod** table;int hashFunction(TElement element) { return element.hashCode() % max; }Nod* set;
};

template<typename TElement>
Set<TElement>::Set()

{
max = CAPACITATE;
table = new Nod*[max];
for (int i = 0; i < max; i++)
table[i] = NULL;
}

template <typename TElement>
void Set<TElement>::add(TElement element)

{
int pozitie = hashFunction(element);
Nod* curent = table[pozitie];
while (curent != NULL && !(element == curent->element))
curent = curent->next;
if (curent != NULL)
return;
else
{
Nod* n = new Nod;
n->element = element;
n->next = table[pozitie];
table[pozitie] = n;
}
dimensiune++;
}

template <typename TElement>
int Set<TElement>::size()

{
return dimensiune;
}

template <typename TElement>
void Set<TElement>::sterge(TElement element)

{
int pozitie = hashFunction(element);
Nod* curent = table[pozitie];if (table[pozitie] == NULL)
return;if (table[pozitie]->element == element)
{
Nod* deSters = table[pozitie];
table[pozitie] = table[pozitie]->next;
delete deSters;
dimensiune--;
return;
}Nod* elem = table[pozitie];
while (elem->next != NULL && (elem->next->element) == element)
elem = elem->next;if (elem->next != NULL)
{
Nod* deSters = elem->next;
elem->next = elem->next->next;
delete deSters;
dimensiune--;
}

}

template <typename TElement>
bool Set<TElement>::cauta(TElement element)

{
int pozitie = hashFunction(element);
Nod* curent = table[pozitie];
while (curent != NULL && !(element == curent->element))
curent = curent->next;
if (curent != NULL)
{
return true;
}
return false;
}template<typename TElement>
class IteratorSet {
public:
IteratorSet(Set<TElement>* m);
void next();
bool valid();
TElement element();
private:
Set<TElement>* Set;
typename Set<TElement>::Nod* crt;
};

template<typename TElement>
IteratorSet<TElement>::IteratorSet(Set<TElement>* mul) {
Set = mul;
crt = mul->prim;
}

template<typename TElement>
bool IteratorSet<TElement>::valid() {
return crt != NULL;
}

template<typename TElement>
TElement IteratorSet<TElement>::element() {
return crt->element;
}

template<typename TElement>
void IteratorSet<TElement>::next() {
crt = crt->next;
}

================================================== =====
domain.h (названия пицц)

#include <string>
using namespace std;

class Pizza {
public:
Pizza(string namePizza) : namePizza(namePizza) {}
Pizza() : namePizza("") {}

string getName() const {
return namePizza;
}
int hashCode()
{
int sum = 0;
for (unsigned i = 0; i < str.length(); i++)
sum += str[i];
return sum;
}
bool operator == (Pizza& other) {
return namePizza == other.getName();
}

private:
string namePizza;
string str;
};

================================================== ==
main.cpp:

#include "SetADT.h"#include <string>
#include <iostream>
#include "domain.h"
void show(Set<Pizza>* set) {
IteratorSet<string> it = set->iterator();
while (it.valid()) {
cout << "\t" << it.element().getName() << endl;
it.next();
}
}int main()
{
Set<Pizza> set;

Pizza pizza1{ "diavola" };
Pizza pizza2{ "prosciuto" };

set.add(pizza1);
set.add(pizza2);

show(set);

return 0;
}

Когда я пытаюсь распечатать объекты, добавленные в Set, он появляется и выдает ошибку, и программа останавливается.

Я не знаю где-нибудь еще, чтобы найти, чтобы найти проблему.

Во всяком случае, если пример кода не достаточно, здесь полный проект (содержит части румынского в нем)

http://www20.zippyshare.com/v/qKpEcZhr/file.html

0

Решение

Причиной может быть, например, prim переменная, которую вы используете в итераторе, которая инициализируется неопределенным значением. Однако размещенный вами код не компилируется, то есть существуют другие проблемы, из-за которых ваш код не работает. Не загрузил ваш почтовый файл.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector