2017-06-02 50 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