Removal from list

0

I am with a program that registers trucks, loads and cities through a list. I was trying to remove the truck list, but when I remove it, the insertion still continues, as if I had not removed anything. What am I missing (is it the last function)?

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

typedef struct caminhoes{
    int id;
    char motorista[200];
    char marca[200];
    char la[200];
    char lisd[200];
    float kml;
    struct caminhoes *prox;
}lcam;

typedef struct cargas{
    int id;
    char produto[200];
    char origem[200];
    char destino[200];
    float vfrete;
    struct cargas *prox;
}lcar;

 typedef struct cidades{
    int id;
    char nome[200];
    float vc;
    struct cidades *prox;
}lcid;


void cad_cam(lcam **cabeca);
void cad_car(lcar **carcabeca);
void cad_cid(lcid **cidcabeca);
void imp_cam(lcam *cabeca);
void imp_car(lcar *carcabeca);
void imp_cid(lcid *cidcabeca);
void salvacam(lcam **cabeca);
void salvacar(lcar **carcabeca);
void salvacid(lcid **cidcabeca);

int main()
{
    setlocale(LC_ALL, "Portuguese");

    lcam *cabeca = NULL;        
    lcam *noatual;    

    lcar *carcabeca = NULL;
    lcar *carnoatual; 

    lcid *cidcabeca = NULL;
    lcid *cidnoatual;

    int op;

    printf("0 - Fechar \n");
    printf("1 - Cadastrar Caminhão \n");
    printf("2 - Cadastrar Carga \n");
    printf("3 - Cadastrar Cidade \n");
    printf("4 - Imprimir Caminhão\n" );
    printf("5 - Imprimir Cargas\n");
    printf("6 - Imprimir Cidades\n");
    printf("7 - Excluir Caminhões \n");
    printf("8 - Excluir Cargas \n");
    printf("9 - Excluir Cidades\n");

    printf("Digite uma opcao: \n");
    scanf("%d", &op);

    while(op!=0)
    {
        switch(op)
        {
            case 0:
            {
                op=0;
                break;
            }
            break;
            case 1: cad_cam(&cabeca);
                    break;
            case 2: cad_car(&carcabeca);
                    break;
            case 3: cad_cid(&cidcabeca);
                    break;  
            case 4: imp_cam(cabeca);
                    break;
            case 5: imp_car(carcabeca);     
                    break;
            case 6:imp_cid(cidcabeca);
                   break;
            case 7:excam(&cabeca);
                   break;
            case 8:
                   break;
            case 9:
                   break;    
        }

        printf("\n0 - Fechar \n");
        printf("1 - Cadastrar Caminhão \n");
        printf("2 - Cadastrar Carga \n");
        printf("3 - Cadastrar Cidade \n");
        printf("4 - Imprimir Caminhão\n" );
        printf("5 - Imprimir Cargas\n");
        printf("6 - Imprimir Cidades\n");
        printf("7 - Excluir Caminhões \n");
        printf("8 - Excluir Cargas \n");
        printf("9 - Excluir Cidades\n");


        printf("Digite uma opcao: \n");
        scanf("%d", &op);
    } 

    salvacam(&cabeca);
    salvacar(&carcabeca);
    salvacid(&cidcabeca);
}


void cad_cam (lcam **cabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcam *noatual, *novono;

    int id;
    char mot[200];
    char mar[200];
    char loca[200];
    char lisd[200];
    float kml;

    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Motorista:\n");
    scanf("%[^\n]s", &mot);
    setbuf(stdin, NULL);
    printf("Marca:\n");
    scanf("%[^\n]s", &mar);
    setbuf(stdin, NULL);
    printf("Local Atual:\n");
    scanf("%[^\n]s", &loca);
    setbuf(stdin, NULL);
    printf("Lista de Destinos:\n");
    scanf("%[^\n]s", &lisd);
    setbuf(stdin, NULL);
    printf("KM/L:\n");
    scanf("%f", &kml);
    setbuf(stdin, NULL);

    if (*cabeca == NULL)   
    {
        *cabeca = malloc(sizeof(lcam));
        (*cabeca)->id = id;
        strcpy((*cabeca)->motorista, mot);
        strcpy((*cabeca)->marca, mar);
        strcpy((*cabeca)->la, loca);
        strcpy((*cabeca)->lisd, lisd);
        (*cabeca)->kml = kml;
        (*cabeca)->prox = NULL;
    }
    else
    {
        noatual = *cabeca;
        while(noatual->prox != NULL)
            noatual = noatual->prox;    
        novono =  malloc(sizeof(lcam));
        novono->id = id;
        strcpy(novono->motorista, mot);
        strcpy(novono->marca,mar);
        strcpy(novono->la,loca);
        strcpy(novono->lisd,lisd);
        novono->kml = kml;
        novono->prox = NULL;
        noatual->prox = novono;
    }
}

