HashTable上的C ++ ADT Set实现(使用独立列表解析colies)

时间:2017-06-03 17:00:12

标签: c++ set hashtable abstract-data-type

正如标题所说我试图在具有独立列表的Hashtable上实现Set ADT。问题是我不知道我错在哪里。

我即将发布的代码来自一个更大的项目,我只拿了它的必要部分来向你展示。

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

1 个答案:

答案 0 :(得分:0)

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