导航链表时无法访问指针

时间:2017-06-02 21:42:16

标签: c hash linked-list

我正在创建一个简单的哈希表和哈希函数。表的每个元素都有一个指向另一个节点的指针,当发生冲突时,插入函数使用该节点。问题是当发生碰撞时,我的代码只是在导航链表时崩溃。这是代码(对不起,如果它有点冗长):

#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 :(得分: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;