2017-06-02 3 views
0

私は単純なハッシュテーブルとハッシュ関数を作っています。表の各要素には、衝突が発生したときに挿入関数によって使用される別のノードへのポインタがあります。問題は、衝突が発生したときに、リンクされたリストをナビゲートするときにコードがクラッシュすることです。ここでは、コード(それは少し長いかどう申し訳ありません)です。ここでリンクリストをナビゲート中にポインタにアクセスできない

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "hash.h" 
#define TAM 50 

int funcaoHash(int chave, char nome[50]) //Hash function 
{ 
    int i; 
    int hash = chave; 
    for(i = 0; nome[i] != '\0'; i++) 
    { 
     hash = hash + (int)nome[i]; 
    } 
    hash = hash%TAM; 
    return hash; 
} 

void insere(int chave, char nome[50], itemTabela* TabelaHash[TAM]) //Insert function 
{ 
    int idx = funcaoHash(chave, nome); 

    itemTabela* ItemAux = (itemTabela*)malloc(sizeof(itemTabela)); 
    itemTabela* ptrAux = NULL; 
    ItemAux->chave = chave; 
    strcpy(ItemAux->nome, nome); 

    if(TabelaHash[idx] == NULL) //No collision occurred 
     TabelaHash[idx] = ItemAux; 

    //If there is a collision 
    else 
    { 
     ptrAux = TabelaHash[idx]->ptr; 

     //Here the code breaks 
     while(ptrAux->ptr != NULL) 
     { 
      ptrAux = ptrAux->ptr; 
     } 
     ptrAux = ItemAux; 
    } 
} 

void inicializaTabela(itemTabela* TabelaHash[TAM]) //Initialize tabl 
{ 
    int i; 

    for(i = 0; i < TAM; i++) 
     TabelaHash[i] = NULL; 
} 

は、ノード構造である:

typedef struct itemTabela 
{ 
    char nome[50]; 
    int chave; 
    struct itemTabela* ptr; 
}itemTabela; 

そして、ここでは主な機能です:

int main() 
{ 
    itemTabela *ptrTabela[TAM] = {}; 
    inicializaTabela(ptrTabela); 
    insere(6, "Chico", ptrTabela); 
    insere(6, "Chico", ptrTabela); 
    return 0; 
} 

私がアクセスしていますが間違った方法でポインタやいくつかの違法なアクセスをしている? お時間をありがとう!

+1

でなければなりません「問題は、衝突が自分のコードを発生したときに、それはリンクリストをナビゲートするだときだけでクラッシュしていることです。」 - 何がクラッシュですか?デバッガを使ってこれを自分で把握しようとしましたか? –

+0

はい!デバッガは、次のポインタのメモリにアクセスできないと言います。 正確な言葉は次のとおりです。「0xbaadf045番地のメモリにアクセスできない」 –

+1

その中で起こったことは?どのポインタにその値がありますか? – Barmar

答えて

4

1) ItemAuxの初期化には、ptrの初期化も必要です。以下のようなItemAux->ptr = NULL;

2)

ptrAux = TabelaHash[idx]->ptr; 

    //Here the code breaks 
    while(ptrAux->ptr != NULL) 
    { 
     ptrAux = ptrAux->ptr; 
    } 
    ptrAux = ItemAux; 

ptrAux = TabelaHash[idx]; 

    while(ptrAux->ptr != NULL) 
    { 
     ptrAux = ptrAux->ptr; 
    } 
    ptrAux->ptr = ItemAux; 
+1

重要ですが、後ろに挿入する必要はありません。 – BLUEPIXY

関連する問題