Could you help me invert a chained list? When reversing only the last element appears

Asked

Viewed 670 times

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

1 answer

1

You are not assigning value to e->ant

to solve this 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 nomenclature to make your code more understandable. For example, swap ant for anterior, prox for proximo, e for elemento or no.

Also try to avoid notation "Hungara" as putting tipo in the front of Fila. The struct is called 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;

 }
  • hasn’t worked out yet :/

  • Voce has to take the e->prox of if statment

  • It worked. Thank you.. I was already pissed off about it. Now, can you just help me out with one more little thing? because I need to select the inverted 2x option in the menu so that it can invert?

Browser other questions tagged

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