List removal

Asked

Viewed 66 times

0

I have a program that registers trucks, cargo and cities through a list. I tried to remove the truck list, but when I removed it, the insertion still continues, as if I hadn’t removed anything. What I’m missing (is 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);
    }
}

2 answers

1


Missing update the head with the value NULL, is this way:

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

-1

@João Gabriel, your code is a mess, try to organize your navigation menu better, 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 duties through your responsibility. Ex.:

case 0:
return;

Here in case 0 do not need to break, because it will already finish the function session, returning to your 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 the modifications are made, post your code in the gist or pastbin, and send us the link. Hugs and hope to help, so it’s better for those who read your code and better to be able to help more!

Browser other questions tagged

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