Could you help me invert a linked list? When inverting only the last element appears

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <new>

typedef struct dados{
    char nome[20];
    char profissao[20];
    int idade;
    float salario;
    dados *prox;
    dados *anterior = NULL;
}cliente;

typedef struct tipoFila{
    cliente *inicio;
    cliente *fim;
}tFila;


cliente *cabeca = new cliente;
cliente *aux = cabeca;



void filavazia(tFila *p){
    cliente *novo = new cliente;
    p->inicio = NULL;
    p->fim = NULL;
}

void inserir(tFila *p){
    cliente *novo = new cliente;

    printf("\t\nººº Voce escolheu a opcao cadastrar cliente ººº\n\n");

    printf("Nome: ");
    scanf("%s", &novo->nome);
    printf("Profissao: ");
    scanf("%s", &novo->profissao);
    printf("Idade: ");
    scanf("%d", &novo->idade);
    printf("Salario: ");
    scanf("%f", &novo->salario);

    /*fim->prox = novo;
    fim = fim->prox;
    novo->prox = inicio;*/
    novo->prox = NULL;
    if(p->inicio == NULL){
        p->inicio = novo;
        p->fim = novo;
    }else{
        p->fim->prox = novo;
        p->fim = novo;
    }

    printf("\t\nSALVO\n\n");

}

void listar(tFila *p){
    cliente *aux = p->inicio;

    if(aux == NULL){
        printf("ERRO - Fila Vazia\n\n");
        return;
    }
    printf("\tººº CLIENTES CADASTRADOS ººº\n\n");

    while(aux != NULL){
        printf("Nome: %s\n", aux->nome);
        printf("Profissao: %s\n", aux->profissao);
        printf("Idade: %d\n", aux->idade);
        printf("Salario: %.1f\n", aux->salario);

        printf("\n");

        aux = aux->prox;

    }
}

void remover(tFila *p){
    cliente *aux;
    cliente *excluir;

    aux = p->inicio->prox;
    excluir = p->inicio;

    if(p->inicio->prox == NULL){
        printf("ERRO - Fila Vazia\n\n");
        return;
    }else{
        excluir->prox = aux->prox;
        aux = NULL;
        printf("\tRemovido com Sucesso\n\n");
    }
}

void listarinvertido(tFila *p){
    cliente *aux = p->fim;

    if(aux->prox == NULL){
        printf("ERRO - Fila Vazia\n\n");
        return;
    }
    printf("\tººº CLIENTES CADASTRADOS ººº\n\n");

    while(aux != NULL){
        printf("Nome: %s\n", aux->nome);
        printf("Profissao: %s\n", aux->profissao);
        printf("Idade: %d\n", aux->idade);
        printf("Salario: %.1f\n", aux->salario);

        printf("\n");

        aux = aux->anterior;
    }

}

void inverterElementos(cliente *e, cliente *ant){
    if(e->prox != NULL){
        inverterElementos(e->prox, e);
    e->prox = ant;
    }
}

void inverter(tFila *p){
    inverterElementos(p->inicio, NULL);
    cliente *aux = p->inicio;
    p->inicio = p->fim;
    p->fim = aux;
}

int main(){

    int op;
    tFila p;

    filavazia(&p);

    do{
        printf("\t ººº MENU ººº\n");
        printf("1- Inserir \n");
        printf("2- Remover \n");
        printf("3- Listar \n");
        printf("4- Listar invertido \n");
        printf("5- Sair\n");
        printf("Escolha uma opcao e digite ENTER: ");

        scanf("%d", &op);

        printf("\n");

        system("CLS");

        switch(op){
        case 1:
            inserir(&p);
            break;
        case 2:
            remover(&p);
            break;
        case 3:
            listar(&p);
            break;
        case 4:
            inverter(&p);
            listarinvertido(&p);
            break;
        case 5:
            break;
        }
    }while (op!= 5);


return 0;
}
    
asked by anonymous 24.10.2018 / 18:36

1 answer

0

You are not assigning value to e->ant

To solve this, you must save the value of auxiliar = e->prox in an auxiliary variable, then assign previous to e->prox = ant and then assign auxiliary to e->ant=auxiliar

Try using more explicit naming so your code is more understandable. For example, change ant by anterior , prox by proximo , e by elemento or no .

Also try to avoid "Hungara" notation by putting tipo in front of Queue. The struct calling Fila is perfectly acceptable

void inverterElementos( cliente *e, cliente *ant )
{
   if( e->prox != NULL )
   {
       inverterElementos( e->prox, e );
   }
   auxialiar = e->prox;
   e->prox = ant;
   e->ant = auxiliar;

 }
    
24.10.2018 / 19:31