void cad_car (lcar **carcabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcar *carnoatual, *carnovono;

    int id;
    char prod[200];
    char ori[200];
    char dest[200];
    float vf;

    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Produto:\n");
    scanf("%[^\n]s", &prod);
    setbuf(stdin, NULL);
    printf("Origem:\n");
    scanf("%[^\n]s", &ori);
    setbuf(stdin, NULL);
    printf("Destino:\n");
    scanf("%[^\n]s", &dest);
    setbuf(stdin, NULL);
    printf("Valor do Frete:\nR$");
    scanf("%f", &vf);
    setbuf(stdin, NULL);

    if (*carcabeca == NULL)   
    {
        *carcabeca = malloc(sizeof(lcar));
        (*carcabeca)->id = id;
        strcpy((*carcabeca)->produto, prod);
        strcpy((*carcabeca)->origem, ori);
        strcpy((*carcabeca)->destino, dest);
        (*carcabeca)->vfrete = vf;
        (*carcabeca)->prox = NULL;
    }
    else
    {
        carnoatual = *carcabeca;

        while(carnoatual->prox != NULL)
            carnoatual = carnoatual->prox;    

        carnovono =  malloc(sizeof(lcar));
        carnovono->id = id;
        strcpy(carnovono->produto, prod);
        strcpy(carnovono->origem,ori);
        strcpy(carnovono->destino,dest);
        carnovono->vfrete = vf;
        carnovono->prox = NULL;
        carnoatual->prox = carnovono;
    }
}

void cad_cid (lcid **cidcabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcid *cidnoatual, *cidnovono;

    int id;
    char nome[200];
    char viz[200];
    char dist[200];
    float vac;

    printf("ID:\n");
    scanf("%d", &id);
    setbuf(stdin, NULL);
    printf("Nome da Cidade:\n");
    scanf("%[^\n]s", &nome);
    setbuf(stdin, NULL);
    printf("Digite o Valor do Combistível:\nR$");
    scanf("%f", &vac);
    setbuf(stdin, NULL);


    if (*cidcabeca == NULL)   
    {
        *cidcabeca = malloc(sizeof(lcid));
        (*cidcabeca)->id = id;
        strcpy((*cidcabeca)->nome, nome);
        (*cidcabeca)->vc = vac;
        (*cidcabeca)->prox = NULL;
    }
    else
    {
        cidnoatual = *cidcabeca;
        while(cidnoatual->prox != NULL)
            cidnoatual = cidnoatual->prox;    
        cidnovono =  malloc(sizeof(lcid));
        cidnovono->id = id;
        strcpy(cidnovono->nome, nome);
        cidnovono->vc = vac;
        cidnovono->prox = NULL;
        cidnoatual->prox = cidnovono;
    }
}

void imp_cam(lcam *noatual)
{
    setlocale(LC_ALL, "Portuguese");

    while( noatual != NULL)    
    {
        printf("\nID:%d\n", noatual->id);
        printf("Motorista:%s\n", noatual->motorista);
        printf("Marca:%s\n", noatual->marca);
        printf("Local Atual:%s\n", noatual->la);
        printf("Lista de Destinos:%s\n", noatual->lisd);
        printf("KM/L:%.2f\n", noatual->kml);
        noatual = noatual->prox; 
    }
}

void imp_car(lcar *carnoatual)
{
    setlocale(LC_ALL, "Portuguese");

    while( carnoatual != NULL)    
    {
        printf("\nID:%d\n", carnoatual->id);
        printf("Produto:%s\n", carnoatual->produto);
        printf("Origem:%s\n", carnoatual->origem);
        printf("Destino:%s\n", carnoatual->destino);
        printf("Valor do Frete:R$%.2f\n", carnoatual->vfrete);
        carnoatual = carnoatual->prox; 
    }
}

void imp_cid(lcid *cidnoatual)
{
    setlocale(LC_ALL, "Portuguese");

    while( cidnoatual != NULL)    
    {
        printf("\nID:%d\n", cidnoatual->id);
        printf("Nome da Cidade:%s\n", cidnoatual->nome);
        printf("Valor do Combustível:%.2f\n", cidnoatual->vc);
        cidnoatual = cidnoatual->prox; 
    }
}

void salvacam(lcam **cabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcam *noatual;

    FILE *arquivo;
    arquivo = fopen("Caminhões.txt", "w");

    if(arquivo == NULL)
    {
        printf("Erro na Abertura do Arquivo");
    }
    else
    {
        noatual = *cabeca;

        if(noatual == NULL)
        {
            fprintf(arquivo,"Lista Vazia!\n");
        }
        else
        {
            noatual = *cabeca;

            while(noatual != NULL)
            {
                fprintf(arquivo,"ID:%d\n", noatual->id);
                fprintf(arquivo,"Motorista:%s\n", noatual->motorista);
                fprintf(arquivo,"Marca:%s\n", noatual->marca);
                fprintf(arquivo,"Local Atual:%s\n", noatual->la);
                fprintf(arquivo,"Lista de Destinos:%s\n", noatual->lisd);
                fprintf(arquivo,"KM/L:%.2f\n", noatual->kml);
                fputc('\n', arquivo);
                noatual = noatual->prox;
            }
        }
    }

    fclose(arquivo);
    printf("\nSalvo com Sucesso!");
}

