elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con lista doblemente enlazada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con lista doblemente enlazada  (Leído 9,303 veces)
falconez

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Ayuda con lista doblemente enlazada
« 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");
}



« Última modificación: 12 Diciembre 2013, 01:57 am por falconez » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con lista doblemente enlazada
« Respuesta #1 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


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 Desconectado

Mensajes: 18



Ver Perfil
Re: Ayuda con lista doblemente enlazada
« Respuesta #2 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");
}

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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 Último mensaje 29 Octubre 2010, 01:48 am
por [D4N93R]
ayuda...Lista doblemente enlazada
Java
goll9d 2 3,805 Último mensaje 22 Enero 2012, 04:50 am
por goll9d
ayuda con lista doblemente enlazada
Programación C/C++
gibi77 3 3,919 Último mensaje 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 Último mensaje 16 Junio 2014, 09:21 am
por eferion
Insertar enmedio de una lista doblemente enlazada
Programación C/C++
BrendiisFox 3 3,775 Último mensaje 16 Septiembre 2015, 21:05 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines