data structure problem

Asked

Viewed 678 times

2

Hello, I am doing a simple program of data structure it, have to organize some flights as for example register airports and flights of these airports, each flight line can only have one plane going and one coming back, so I did this program:

main. c

#include <locale.h>
#include "menu.h"

//Programa principal
int main()
{
    setlocale(LC_CTYPE, "Portuguese");

    _Aeroporto* cabAeroporto;
    aloca_memoria_aeroporto(&cabAeroporto);

    int op;

    menu(op);

    return 0;
}

menu. h

#include "menu.c"

void Display_Menu();
int menu (int);

menu. c

#include "src\src.h"

//2 Constantes para controle do fluxo do programa, um para congelar a tela e outro para limpar
#define CLEAR "cls"
#define PAUSE "pause"

//Display do menu do sistema de controle aereo
void Display_Menu()
{
    system("cls");
    printf("            Menu            \n");
    printf("1- Cadastrar Aeroporto.\n");
    printf("2- Lista Aeroportos.\n");
    printf("3- Remove Aeroporto.\n");
    printf("4- Cadastrar Voo.\n");
    printf("5- Ver Voos do aeroporto.\n");
    printf("6- Ver Voos da companhia.\n");
    printf("7- Remove voo.\n");
    printf("8- Experimentar a viagem iterativa.\n");
    printf("0- Sair\n\n");
    printf("Escolha uma opcao:");

}

int menu (int op)
{

    do{
        system(CLEAR);

        Display_Menu();

        scanf("%d",&op);

        switch (op){
            case 1:{
/*linha 38*/    cadastra_aeroporto(cabAeroporto);
                break;
            }
            case 2:{
                lista_aeroportos(cabAeroporto);
                break;
            }
            case 3:{
                remove_aeroportos(cabAeroporto);
                break;
            }
            case 4:{
                cadastra_voo(cabAeroporto);
                break;
            }
            case 5:{
                lista_voos_aeroporto(cabAeroporto);
                break;
            }
            case 6:{
                lista_voos_companhia(cabAeroporto);
                break;
            }
            case 7:{
                remove_voo(cabAeroporto);
                break;
            }
            case 8:{
                viagem_iterativa(cabAeroporto);
                break;
            }
        }

        system(PAUSE);

    }while(op != 0);
}

src. h

#include "src.c"

void aloca_memoria_aeroporto();
void aloca_memoria_voo();
void cadastra_aeroporto();
void ler_dados_aeroporto();
void lista_aeroportos();
void imprime_aeroporto();
void remove_aeroportos();
void cadastra_voo();
void ler_dados_voo();
void lista_voos_aeroporto();
void imprime_voo();
void lista_voos_companhia();
void remove_voo();
void viagem_iterativa();

src. c

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

//2 Constantes para controle do fluxo do programa, um para congelar a tela e outro para limpar
#define CLEAR "cls"
#define PAUSE "pause"

//Estrutura tipo voo
typedef struct _voo{
    char companhia [50];
    int numero;
    struct _aeroporto* destino;
    struct _voo* proximo;
    struct _voo* anterior;

} _Voo;

//Estrutura tipo aeroporto
typedef struct _aeroporto{
    char nome [50];
    struct _voo* voos;
    struct _aeroporto* proximo;
    struct _aeroporto* anterior;

} _Aeroporto;

//Busca na lista de aeroportos algum aeroporto cujo nome seja igual ao recebido
_Aeroporto* busca_aeroporto(_Aeroporto* cabAeroporto, char nome_aeroporto[]){

    _Aeroporto* cursor;

    for(cursor = cabAeroporto->proximo ; cursor != NULL; cursor = cursor->proximo){
        if(strcmp(nome_aeroporto, cursor->nome) == 0){
            return cursor;
        }
  }
    return NULL;
}

//Recebe o nome do aeroporto de origem e de destino e verifica se existe algum voo parecido.
_Voo* busca_voo(_Aeroporto* cabAeroporto, char origem[], char destino[]){

    _Voo* voos;
    _Voo* voo_cursor;
    _Aeroporto* aeroporto;

    aeroporto = busca_aeroporto(cabAeroporto, origem);

    if(aeroporto){
        voos = aeroporto->voos;

        for(voo_cursor = voos->proximo ; voo_cursor != NULL; voo_cursor = voo_cursor->proximo){
            if(strcmp(destino, (voo_cursor->destino)->nome) == 0){
                return voo_cursor;
            }
        }
    }

    return NULL;
}

//Aloca memoria para um tipo _Aeroporto
void aloca_memoria_aeroporto(_Aeroporto** aeroporto){
    (*aeroporto) = (_Aeroporto*) malloc (sizeof(_Aeroporto));

    if ((*aeroporto) == NULL){
        printf("Falha na alocacao da memoria\n");
    }

    (*aeroporto)->proximo = NULL;
}

//Aloca memoria para um tipo _Voo
void aloca_memoria_voo(_Voo** voo){
    (*voo) = (_Voo*) malloc (sizeof(_Voo));

    if ((*voo) == NULL){
        printf("Falha na alocacao da memoria\n");
    }

    (*voo)->proximo = NULL;
}

//Cadastra aeroporto
void cadastra_aeroporto(_Aeroporto* cabAeroporto){
    _Aeroporto* aeroporto;
    _Aeroporto* cursor;

    // Obtem o endereco do cabeca
    cursor = cabAeroporto;

    // Aloca a memoria para um novo elemento
    aloca_memoria_aeroporto(&aeroporto);
    aloca_memoria_voo(&aeroporto->voos);

    // Le o dados a serem cadastrados
    ler_dados_aeroporto(aeroporto);

    if(busca_aeroporto(cabAeroporto, aeroporto->nome)){
        printf("Nome de aeroporto j� registrado!\n");
        return 1;
    }

    // Navega ate o fim da lista
    while (cursor->proximo != NULL){
        cursor = cursor->proximo;
    }

    // Insere o novo elemento no fim da lista
    cursor->proximo = aeroporto;
    aeroporto->anterior = cursor;
}

//Faz a leitura de dados do aeroporto
void ler_dados_aeroporto(_Aeroporto* aeroporto){
    printf("Nome do aeroporto: ");
    scanf(" %[^\n]s", aeroporto->nome);
}

// Varre a lista de aeroportos e imprime-os
void lista_aeroportos(_Aeroporto* cabAeroporto){

    _Aeroporto* cursor;

    printf("Aeroportos da lista\n\n");

    for(cursor = cabAeroporto->proximo ; cursor != NULL; cursor = cursor->proximo){
        imprime_aeroporto(cursor);
    }
}

//Imprime os dados de um aeroporto
void imprime_aeroporto(_Aeroporto* cabAeroporto){
    printf("Nome do aeroporto: %s\n",cabAeroporto->nome);
}

//Remove um aeroporto da lista de aeroportos
void remove_aeroportos(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    char nome_aux[50];
    int comp = 0;

    printf("Nome do aeroporto para ser removido: ");
    scanf(" %[^\n]s", nome_aux);

    aeroporto = busca_aeroporto(cabAeroporto, nome_aux);

    if(aeroporto){
        (aeroporto->anterior)->proximo = aeroporto->proximo;
         printf("Aeroporto remotivo com sucesso!\n\n");
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }
}

//Cadastra voo
void cadastra_voo(_Aeroporto* cabAeroporto){

    _Voo* voo;
    _Voo* cursor_voo;
    _Aeroporto* origem;
    _Aeroporto* destino;
    char nome_origem[50];
    char nome_destino[50];

    // Aloca a memoria para um novo elemento
    aloca_memoria_voo(&voo);

    // Le o dados a serem cadastrados
    ler_dados_voo(voo);

    printf("Nome da origem: ");
    scanf(" %[^\n]s", nome_origem);

    origem = busca_aeroporto(cabAeroporto, nome_origem);

    if(origem){
        cursor_voo = origem->voos;
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }

    printf("Nome do destino: ");
    scanf(" %[^\n]s", nome_destino);

    if(busca_voo(cabAeroporto, nome_origem ,nome_destino)){
        printf("Voo j� programado!\n");
        return 1;
    }

    destino = busca_aeroporto(cabAeroporto, nome_destino);

    if(destino){
        voo->destino = destino;
    }else{
        printf("Nenhum aeroporto com este nome foi encontrado!\n\n");
    }

    while (cursor_voo->proximo != NULL){
        cursor_voo = cursor_voo->proximo;
    }

    // Insere o novo elemento no fim da lista
    cursor_voo->proximo = voo;
    voo->anterior = cursor_voo;

    printf("Voo adicionado com sucesso!\n\n");
}

//Coleta os dadados do voo vindos do usu�rio
void ler_dados_voo(_Voo* voo){
    printf("N�mero do voo: ");
    scanf("%d", &voo->numero);

    printf("Nome da companhia a�rea: ");
    scanf(" %[^\n]s", voo->companhia);
}

