Saludos con todos los miembros, soy nuevo en el foro. Necesito ayuda con el siguiente codigo que estoy desarrollando:
Mi lista doblemente enlazada se tiene que mostrar en orden ascendente y descendente, pero de alguna forma no puedo solucionar el error del imprimir y tambien al momento de llamar la funcion. El aniadir tambien tiene problemas en la condicion: if(!actual || actual->datoNodo > v) { //error ! Me gustaria que me ayuden por favor. De antemano les agradezco.
#include <stdio.h>
#include<cstdlib>
#define ASCENDENTE 1
#define DESCENDENTE 0
struct miDato {
int valor;
};
struct nodo {
miDato datoNodo;
struct nodo *siguiente;
struct nodo *anterior;
};
void Insertar(nodo *apuntador, int v);
void MostrarLista(nodo apuntador, int orden);
int main() {
nodo *lista = NULL; //creando mi lista
Insertar(lista, 58);
Insertar(lista, 23);
Insertar(lista, 32);
Insertar(lista, 16);
MostrarLista(lista, ASCENDENTE); //error
MostrarLista(lista, DESCENDENTE); //error
return 0;
}
void Insertar(nodo *apuntador, int v) {
miDato valor;
nodo *nuevo, *actual;
nuevo = new (nodo);
*actual = *apuntador;
nuevo->datoNodo=valor;
if(actual) while(actual->anterior) actual = actual->anterior;
if(!actual || actual->datoNodo > v) { //error
/* Añadimos la lista a continuación del nuevo nodo */
nuevo->siguiente = actual;
nuevo->anterior = NULL;
if(actual) actual->anterior = nuevo;
if(!apuntador) apuntador = nuevo;
}
else {
while(actual->siguiente &&actual->siguiente->datoNodo.valor <= v)
actual = actual->siguiente;
nuevo->siguiente = actual->siguiente;
actual->siguiente = nuevo;
nuevo->anterior = actual;
if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
}
}
void MostrarLista(nodo *apuntador, int orden) {
nodo *auxiliar;
if(!apuntador) printf("Lista vacía");
auxiliar = apuntador;
if(orden == ASCENDENTE) {
while(auxiliar->anterior) auxiliar = auxiliar->anterior;
printf("Orden ascendente: \n");
while(auxiliar) {
printf("%d\n", auxiliar.datoNodo); //error
auxiliar = auxiliar->siguiente;
}
}
else {
while(auxiliar->siguiente) auxiliar = auxiliar->siguiente;
printf("Orden descendente: \n");
while(auxiliar) {
printf("%d\n", auxiliar->datoNodo); //error
auxiliar = nodo->anterior;
}
}
printf("\n");
}
Lo primero a cambiar es el nombre del encabezado por el políticamente correcto: <cstdio>. También deberías eliminar las macros en favor del tipo bool: true si se debe ordenar de forma ascendente y false en caso contrario. Y el prototipo y definición de la función "MostrarLista" no coinciden.
Otro detalle que no gusta del programa es, salvo el uso del operador new (es un operador que no requiere paréntesis) y la omisión de struct en las declaraciones, el programa no tiene nada de C++.
En cuanto a la función "Insertar" tiene varios errores, para empezar si el nodo a insertar debe colocarse antes del primero no hay forma de afectar a la variable "lista" de la función main ya que esta se pasa por valor.
La función con los cambios:
void Insertar(nodo*& apuntador, int v);
// ...
void Insertar(nodo*& lista, int v)
{
nodo *nuevo = new nodo;
nuevo->datoNodo.valor = v;
if (!lista || lista->datoNodo.valor > v){
nuevo->siguiente = lista;
nuevo->anterior = 0;
if (lista)
lista->anterior = nuevo;
lista = nuevo;
}else {
nodo *p = lista;
while (p->siguiente && p->siguiente->datoNodo.valor <= v)
p = p->siguiente;
nuevo->siguiente = p->siguiente;
nuevo->anterior = p;
p->siguiente = nuevo;
if (nuevo->siguiente)
nuevo->siguiente->anterior = nuevo;
}
}
Un saludo
Muchas gracias, segui tus pautas y el codigo compila a la perfeccion!
Les dejo el codigo completo para cualquier guia o para que les sirva de ayuda de una u otra forma. Saludos y bendiciones.
#include <stdio.h> //cstdio.h
#include <cstdlib>
#define ASCENDENTE 1
#define DESCENDENTE 0
struct miDato {
int valor;
};
struct nodo {
miDato datoNodo;
struct nodo *siguiente;
struct nodo *anterior;
};
void Insertar(nodo*& apuntador, int v);
void MostrarLista(nodo *apuntador, int orden);
int main() {
nodo *lista = NULL; //creando mi lista
Insertar(lista, 58);
Insertar(lista, 23);
Insertar(lista, 32);
Insertar(lista, 16);
MostrarLista(lista, ASCENDENTE);
MostrarLista(lista, DESCENDENTE);
return 0;
}
void Insertar(nodo*& lista, int v)
{
nodo *nuevo = new nodo;
nuevo->datoNodo.valor = v;
if (!lista || lista->datoNodo.valor > v){
nuevo->siguiente = lista;
nuevo->anterior = 0;
if (lista)
lista->anterior = nuevo;
lista = nuevo;
}else {
nodo *p = lista;
while (p->siguiente && p->siguiente->datoNodo.valor <= v)
p = p->siguiente;
nuevo->siguiente = p->siguiente;
nuevo->anterior = p;
p->siguiente = nuevo;
if (nuevo->siguiente)
nuevo->siguiente->anterior = nuevo;
}
}
void MostrarLista(nodo *apuntador, int orden) {
nodo *auxiliar;
if(!apuntador) printf("Lista vacía");
auxiliar = apuntador;
if(orden == ASCENDENTE) {
while(auxiliar->anterior) auxiliar = auxiliar->anterior;
printf("Orden ascendente: \n");
while(auxiliar) {
printf("%d\n", auxiliar->datoNodo.valor);
auxiliar = auxiliar->siguiente;
}
}
else {
while(auxiliar->siguiente) auxiliar = auxiliar->siguiente;
printf("Orden descendente: \n");
while(auxiliar) {
printf("%d\n", auxiliar->datoNodo.valor);
auxiliar = auxiliar->anterior;
}
}
printf("\n");
}