Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: falconez en 12 Diciembre 2013, 01:41 am



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
  1. void Insertar(nodo*& apuntador, int v);
  2.  
  3. // ...
  4.  
  5. void Insertar(nodo*& lista, int v)
  6. {
  7.   nodo *nuevo = new nodo;
  8.   nuevo->datoNodo.valor = v;
  9.  
  10.   if (!lista || lista->datoNodo.valor > v){
  11.      nuevo->siguiente = lista;
  12.      nuevo->anterior = 0;
  13.      if (lista)
  14.         lista->anterior = nuevo;
  15.      lista = nuevo;
  16.   }else {
  17.      nodo *p = lista;
  18.  
  19.      while (p->siguiente && p->siguiente->datoNodo.valor <= v)
  20.         p = p->siguiente;
  21.  
  22.      nuevo->siguiente = p->siguiente;
  23.      nuevo->anterior = p;
  24.      p->siguiente = nuevo;
  25.      if (nuevo->siguiente)
  26.         nuevo->siguiente->anterior = nuevo;
  27.   }
  28. }

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");
}