data structure problem

2
Hello, I'm doing a simple data structure program, he has to organize some flights like for example to register airports and flights of these aeroportes, each flight line can only have one airplane going and one coming back, so I made 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% with% of linha 38 (this is marked in code), I am having an error that I am not able to resolve, it says menu.c is not declared, however, it is declared in cabAeroporto in #main .c

    
asked by anonymous 27.05.2015 / 22:33

3 answers

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

As far as #include s should think like this:

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

// 2 The _Aeroporto data type is defined in the "src.c" file. It's in the wrong file! Should I pass the definition to a file with .h extension and include that file

// 3 The prototype of the aloca_memoria_aeroporto() function is in the "src.h" file. So I need to include this file. Now, this file seems like a good place to put the definition of type _Aeroporto

// 4 The prototype of the menu() function is in the "menu.h" file. OK, already included.

    
28.05.2015 / 19:28
1

The cabAeroporto defined in main.c is a local variable, which belongs only to the main() function. The menu() function 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 you pass the value is not enough, if you need to change this value inside the initial function, you have 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) { /* ... */ }
    
28.05.2015 / 10:09
1

Variables defined within a code block (between { and } ) can only be accessed within that block (and nested blocks). If you do not want to redefine the functions, you can declare the variable cabAeroporto as global, outside the main() function, 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 extern keyword in each file that uses that variable ( extern _Aeroporto* cabAeroporto; ).     

28.05.2015 / 12:32