Autor
|
Tema: Ayuda con lista doblemente enlazada (Leído 9,303 veces)
|
falconez
Desconectado
Mensajes: 18
|
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"); }
|
|
« Última modificación: 12 Diciembre 2013, 01:57 am por falconez »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
falconez
Desconectado
Mensajes: 18
|
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"); }
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
una lista circular doblemente enlazada en c sharp c#
.NET (C#, VB.NET, ASP)
|
neo_angel_xxx
|
2
|
9,313
|
29 Octubre 2010, 01:48 am
por [D4N93R]
|
|
|
ayuda...Lista doblemente enlazada
Java
|
goll9d
|
2
|
3,805
|
22 Enero 2012, 04:50 am
por goll9d
|
|
|
ayuda con lista doblemente enlazada
Programación C/C++
|
gibi77
|
3
|
3,919
|
7 Marzo 2012, 07:47 am
por nirvguy
|
|
|
Ordenar strings de analisis de fechas en lista doblemente enlazada.
Programación C/C++
|
falconez
|
1
|
2,683
|
16 Junio 2014, 09:21 am
por eferion
|
|
|
Insertar enmedio de una lista doblemente enlazada
Programación C/C++
|
BrendiisFox
|
3
|
3,775
|
16 Septiembre 2015, 21:05 pm
por ivancea96
|
|