LISTA DOBLE

Iniciado por leosansan, 29 Septiembre 2012, 12:30 PM

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

leosansan

Tengo el problema en una lista doblemente enlazada que no me imprime al reves, es decir de abajo a arriba, es más se suele colgar al final. Y no pillo el fallo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct lista_elementos
{
char elem[40];
struct lista_elementos *sig;
struct lista_elementos *ant;
};

typedef struct lista_elementos nodo;

void crear(nodo *registro,nodo *fin,nodo *anterior);
void mostrar_abajo(nodo *pt);
void mostrar_arriba(nodo *pt);

int main()
{
   nodo *prin,*fin;
   prin=(nodo*)malloc(sizeof(nodo));
   fin=(nodo*)malloc(sizeof(nodo));
   crear(prin,fin,NULL);
   puts("\n");
   mostrar_abajo(prin);
   puts("\n");
   mostrar_arriba(fin);
}

void crear(nodo *registro,nodo *fin,nodo *anterior)
{
   printf("Dato (Escribir LEOSANSAN para terminar): ");
   scanf(" %s",registro->elem);

   if (strcmp(registro->elem,"LEOSANSAN")==0)
           {
           registro->sig=NULL;
           registro->ant=anterior;
           fin=registro;
       }
   else
       {
           registro->sig=(nodo*)malloc(sizeof(nodo));
           registro->ant=anterior;
           crear(registro->sig,fin,registro);
       }
}

void mostrar_abajo(nodo *pt)
{
   if (pt->sig!=NULL)
       {
           printf("%s  ",pt->elem);
           mostrar_abajo(pt->sig);
       }
}
void mostrar_arriba(nodo *pt)
{
  if (pt->ant==NULL)
   printf("%s",pt->elem);
   else
       {
           printf("%s  ",pt->elem);
           mostrar_arriba(pt->ant);
       }
}

Gracias desde ahora y saludos!.

twins

Hola a mi parecer el ejercico esta bien pero lo encuentro un poco desordenado yo hize el ejercicio a mi parecer, no se si lo entindas pero aqui esta para que lo veas,saludos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct lista_elementos{
   int elem;
    struct lista_elementos *sig;
    struct lista_elementos *ant;
};
typedef struct lista_elementos nodo;
void crear(nodo **lista);
void mostrar(nodo **lista);
int main(){
    nodo *lista=NULL;
   crear(&lista);
   crear(&lista);
   crear(&lista);
   crear(&lista);
   mostrar(&lista);
return(0);   
}
void crear(nodo **lista){
    printf("Valor para el nodo\n");
   nodo *nuevo=(nodo*)malloc(sizeof(nodo));
    scanf("%i",&nuevo->elem);
   nuevo->sig=NULL;
   nuevo->ant=NULL;
    if(*lista==NULL)
      *lista=nuevo;
    else{
      nodo *aux1=*lista;
      while(aux1->sig!=NULL)
         aux1=aux1->sig;
      aux1->sig=nuevo;
      nuevo->ant=aux1;
      aux1=nuevo;
   }
}
void mostrar(nodo **lista){
   nodo *aux=*lista;
   printf("lista=");
    while(aux!=NULL){
      printf("[%i]->",aux->elem);
      aux=aux->sig;
   }
   printf("NULL");
   aux=*lista;
   while(aux->sig!=NULL)
      aux=aux->sig;
   printf("\n");
   printf("lista=");
   while(aux!=NULL){
      printf("[%i]->",aux->elem);
      aux=aux->ant;
   }   
   printf("NULL");
}


twins

y a todo esto cual es la etiqueta para que se vea mas resaltado??

ankora45

las etiquetas geshi de c++ xD
Hay dos cosas infinitas en este mundo, el universo y la estupidez humana, y de la primera no estoy muy seguro

leosansan

CitarCuando escribes el post en la parte superior aparece "GeSHi", picas y seleccionas C o C++ o lo que creas y automáticamente aparecen las etiquetas "[ code=c][ /code]" , sin los espacios en blanco que he puesto o algo parecido y ya en medio le insertas el código.
Gracias por el código. ¡Otro ejemplo para extrujar!