0
Good morning, this is my first post here at Stack Overflow. I was trying to get a double-chained list printed in reverse order. However, after going through this list in reverse, it produced the result unexpectedly. My code is printing more than necessary. Follow the attached print and source code.
I’m counting on your help!
#include <stdio.h>
#include <stdlib.h>
//Exercício: Inserir células na lista duplamente encadeada e em seguida imprimí-las na ordem inversa
typedef struct cel{
struct cel* ant;
int conteudo;
struct cel* prox;
}celula;
celula* criaLista(){
return NULL;
}
celula* insereInicioLista(celula* inicio, int valor){
celula* novo = (celula*)malloc(sizeof(celula));
//Inicialmente os ponteiros ini e fim apontam para NULL
celula* 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;
}
I ran your code here and it showed no error.
– Gustavo Fragoso
In fact the problem is that the list is being printed showing the random numbers (memory junk) after printing the valid values I passed to the function.
– VictorMello1993