List of states where each node will be linked to a binary city search tree

Asked

Viewed 67 times

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

  • in case it turns the typedef struct celCidade apontadorCidade in typedef struct celCidade *apontadorCidade? and then declare a apontadorCidade *auxCidade?

  • 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.

  • 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

  • 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;

  • Gives unknown type error because of cell pointers, I’ve tried this kkkkkk

Show 1 more comment

1 answer

0

A solution would be:

typedef struct celCidade apontadorCidade;
typedef struct celEstado apontadorEstado;

struct celEstado{

    char nome[30];
    int populacao;
    int beneficiarios;
    int qtdCidades;
    float idh;
    apontadorCidade *Arv;
    apontadorEstado *proxEstado;
};

typedef struct celEstado celEstado;


struct celCidade{

    char nomeCidade[30];
    char nomeEstado[30];
    int populacao;
    int beneficiarios;
    float idhm;
    apontadorCidade *esq;
    apontadorCidade *dir;

};

typedef struct celCidade celCidade;

But I can’t understand why you declare the types apontadorCidade and apontadorEstado. Why not use celEstado and celCidade directly??

Browser other questions tagged

You are not signed in. Login or sign up in order to post.