2013-05-07 76 views
0

我想實現一個哈希集,我顯然需要一個搜索功能。我做了一個,但它似乎不工作。我想在哈希集中添加人員。這裏是所有代碼:Hashset搜索功能不工作C++

/* 
* 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個錯誤:

我如何打印哈希中的所有元素等?我無法弄清楚。

回答

0

所以在這裏:

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

在「MyHashSet ::節點::的getInfo()與元= 人= E

不是你的對手!「=運算!基本上試圖比較兩個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== 
}