2017-06-02 4 views
0

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!

+1

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? –

+0

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" –

+1

In welcher Aussage ist das passiert? Welcher Zeiger hat diesen Wert? – Barmar

Antwort

4

1) Initialisierung von ItemAux erfordert auch ptr Initialisierung. wie ItemAux->ptr = NULL;

2)

ptrAux = TabelaHash[idx]->ptr; 

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

sollte

ptrAux = TabelaHash[idx]; 

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

Wenn das nicht der Fall ist Wichtig, du solltest es vorher einfügen, nicht hinterher. – BLUEPIXY

Verwandte Themen