2

そのため、1000個のリンクリストを処理し、最初にそれらへのポインタを宣言するクラスを作成しようとしています。

これは私の問題を直接扱うコードです:

struct node
{
    char name[40];
    char numb[12];
    node * next;
};
class hashTable
{
public:
    //Creates a table of 1000 pointers to linked-list nodes
    node * table[1000];

//Functions
void addNode(char name[40], char numb[12])
{
    node * temp;        //Initializes temp node as pointer
    temp = new node;    //Points temp node to a new node

    int hash = h(g(name));  //The hash of the key (name) used to check nodes
    temp = table[hash];     //sets the temporary node to the first node of the list

    while (temp->next != 0)
    {
//...

whileループで、「アクセス違反の読み取り場所0xcccccd00」というエラーが発生します。これらの値が初期化されていないなどの理由がない限り、テーブルメンバーにアクセスできない理由がわかりません。

4

2 に答える 2

2

あなたはおそらく2つのことをしていません。まず、ハッシュテーブルがすべてNULLポインタを含むように適切に初期化されていることを確認します。次に、ハッシュテーブルから取得したポインタが、逆参照する前に有効であることを確認します。

最初の問題の場合:

hashTable::hashTable() : table()
{
}

また、これが適切にクリーンアップされることを確認する必要があります

hashTable::~hashTable()
{
    for (size_t i=0;i<sizeof(table)/sizeof(table[0]); ++i)
    {
        node *temp = table[i];
        while (temp)
        {
            node *victim = temp;
            temp = temp->next;
            delete victim;
        }
    }
}

2番目の問題の場合:

void addNode(const char *name, const char *numb)
{
    int hash = h(g(name));    //The hash of the key (name) used to check nodes
    node *temp = table[hash]; //sets the temporary node to the first node of the list

    if (temp)
    {
        // preexisting entry. walk that list looking for matching key.
        node **pp = &temp->next;
        while (temp)
        {
            if (0 == strcmp(temp->name, name))
                break;
            pp = &temp->next;
            temp = temp->next;
        }

        // link to last node if not found in list
        if (!temp)
            *pp = new node(name, numb);
    }
    else
    {   // no prior entry. create a new one and store it at table[hash].
        table[hash] = new node(name, numb);
    }
}

注:上記のコードは、ノードクラスが次のように実装されていることを前提としています

struct node
{
    char name[40];
    char numb[12];
    node * next;

    node(const char* name_, const char *numb_)
        : next()
    {
        strncpy(name, name_, sizeof(name)/sizeof(name[0])-1);
        name[ sizeof(name)/sizeof(name[0])-1 ] = 0;
        strncpy(numb, numb_, sizeof(numb)/sizeof(numb[0])-1);
        numb[ sizeof(numb)/sizeof(numb[0])-1 ] = 0;
    }
};

個人的にはstd::string

于 2013-03-20T19:06:41.063 に答える
0

ハッシュの値が1000より大きい(または等しい)場合、tempは無効な領域を指します。

new nodeまた、一時変数を上書きしているため、によって割り当てられたメモリがリークしています。

于 2013-03-20T18:56:13.073 に答える