导航链表时无法访问指针

标签 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) 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;

关于导航链表时无法访问指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44337825/

相关文章:

c - 将动态多维数组的元素传递给函数

c++ - 带链表的回文函数

c - 此时代码中 %esp 的值应该是多少?

c - cl.h中一些宏的定义

Ruby Hash .keys 和 .values,可以安全地采用相同的顺序吗?

perl - 迭代 Perl 哈希键的最安全方法是什么?

python - 从 .txt 文件工作以在 Python 中输出 sha256 哈希

c - 将文件中的单词读入简单链表

c - 通过从文本文件中读取数字来生成链接列表

c - 在 C 中,如何附加到文件行而不是文件末尾?