Функция поиска в хэш-наборе не работает Переполнение стека

Я пытаюсь реализовать хэш-сет, и мне, очевидно, нужна функция поиска. Я сделал один, но это не похоже на работу. Я хочу добавить людей в хэшсет. Вот весь код:

/*
* HSet.h
*/

#ifndef HSET_H_
#define HSET_H_
#include <cstdio>

template <typename Element>
class MyHashSet{
private:
class Node{
private:
Element info;
Node* next;
public:
Node(){
this->next=NULL;
}
Node(Element info, Node* next){
this->info=info;
this->next=next;
}
Node(const Node& node){
this->info=node.info;
this->next=node.next;
}
~Node(){}
Element getInfo(){
return this->info;
}
Node* getNext(){
return this->next;
}
void setNext(Node* value){
this->next=value;
}
void setInfo(Element el){
this->info=el;
}
};
Node** head;
int size;
int* bucketsize;
int totalElements;
public:
MyHashSet();
~MyHashSet();
int hashFunction(long long int nr);
bool isEmpty(int index);
int searchElementInTheSet(long long int nr, Element e);
void addElementAtTheEndOfTheSet(long long int nr, Element e);
int totalElementsInTheSet(){
return this->totalElements;
}
int HashSize(){
return this->size;
}
int bucketNumberOfElements(int index){
return this->bucketsize[index];
}
};

template<typename Element>
MyHashSet<Element>::MyHashSet(){
this->size=11;
this->head= new MyHashSet::Node*[this->size];
this->bucketsize= new int[this->size];
for(int i=0; i < this->size; i++){
this->head[i]=NULL;
this->bucketsize[i]=0;
}
}

template<typename Element>
MyHashSet<Element>::~MyHashSet(){
delete[] head;
delete[] bucketsize;
}

template<typename Element>
bool MyHashSet<Element>::isEmpty(int index){
if(index>=0 and index < this->size){
return head[index]==NULL;
}
return true;
}

template<typename Element>
int MyHashSet<Element>::hashFunction(long long int nr){
int sum=0;
int divisor=10;
while(nr != 0){
sum+=nr % divisor;
nr=nr / divisor;
}
int hashCode = sum % this->size;
return hashCode;
}

template<typename Element>
int MyHashSet<Element>::searchElementInTheSet(long long int nr, Element e){
int index  = hashFunction(nr);
Node* cursor = this->head[index];
while((cursor->getNext()!=NULL) and(cursor->getInfo()!=e)){
cursor = cursor->getNext();
}
if(cursor->getInfo()==e){
return 1;
}
return 0;
}

template<typename Element>
void MyHashSet<Element>::addElementAtTheEndOfTheSet(long long int nr, Element e){
int index = hashFunction(nr);
Node* add = new Node(e,NULL);
if(isEmpty(index)){ //if is empty at at the beginning
this->head[index]=add;
++totalElements;
++bucketsize[index];
}
else{
Node* cursor = this->head[index];
while(cursor->getNext() != NULL){
cursor = cursor->getNext();
}
add->setNext(cursor->getNext());
cursor->setNext(add);
++totalElements;
++bucketsize[index];
}
}

#endif /* HSET_H_ */

Класс человека:

#ifndef PERSON_H_
#define PERSON_H_

#include <string>
using namespace std;

class Person{
private:
string name;
long long int phoneNumber;
public:
Person(){
this->name="";
this->phoneNumber=0;
}
Person(string name, long long int phoneNumber){
this->name=name;
this->phoneNumber=phoneNumber;
}
~Person(){}
string& getName(){
return this->name;
}
long long int getPhoneNumber(){
return this->phoneNumber;
}
void setName(string newName){
this->name=newName;
}
void setPhoneNumber(long long int newPhoneNumber){
this->phoneNumber=newPhoneNumber;
}
};#endif /* PERSON_H_ */

Я попробовал это:

Person* p = new Person("asdsads", 1725912975); //4
assert(hash->searchElementInTheSet(p->getPhoneNumber(),*p));

Я получил 2 ошибки в функции поиска:

template<typename Element>
int MyHashSet<Element>::searchElementInTheSet(long long int nr, Element e){
int index  = hashFunction(nr);
Node* cursor = this->head[index];
while((cursor->getNext()!=NULL) and(cursor->getInfo()!=e)){ //error: Multiple markers at this line
- no match for 'operator!=' in 'MyHashSet<Element>::Node::getInfo() [with Element =
Person]() != e'
- candidates are: //error ends
cursor = cursor->getNext();
}
if(cursor->getInfo()==e){ //error: Multiple markers at this line
- no match for 'operator==' in 'MyHashSet<Element>::Node::getInfo() [with Element = Person]
() == e'
- candidates are: //error ends
return 1;
}
return 0;
}

Как я могу распечатать все элементы из хэш-набора? Я просто не могу понять это.

0

Решение

Так вот:

    while((cursor->getNext()!=NULL) and(cursor->getInfo()!=e)){

нет совпадения для ‘operator! =’ в ‘MyHashSet :: Node :: getInfo () с Element =
Человек! = Е

по сути, вы пытаетесь сравнить два экземпляра Person — один в узле и другой, переданный в вашу функцию поиска. Вы не сказали компилятору как сравнить два экземпляра этого типа, но вы можете сделать это так:

bool operator==(Person const &p1, Person const &p2) {
// return true if they're the same person
return false;
}
bool operator!=(Person const &p1, Person const &p2) {
return !(p1 == p2); // just forward to operator==
}
0

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

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

По вопросам рекламы [email protected]