1
Good afternoon,
I wanted to know how to make a chained list of states where each state node is linked to a binary city search tree from information extracted from a file.
My doubt arose after successive attempts to manage my structure using pointers to be frustrated by errors [Error] dereferencing pointer to incomplete type
.
By error issued I assumed that the problem would be in the pointer type declaration, since my compiler might not be associating the typedef struct celCidade apontadorCidade;
to a pointer to struct celCity for example, so I tried to use cast through the malloc();
, but the error persists.
In function insereCidade();
is the error pointed out.
- Where is the error?
- How can I fix it?
- You can simplify the code?
Complete code for testing:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
typedef struct celCidade apontadorCidade;
typedef struct celEstado apontadorEstado;
typedef struct{
char nome[30];
int populacao;
int beneficiarios;
int qtdCidades;
float idh;
apontadorCidade *Arv;
apontadorEstado *proxEstado;
}celEstado;
typedef struct{
char nomeCidade[30];
char nomeEstado[30];
int populacao;
int beneficiarios;
float idhm;
apontadorCidade *esq;
apontadorCidade *dir;
}celCidade;
typedef struct{
celEstado *inicioLista;
}tipoListaEstado;
int insereCidade(celCidade newCidade, celEstado *auxEstado){
if(auxEstado->Arv == NULL){
auxEstado->Arv = (apontadorCidade*)malloc(sizeof(celCidade));
auxEstado->Arv->beneficiarios = newCidade.beneficiarios;
auxEstado->Arv->idhm = newCidade.idhm;
auxEstado->Arv->populacao = newCidade.populacao;
strcpy(auxEstado->Arv->nomeCidade, newCidade.nomeCidade);
strcpy(auxEstado->Arv->nomeEstado, newCidade.nomeEstado);
return 0;
}
if(auxEstado->Arv->nomeCidade[0] >= newCidade.nomeCidade[0]){
insereCidade(newCidade, auxEstado->Arv->dir);
}else if(auxEstado->Arv->nomeCidade[0] < newCidade.nomeCidade[0]){
insereCidade(newCidade, auxEstado->Arv->esq);
}
auxEstado->qtdCidades++;
auxEstado->beneficiarios += newCidade.beneficiarios;
auxEstado->populacao += newCidade.populacao;
auxEstado->idh += newCidade.idhm;
strcpy(auxEstado->nome, newCidade.nomeEstado);
return 0;
}
bool buscaEstado(tipoListaEstado *listaEstado, celEstado *auxEstado,
celCidade newCidade){
bool retorno;
auxEstado = listaEstado->inicioLista;
do{
retorno = false;
if(strcmp(newCidade.nomeEstado, auxEstado->nome) == 0){
return true;
}else{
auxEstado = auxEstado->proxEstado;
}
}while(retorno == false || auxEstado->proxEstado != NULL);
return false;
}
void carregaArquivo(FILE *arquivo, tipoListaEstado *listaEstado){
celEstado *auxEstado;
celCidade newCidade;
while(fscanf(arquivo, "%[^;],%[^;],%d;%f;%d", &newCidade.nomeCidade, &newCidade.nomeEstado, &newCidade.populacao, &newCidade.idhm, &newCidade.beneficiarios) != EOF){
if(listaEstado->inicioLista == NULL){
listaEstado->inicioLista = (celEstado*)malloc(sizeof(celEstado));
strcpy(listaEstado->inicioLista->nome, newCidade.nomeEstado);
auxEstado = listaEstado->inicioLista;
}
if(strcmp(newCidade.nomeEstado, auxEstado->nome) == 0){
insereCidade(newCidade, auxEstado);
}
if(buscaEstado(listaEstado, auxEstado, newCidade) == false){
auxEstado->proxEstado = (celEstado*)malloc(sizeof(celEstado));
auxEstado = auxEstado->proxEstado;
insereCidade(newCidade, auxEstado);
}
}
}
int main() {
FILE *arquivo;
tipoListaEstado listaEstado;
arquivo = fopen("data.csv", "r");
if(arquivo == NULL){
printf("Erro ao abrir o arquivo");
}
return 0;
}
You are passing only the value of your struct, when you finish the function the memory is returned to the system and your pointers are lost. I recommend using pointer pointer, so you pass the struct by reference and not by value
– Andre Lacomski
in case it turns the
typedef struct celCidade apontadorCidade
intypedef struct celCidade *apontadorCidade
? and then declare aapontadorCidade *auxCidade
?– H.Lima
the struct is correct. At the time you call the function inseCidade, it passes like this: inseCidade(&newCidade, &auxEstado). And its function would be int inseCidade(celCidade **newCidade, celEstado **auxEstado). Instead of using only auxState, it uses *auxState. Where **auxState will be a pointer that points directly to theState of your function loadFile, so do not lose the data at the end of the function.
– Andre Lacomski
The problem is not in data loss, at least not that I have noticed, the problem is compilation even. error
[Error] dereferencing pointer to incomplete type
is preventing the program from being compiled and tested– H.Lima
Instead of using typedef struct celCidade pointCidade; tries to put directly in the struct like this: typedef struct celCidade{ char nameCity[30]; charName[30]; int populace; int benefit; float idhm; struct celCity *Esq; struct celCity *dir; }pointCity;
– Andre Lacomski
Gives unknown type error because of cell pointers, I’ve tried this kkkkkk
– H.Lima