Good morning, this is my first post here on Stack Overflow. I was trying to make a double-chained list print in reverse order. However, after going through this list in reverse, it produced the result unexpectedly. My code is printing more than necessary. Here is the attached print and source code.
I count on your help!
#include<stdio.h>#include<stdlib.h>//Exercício:Inserircélulasnalistaduplamenteencadeadaeemseguidaimprimí-lasnaordeminversatypedefstructcel{structcel*ant;intconteudo;structcel*prox;}celula;celula*criaLista(){returnNULL;}celula*insereInicioLista(celula*inicio,intvalor){celula*novo=(celula*)malloc(sizeof(celula));//InicialmenteosponteirosiniefimapontamparaNULLcelula*ini=inicio;celula*fim=inicio;if(novo==NULL){printf("Memoria insuficiente\n");
exit(1);
} else if(verificaListaVazia(inicio)){
novo->conteudo = valor;
novo->prox = fim;
novo->ant = ini;
fim = novo;
ini = novo;
return ini;
} else {
novo->conteudo = valor;
novo->prox = fim;
fim->ant = novo;
ini = novo;
return ini;
}
}
int verificaListaVazia(celula* lista){
return lista == NULL;
}
void imprimeLista(celula* lista){
celula* p = lista;
for(; p != NULL; p = p->prox){
printf("%d-> ", p->conteudo);
// printf("valor: %d\n", p->conteudo);
// printf("Endereco de p: %p\n", p);
// printf("Endereco do prox de p: %p\n", p->prox);
// printf("Endereco anterior a p: %p\n\n", p->ant);
}
printf("\n\n");
}
void imprimeListaNaOrdemInversa(celula* inicio){
celula* p = inicio; //Ponteiro que aponta para o início da lista
while(p->prox != NULL){
p = p->prox;
}
//Ao final, p passa a apontar para o último nó
celula* final = p;
for(; final != NULL; final = final->ant){
printf(" <- %d", final->conteudo);
}
printf("\n\n");
}
int main(int argc, char *argv[]) {
celula* lista = (celula*)malloc(sizeof(celula));
if(lista == NULL){
printf("Memoria insuficiente\n");
exit(1);
} else {
lista = criaLista();
lista = insereInicioLista(lista, 10);
lista = insereInicioLista(lista, 20);
lista = insereInicioLista(lista, 30);
lista = insereInicioLista(lista, 40);
lista = insereInicioLista(lista, 50);
printf("LISTA DUPLAMENTE ENCADEADA\n");
imprimeLista(lista);
printf("LISTA DUPLAMENTE ENCADEADA INVERSA\n");
imprimeListaNaOrdemInversa(lista);
}
return 0;
}