Ich mache eine einfache Hash-Tabelle und eine Hash-Funktion. Jedes Element der Tabelle hat einen Zeiger auf einen anderen Knoten, der von der Einfügefunktion verwendet wird, wenn eine Kollision auftritt. Das Problem ist, dass bei einer Kollision mein Code einfach abstürzt, wenn er die verkettete Liste durchläuft. Hier ist der Code (sorry, wenn es ein wenig langatmig ist):Zugriff auf Zeiger beim Navigieren der verknüpften Liste nicht möglich
#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;
}
Hier ist die Knotenstruktur:
typedef struct itemTabela
{
char nome[50];
int chave;
struct itemTabela* ptr;
}itemTabela;
Und hier ist die Hauptfunktion:
int main()
{
itemTabela *ptrTabela[TAM] = {};
inicializaTabela(ptrTabela);
insere(6, "Chico", ptrTabela);
insere(6, "Chico", ptrTabela);
return 0;
}
Bin ich Zugriff auf die Zeiger in die falsche Richtung oder einen illegalen Zugang? Danke für Ihre Zeit!
sein "Das Problem ist, dass, wenn eine Kollision meinen Code einfach auftritt stürzt ab, wenn es die verknüpfte Liste zu navigieren." - Was ist der Unfall? Haben Sie einen Debugger verwendet, um das herauszufinden? –
Ja! Der Debugger sagt, dass er nicht auf den Speicher des nächsten Zeigers zugreifen kann. Hier sind die genauen Worte: "Zugriff auf den Speicher unter der Adresse 0xbaadf045 ist nicht möglich" –
In welcher Aussage ist das passiert? Welcher Zeiger hat diesen Wert? – Barmar