Ayuda con lista doblemente enlazada

Iniciado por falconez, 12 Diciembre 2013, 01:41 AM

0 Miembros y 1 Visitante están viendo este tema.

falconez

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


rir3760

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 (cpp) [Seleccionar]
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
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

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