void salvacar(lcar **carcabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcar *carnoatual;

    FILE *arquivo;
    arquivo = fopen("Cargas.txt", "w");

    if(arquivo == NULL)
    {
        printf("Erro na Abertura do Arquivo");
    }
    else
    {
        carnoatual = *carcabeca;

        if(carnoatual == NULL)
        {
            fprintf(arquivo,"Lista Vazia!\n");
        }
        else
        {
            carnoatual = *carcabeca;

            while(carnoatual != NULL)
            {
                fprintf(arquivo,"ID:%d\n", carnoatual->id);
                fprintf(arquivo,"Produto:%s\n", carnoatual->produto);
                fprintf(arquivo,"Origem:%s\n", carnoatual->origem);
                fprintf(arquivo,"Destino:%s\n", carnoatual->destino);
                fprintf(arquivo,"Valor do Frete:R$%.2f\n", carnoatual->vfrete);
                fputc('\n',arquivo);
                carnoatual = carnoatual->prox;
            }
        }
    }

    fclose(arquivo);
    printf("\nSalvo com Sucesso!");
}

void salvacid(lcid **cidcabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcid *cidnoatual;

    FILE *arquivo;
    arquivo = fopen("Cidades.txt", "w");

    if(arquivo == NULL)
    {
        printf("Erro na Abertura do Arquivo");
    }
    else
    {
        cidnoatual = *cidcabeca;

        if(cidnoatual == NULL)
        {
            fprintf(arquivo,"Lista Vazia!\n");
        }
        else
        {
            cidnoatual = *cidcabeca;

            while(cidnoatual != NULL)
            {
                fprintf(arquivo,"ID:%d\n", cidnoatual->id);
                fprintf(arquivo,"Nome da Cidade:%s\n", cidnoatual->nome);
                fprintf(arquivo,"Valor do Combustível:%.2f\n", cidnoatual->vc);
                fputc('\n',arquivo);
                cidnoatual = cidnoatual->prox;
            }
        }
    }

    fclose(arquivo);
    printf("\nSalvo com Sucesso!");
}

void excam(lcam **cabeca)
{
    setlocale(LC_ALL, "Portuguese");

    lcam *noatual;
    noatual = *cabeca;

    if(noatual == NULL)
    {
        printf("Lista Vazia!");
    }
    else
    {
        noatual = *cabeca;
        noatual = noatual->prox;
        free(noatual);
    }
}
    
asked by anonymous 06.03.2017 / 03:49

2 answers

1

The head is missing with the value NULL , it looks like this:

    void excam(lcam **cabeca)
    {
        setlocale(LC_ALL, "Portuguese");

        lcam *noatual;
        noatual = *cabeca;

        if(noatual == NULL)
        {
            printf("Lista Vazia!");
        }
        else
        {
            noatual = *cabeca;
            /* para remover todos os itens da lista */
            while(noatual != NULL){
                lcam *t = noatual;
                noatual = noatual->prox;
                free(t);
            }
        }
        /* faltou isso */
        *cabeca = NULL;
    }
    
06.03.2017 / 14:26
-1

@John Gabriel, your code is a mess, try to better organize your navigation menu, you are repeating without need.

void menu() {
printf("0 - Fechar \n");
printf("1 - Cadastrar Caminhão \n");
printf("2 - Cadastrar Carga \n");
printf("3 - Cadastrar Cidade \n");
printf("4 - Imprimir Caminhão\n" );
printf("5 - Imprimir Cargas\n");
printf("6 - Imprimir Cidades\n");
printf("7 - Excluir Caminhões \n");
printf("8 - Excluir Cargas \n");
printf("9 - Excluir Cidades\n");
printf("Digite uma opcao: \n");
scanf("%d", &op);

//Aqui você joga um Switch() parceiro... fica mais organizado.

}

Within each case, you better organize your roles on your own responsibility. Ex.:

case 0:
return;

Here in case 0 does not need to break, because it will already end the session of the function, returning its main ();

case 1:
cadastrarCaminhao();
break;

case 2:
cadastrarCarga();
break;
//etc...

At the end of your menu function, you put a menu (), so it is a recursive gambiarra that will help a lot, and it will be an infinite loop until you finish the program.

After making the changes, post your code in the gist or pastbin, and send the link to us. Hugs and I hope to help, so it is better for anyone reading your code and better to help you more!

    
06.03.2017 / 05:26