私は単純なハッシュテーブルとハッシュ関数を作っています。表の各要素には、衝突が発生したときに挿入関数によって使用される別のノードへのポインタがあります。問題は、衝突が発生したときに、リンクされたリストをナビゲートするときにコードがクラッシュすることです。ここでは、コード(それは少し長いかどう申し訳ありません)です。ここでリンクリストをナビゲート中にポインタにアクセスできない
#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;
}
私がアクセスしていますが間違った方法でポインタやいくつかの違法なアクセスをしている? お時間をありがとう!
でなければなりません「問題は、衝突が自分のコードを発生したときに、それはリンクリストをナビゲートするだときだけでクラッシュしていることです。」 - 何がクラッシュですか?デバッガを使ってこれを自分で把握しようとしましたか? –
はい!デバッガは、次のポインタのメモリにアクセスできないと言います。 正確な言葉は次のとおりです。「0xbaadf045番地のメモリにアクセスできない」 –
その中で起こったことは?どのポインタにその値がありますか? – Barmar