Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: leosansan en 29 Septiembre 2012, 12:30 PM

Título: LISTA DOBLE
Publicado por: leosansan en 29 Septiembre 2012, 12:30 PM
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!.
Título: Re: LISTA DOBLE
Publicado por: twins en 29 Septiembre 2012, 20:42 PM
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");
}

Título: Re: LISTA DOBLE
Publicado por: twins en 29 Septiembre 2012, 20:44 PM
y a todo esto cual es la etiqueta para que se vea mas resaltado??
Título: Re: LISTA DOBLE
Publicado por: ankora45 en 29 Septiembre 2012, 21:26 PM
las etiquetas geshi de c++ xD
Título: Re: LISTA DOBLE
Publicado por: leosansan en 29 Septiembre 2012, 21:33 PM
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!