//Lista todos os voos que saem de um determinado aeroporto
void lista_voos_aeroporto(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voos;
    _Voo* voo_cursor;
    char nome_aux[50];

    printf("Nome do aeroporto: ");
    scanf(" %[^\n]s", nome_aux);

    aeroporto = busca_aeroporto(cabAeroporto, nome_aux);

    if(aeroporto){

        voos = aeroporto->voos;

        for(voo_cursor = voos->proximo ; voo_cursor != NULL; voo_cursor = voo_cursor->proximo){
            imprime_voo(voo_cursor);
        }

    }else{
        printf("Aeroporto n�o encontrado!\n");
    }
}

//Imprime na tela os dados de um voo
void imprime_voo(_Voo* voo){
    printf("N�mero do voo: %d\n",voo->numero);
    printf("Nome da companhia: %s\n",voo->companhia);
    printf("Aeroporto de destino: %s\n",(voo->destino)->nome);
}

//Lista todos os voos que saem de um determinado companhia aerea
void lista_voos_companhia(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voos;
    _Voo* voo_cursor;
    char nome_aux[50];

    aeroporto = cabAeroporto;

    printf("Nome da companhia: ");
    scanf(" %[^\n]s", nome_aux);

    while (aeroporto->proximo != NULL){

        aeroporto = aeroporto->proximo;
        voo_cursor = aeroporto->voos;

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;

            if(strcmp(nome_aux, voo_cursor->companhia) == 0){
                printf("De %s para %s:\n",aeroporto->nome, (voo_cursor->destino)->nome);
            }
        }
    }
}

//Remove voo de uma lista de voos
void remove_voo(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voos;
    _Voo* voo_cursor;
    char nome_origem[50];
    char nome_destino[50];

    aeroporto = cabAeroporto;

    printf("Nome do aeroporto de origem: ");
    scanf(" %[^\n]s", nome_origem);

    aeroporto = busca_aeroporto(cabAeroporto, nome_origem);

    if(aeroporto){

        printf("Nome do aeroporto de destino: ");
        scanf(" %[^\n]s", nome_destino);

        voo_cursor = aeroporto->voos;

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;

            if(strcmp(nome_destino, (voo_cursor->destino)->nome) == 0){
                (voo_cursor->anterior)->proximo = voo_cursor->proximo;
                printf("Aeroporto remotivo com sucesso!\n\n");
            }
        }
    }else{
        printf("Aeroporto n�o encontrado!\n");
    }
}

//Faz uma viagem iterativa com o usu�rio
void viagem_iterativa(_Aeroporto* cabAeroporto){

    _Aeroporto* aeroporto;
    _Voo* voo_inicial = NULL;
    _Voo* voo_cursor = NULL;
    int op, aux;

    aeroporto = cabAeroporto;

    if(aeroporto->proximo == NULL){
        printf("N�o existe aeroportos cadastrados!\n");
        return 1;
    }

    while (aeroporto->proximo != NULL){

        aeroporto = aeroporto->proximo;

        if((aeroporto->voos)->proximo != NULL){
            voo_inicial = aeroporto->voos;
            break;
        }
    }

    if(voo_inicial == NULL){
        printf("Nenhum voo cadastrado!\n");
        return 1;
    }

    do{
        voo_cursor = voo_inicial;
        aux = 0;
        system(CLEAR);

        printf("            Voos do aeroporto %s!            \n", aeroporto->nome);

        while (voo_cursor->proximo != NULL){
            voo_cursor = voo_cursor->proximo;
            imprime_voo(voo_cursor);
            printf("\n");
        }

        printf("\n0- Sair\n\n");
        printf("Escolha um voo:");

        scanf("%d",&op);

        voo_cursor = voo_inicial;

        if(op != 0){
            while (voo_cursor->proximo != NULL){
                voo_cursor = voo_cursor->proximo;
                if(voo_cursor->numero == op){
                    voo_inicial = (voo_cursor->destino)->voos;
                    aeroporto = voo_cursor->destino;
                    aux++;
                }
            }

            if(aux == 0){
                printf("N�mero de voo incorreto!\n");
                system(PAUSE);
            }
        }

    }while(op != 0);

}

