1
Good afternoon, making a hash table without bumps, I created the list struct, but when compiling the code it does not accept that I use the ->Prox of my struct, it asks me to use .prox. But if Prox is a pointer I should not use structlist->Prox ?
#include <stdio.h>
#include <stdlib.h>
#define N 7
/* Lista para o tratamento das colisões (encadeamento separado) */
struct lista
{
int info;
/* dado */
struct lista* prox; /* ponteiro para o próximo elemento */
};
typedef struct lista Lista;
/* Estrutura da tabela hash */
struct hash
{
Lista **tab; /* vetor com as listas da tabela hash */
int tam;
/* tamanho da tabela hash */
};
typedef struct hash Hash;
int codigo_hash(int chave)
{
return chave % N;
}
void imprime_menu(){
printf("\n(1) Para inserir elemento\n");
printf("(2) Para buscar elemento\n");
printf("(3) Para imprimir a tabela\n");
printf("(4) Para encerrar\n");
}
/*Encontra_linha:
A função vai na coluna do inteiro posicao e retorna qual deve ser o local que o
novo elemento deve ser adicionado para evitar conflitos
*/
int encontra_linha(Lista* *tabela, int posicao){
int i;
for(i = 0; tabela[posicao][i]->prox != NULL; i++){
}
return i;
}
int main()
{
Hash hash;//cria struct do hash
hash.tam = N;//tamanho do hash = 7
Lista* *tabela = (Lista**) malloc (hash.tam*sizeof(Lista*));//alocando memoria da coluna da matriz
int i,j;
for(i=0 ; i < hash.tam; i++){//criando a linha 1 da matriz, composta apenas com NULL. Esta é a tabela hash
tabela[i] = (Lista*) malloc(sizeof(Lista));
tabela[i][0].info = NULL;
tabela[i][0]->prox = NULL;
}
int opcao, dado, posicao, linha;
for(;;){
imprime_menu();
scanf("%d", &opcao);
switch(opcao){
case 1:
printf("Escreva o elemento a ser adicionado:\n");
scanf("%d", &dado);
posicao = codigo_hash(dado);
linha = encontra_linha( tabela, posicao);
tabela[posicao][linha].info = dado;
tabela[posicao][linha]->prox = NULL;
tabela[posicao][linha-1]->prox = tabela[posicao][linha];
break;
case 2:
break;
case 3:
for(i=0 ;i < hash.tam; i++){
printf("\n");
for(j = 0; tabela[posicao][j]->prox != NULL; j++)
printf("%d ", tabela[i][j].info);
}
break;
case 4:
return 0;
}
}
return 0;
}
Actually "struct->" is a more readable way of writing "(*struct)." , which in the end has the same intention of accessing an attribute of the pointer for struct, but you have already referenced your pointer as an array "struct[][]" this makes it an error to use "->" to access the attributes of the struct.
– matheusma37