Título: Ayuda con lista doblemente enlazada Publicado por: falconez en 12 Diciembre 2013, 01:41 am 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"); } Título: Re: Ayuda con lista doblemente enlazada Publicado por: rir3760 en 12 Diciembre 2013, 15:46 pm 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: Código
Un saludo Título: Re: Ayuda con lista doblemente enlazada Publicado por: falconez en 16 Diciembre 2013, 01:35 am 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"); } |