In the linha 38 of menu.c (is marked in the code), I am having an error that I am not able to solve, it says cabAeroporto is not declared, however, it is declared in _Aeroporto* cabAeroporto; in #main. c

  • 3

    Do not include file knives with extension .c. Compile them separately and let Linker do what he knows.

  • @pmg as well?

  • What is your operating system and compiler?

  • use Windows my IDE in case is Falcon C++ the compiler is gcc gnu

  • 1

    with gcc, after removing the #include with extension files . c and review the includes structure, does gcc -std=c89 -pedantic -Wall src.c menu.c main.c. This will compile the 3 source files and automatically "link" all in one executable.

  • that’s the idea.

Show 1 more comment

3 answers

1

The cabAeroporto defined in main. c is a local variable, which belongs to the function only main().
The function menu() defined in menu.c does not know the local variables of other functions.

To pass values between functions, use the arguments.

menu(op, cabAeroporto); // também passa o valor de cabAeroporto para a função

Of course you have to change the function

int menu(int op, struct _aeroporto *cabAeroporto) { /* ... */ }

If passing the value is not enough, if you need to change that value within the initial function, you need to pass the address of the variable

menu(op, &cabAeroporto); // também passa o endereço de cabAeroporto para a função

And the function becomes

int menu(int op, struct _aeroporto **cabAeroporto) { /* ... */ }

1

Variables defined within a code block (between { and }) can only be accessed within this block (and the nested blocks). If you do not want to reset functions, you can declare the variable cabAeroporto as global, outside the function main(), as follows:

#include <locale.h>
#include "menu.h"

// Variável global - pode ser acessada em qualquer escopo do arquivo
_Aeroporto* cabAeroporto;

//Programa principal
int main()
{
  setlocale(LC_CTYPE, "Portuguese");

  aloca_memoria_aeroporto(&cabAeroporto);

  int op;

  menu(op);

  return 0;
}

If you need to access this same variable in another file, you must declare a global variable of the same name and preceded by the keyword extern in each file that uses this variable (extern _Aeroporto* cabAeroporto;).

  • Global variables are bad.

  • 1

    Well, it depends. It would be better to use an object-oriented language and declare it as a static attribute to maintain encapsulation.

  • knowing that it would be better with an object-oriented language, however I am doing to study language C.

  • however, my mistake is very basic, thank you very much for helping me =) @Filipebeck

  • So I was noticing and I noticed something else @pmg and @Filipebeck, the _Aeroporto* cabAeroporto; [\n]&#xA; aloca_memoria_aeroporto(&cabAeroporto); that were sloped in the main.c they should be in the menu.c within the function int menu(), for the main.c doesn’t take the library src.h is the menu.c who does this, which brings me another doubt, I should by a include src in the main.c too?

  • You can leave the global statement on main.c (_Aeroporto* cabAeroporto;) and redeclare the same variable as extern in other files that need to access it (extern _Aeroporto* cabAeroporto;). This way, you will not be creating a new global variable of the same name, but telling the compiler that there is a global variable with that name that is defined in another file. But, as @pmg said yourself, you should not do #include of implementation files (.m). You must compile separately and then link these files.

Show 1 more comment

1


main. c

#include <locale.h>
#include "menu.h"

//Programa principal
int main()
{
    setlocale(LC_CTYPE, "Portuguese");       // 1

    _Aeroporto* cabAeroporto;                // 2
    aloca_memoria_aeroporto(&cabAeroporto);  // 3

    int op;
    menu(op);                                // 4

    return 0;
}

With regard to #includeyou should think so:

// 1 the function prototype setlocale() and the definition of LC_CTYPE are in the header <locale.h>. Okay, already included

// 2 The type of data _Aeroporto this defined in the file "src.c". You are in the wrong file! Should I pass the setting to a file with extension . h and include that file

// 3 the function prototype aloca_memoria_aeroporto() this in the file "src.h". So I need to include this file. By the way, this file looks like a good place to put the type definition _Aeroporto

// 4 the function prototype menu() this in the file "menu.h". Okay, already included.

  • I did what you said and now you say you’re giving redefinition of struct_voo and conflicting types _Voo (on line 11 and 18 of the website. c), I tried to reset the name of the struct (in all places using it) and did not give after trying to change the variable typo to another name also did not give. I don’t know what’s missing, chained list is tying a knot in my head

  • 1

    Files . h must contain prototypes of functions, constant definitions (#define), type definitions (typedef) and not much else. Files . c must contain code and #includes necessary and little more.

  • then I made several modifications to the program as I can show them to you without modifying the post????

  • 1

    Hmm ... to keep the answers consistent, maybe you should ask another question.

  • Yes that’s what I’ll do, also I’ll close here

Browser other questions tagged

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