【问题标题】:C++ ADT Set implementation on HashTable (resolving colisions with independent lists)HashTable的C++ ADT Set实现(解决独立列表的冲突)
【发布时间】:2017-06-03 17:00:11
【问题描述】:

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

我即将发布的代码取自一个更大的项目,我只截取了其中的基本部分来向您展示。

设置ADT.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

【问题讨论】:

  • 真的希望hashtable是你练习的重点之一,或者你应该使用std::unordered_map,它是标准库hashmap类。
  • 是的..这正是我必须做的任务..他们不会让我使用 unordered_map 或 unordered_set

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


【解决方案1】:

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

【讨论】:

  • zip 文件编译,问题是里面有更好的例子
  • 您能否发布您工作代码的相关要点,否则很难提供帮助))
猜你喜欢
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2012-01-27
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多