C++ ADT在HashTable上设置实现(解决与独立列表的冲突)

问题描述:

正如标题所说,我正试图在具有独立列表的Hashtable上设置ADT。事情是我不知道我错在哪里。C++ 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 it弹出并出错,程序停止。

我不知道别的地方去寻找问题。

无论如何,如果代码样本不够,这里完整的项目(有罗马尼亚的部分在里面)

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

+0

我*真的*希望散列表是你练习的要点之一,或者你应该使用['std :: unordered_map'](http://en.cppreference.com/w/cpp/container/unordered_map )这是标准库hashmap类。 –

+0

是的..这正是我要做的任务..他们不会让我使用unordered_map或unordered_set –

可能是,例如,prim变量您在使用的原因该迭代器被初始化为一个未定义的值。但是,您发布的代码不可编译,也就是说您的代码无法正常工作还有其他问题。没有下载你的zip文件。

+0

zip文件编译和问题是更好的例子 –

+0

您可以发布plz相关的工作代码的必需品,否则这很难帮助)) – Yuki