-1

手始めに、私のプログラムは、衝突がチェーンによって処理される名前のハッシュ テーブルを作成することです。だから私はリンクされたリストの配列を作成します。問題は、私の配列が正確には88801と非常に大きいことです。それがスタックオーバーフローを取得する理由だと思いますが、よくわかりません。私のコードは以下です。ある人は、配列をリンクされたリストへのポインターのセットにするように私に言いました。
IE は LinkedList* hashbucket1[88801] を配置しました。これにより、スタック オーバーフローの問題は解消されましたが、他のリンク エラーが発生しました。文字列のリンクされたリストの配列を実装する最良の方法は何かを理解しようとしていると思います。私が正しい軌道に乗っていて、何か小さなものを見落としている場合は、それを指摘するか、これを破棄して、特定のパスを念頭に置いてやり直すように言ってください。他のファイルをリンクまたは圧縮する必要がある場合は、お知らせください。

#include <iostream>
#include "LinkedList.h"
#include <string>
#include <fstream>

using namespace std;

 unsigned long djb2(string& str) 
 { 
 unsigned long hash = 5381; 

  for(string::iterator it = str.begin();it!=str.end();it++)  
    hash = ((hash << 5) + hash) + *it; /* hash * 33 + character */ 

 return hash; 
 }

  static unsigned long sdbm(string& str)
{
    unsigned long hash = 0;
    int c;

   for(string::iterator it = str.begin();it!=str.end();it++)
        hash = *it + (hash << 6) + (hash << 16) - hash;

    return hash;
  }


  void insert(LinkedList HashList1[], LinkedList HashList2[], int listSize);

    int main() {
char command;
int listSize = 88801;
LinkedList HashList1[88801];
LinkedList HashList2[88801];
bool invalidcommand;
do{
    do{
        cout << "MENU" << endl;
        cout << "(I)nsert new entry" << endl;
        cout << "(S)earch" << endl;
        cout << "(D)elete Entry" << endl;
        cout << "(C)reate Hast Table" << endl;
        cout << "(L)og File" << endl;
        cout << "(Q)uit and Exit Program" << endl;

        cin >> command;

    if(command == 'I'){
        insert(HashList1, HashList2, listSize);
    }else if(command == 'S'){
  //            search(HashList1, HashList2, listSize);
    }else if(command == 'D'){

    }else if(command == 'L'){ 
    //  save(HashList1, HashList2, listSize);
    }else if(command == 'C'){
    //  load(HashList1, HashList2, listSize);
    }
}while(command != 'Q');

return 0;
    };

    void insert(LinkedList HashList1[], LinkedList HashList2[], int listSize){

string lastName;
bool invalidID;
//Person newPerson;
do
{
    invalidID = false;
    cout << "Please enter Last Name: ";
    cin >> lastName;
    while(cin.fail())
    {
        cin.clear();
        cin.ignore();
    }
}while(invalidID);
//newPerson.setLastName(lastName);
int hashBucket1;
int hashBucket2;
hashBucket1 = djb2(lastName) % listSize;
hashBucket2 = sdbm(lastName) % listSize;
LinkedList bucket1;
if(!HashList1[hashBucket1].find(lastName)){     
    //HashList1[hashBucket1].insert(newPerson);
    HashList1[hashBucket1].insert(lastName);

}else{
    if(!bucket1.find(lastName)){

        HashList1[hashBucket1].insert(lastName);
    }else{
    cout << "List already contains an entry with the last name " << lastName << endl;
    }
}
LinkedList bucket2;
if(HashList2[hashBucket2].find(lastName)){
//  bucket2.insert(newPerson);
}else{
    if(!bucket2.find(lastName)){
        //bucket2.insert(newPerson);
    }else{
    cout << "List already contains an entry with the last name " << lastName << endl;
    }
}
   }
4

1 に答える 1

2

あなたの問題は、あなたが正しく推測しているように、スタックスペースが不足していることです。限られた貴重なリソースであるスタックに、そのような大きなオブジェクトを配置するべきではありません。代わりに、ポインターを使用してヒープに動的に割り当てることができます。

問題のあるコードは次のとおりです。

int main() {
char command;
int listSize = 88801;
LinkedList HashList1[88801]; // << this
LinkedList HashList2[88801]; // << and this

LinkedList* hashbucket1[88801]また、は配列へのポインターではなく、ポインターの配列であることに注意してください。あなたが望むものは:

LinkedList (*HashList1)[88801]

または、typedef読みやすくするために:

typedef LinkedList LinkedListArray[88801];
LinkedListArray* HashList1;

しかし、それまでには、次のことを行う方がよいでしょう:

LinkedList *HashList1 = new LinkedList[88801];
于 2012-05-27T00:02:17.540 に答える