C ++ - 线性探测程序的运行时崩溃

时间:2013-07-17 15:06:13

标签: c++ data-structures hash

我用C ++编写了一个程序,用于使用线性探测进行散列。代码在编译时没有显示错误,但是当我运行它时,计算机显示程序已停止工作的通知。我将在下面给出完整的代码。请帮帮我。

#include<iostream>
#include<vector>
using namespace std;
class Acc
{
    public:
        int iData;
        double dData;
        Acc(int id,double dd)
        {
            iData = id;
            dData = dd;
        }
        void displayAcc()
        {
            cout<<"iData = "<<iData<<"\n";
            cout<<"dData = "<<dData<<"\n";
        }
};
class Linear_Hash
{
    private:
        vector<Acc*> hashArray;
        int nElem;
        Acc* noElem;
    public:
        Linear_Hash(int max)
        {
            nElem = max;
            hashArray.resize(nElem);
            noElem = new Acc(-1,1.1);
            for(int i = 0;i<max;i++)
            {
                hashArray[i] = NULL;
            }
        }
        int hashfunc(int key)
        {
            return key%nElem;
        }
        void insertAcc(int id,double dd)
        {
            Acc* newacc = new Acc(id,dd);
            int hashVal = hashfunc(id);
            while(hashArray[hashVal]->iData!=-1&&hashArray[hashVal]!=NULL)
            {
                hashVal++;
                hashVal = hashVal%nElem;
            }
            hashArray[hashVal] = newacc;
        }
        Acc* search(int key)
        {
            int hashVal = key%nElem;
            while(hashArray[hashVal]->iData!=key&&hashArray[hashVal]!=NULL)
            {
                hashVal++;
                hashVal = hashVal%nElem;
            }
            if(hashArray[hashVal]->iData==key)
            {
                return hashArray[hashVal];
            }
            else
                return NULL;
        }
        bool deleteAcc(int key)
        {
            int hashVal = hashfunc(key);
            while(hashArray[hashVal]->iData!=key&&hashArray[hashVal]!=NULL)
            {
                hashVal++;
                hashVal = hashVal%nElem;
            }
            if(hashArray[hashVal]==NULL)
                return false;
            else
            {
                Acc* pTemp = hashArray[hashVal];
                hashArray[hashVal] = noElem;
                delete pTemp;
                return true;
            }
        }
};
int main(void)
{
    int key;
    char val;
    Linear_Hash lh(20);
    lh.insertAcc(100,100.1);
    lh.insertAcc(204,204.204);
    lh.insertAcc(105,105.10);
    lh.insertAcc(237,348.23);
    lh.insertAcc(209,923.23);
    lh.insertAcc(230,230.23);
    lh.insertAcc(403,348.34);
    lh.insertAcc(405,938.50);
    lh.insertAcc(450,348.23);
    lh.insertAcc(945,495.409);
    while(val!='x')
    {
        cout<<"Enter the key to be searched\n";
        cin>>key;
        if(lh.search(key)==NULL)
            cout<<key<<" could not be found\n";
        else
            lh.search(key)->displayAcc();
        cout<<"Enter the key to be deleted\n";
        cin>>key;
        if(lh.deleteAcc(key))
            cout<<key<<" has been deleted\n";
        else
            cout<<"Invalid request\n";
        cout<<"Do you want to continue\n";
        cin>>val;
    }
    return 0;
}

在这种情况下我无法使用调试器,因为我不知道错误在哪里。我也尝试在纸上干运行,但无法确定错误。

1 个答案:

答案 0 :(得分:0)

靠近主要顶部,你可以这样做:

Linear_Hash lh(20);
lh.insertAcc(100,100.1);

第一行设置向量:

for(int i = 0;i<max;i++)
{
    hashArray[i] = NULL;
}

所以,在第二行之前你有一个NULL s的向量。 第二行然后这样做:

    Acc* newacc = new Acc(id,dd);
    int hashVal = hashfunc(id);
    while(hashArray[hashVal]->iData ...

所以,hashArray包含NULLS,然后你试着看hashArray[hashVal]->iData

NULL->iData

在尝试对其进行任何操作之前,您应该先检查hashArray[hashVal]!=NULL