Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 1 Mayo 2014, 21:35 pm



Título: problema con una lista
Publicado por: m@o_614 en 1 Mayo 2014, 21:35 pm
Saludos

Tengo la siguiente función que se llama crearArchivoTABSIM() la cual se encuentra dentro de un ciclo en el main, y cada vez que entra al ciclo se le asigna a la funcion una cadena que se llama etiqueta(char *etiqueta).

Código
  1. void crearArchivoTABSIM(char *etiqueta)
  2. {
  3.    FILE *tb;
  4.    ETIQ *p = NULL;
  5.    if((strcmp(etiqueta,"null")) != 0)
  6.    {
  7.        crearListaEtiquetas(&p,etiqueta);
  8.        imprimirEtiquetas(p);
  9.        if((tb = fopen("TABSIM.txt","a+")) != NULL)
  10.        {
  11.            fwrite(etiqueta,strlen(etiqueta),1,tb);
  12.            fwrite("\n",1,1,tb);
  13.        }
  14.    }
  15. }

y dentro de la función crearArchivoTABSIM() se encuentra la función crearListaEtiquetas() que me va a crear una lista simplemente ligada que tiene un campo char *etiqueta,y que cada vez que le envie una etiqueta me la va a insertar al principio, y después de esta esta la función imprimirEtiquetas() que me va a ir imprimiendo las etiquetas


Código
  1. void crearListaEtiquetas(ETIQ **p,char *etiqueta)
  2. {
  3.    ETIQ *nuevo;
  4.    nuevo = crearEtiqueta(etiqueta);
  5.    nuevo->sig = *p;
  6.    *p = nuevo;
  7. }
  8.  
  9. ETIQ *crearEtiqueta(char *etiqueta)
  10. {
  11.    ETIQ *x;
  12.    int lon;
  13.    lon = strlen(etiqueta);
  14.    x = malloc(sizeof(ETIQ));
  15.    x->Etiqueta = malloc((lon+1)*sizeof(char));
  16.    strcpy(x->Etiqueta,etiqueta);
  17.    return x;
  18. }
  19.  
  20. void imprimirEtiquetas(ETIQ *p)
  21. {
  22.    ETIQ *ptr;
  23.    for(ptr = p;ptr!=NULL;ptr = ptr->sig)
  24.       printf("[%s]\n",ptr->Etiqueta);
  25. }
  26.  
como  por ejemplo:

Si le mando las etiquetas ET1, ET2,ET3,ET4

deberia imprimir

1) ET1
2)ET1    ET2
3)ET1   ET2    ET3
4)ET1   ET2    ET3     ET4

pero el problema que tengo es que solo me esta imprimiendo el primer nodo, o sea a donde apunte la cabeza de lista y no se que estoy haciendo mal, previamente ya habia hecho listas ligadas y no me habian dado ningun problema

de antemano gracias


Título: Re: problema con una lista
Publicado por: rir3760 en 2 Mayo 2014, 06:11 am
Tengo la siguiente función que se llama crearArchivoTABSIM() la cual se encuentra dentro de un ciclo en el main, y cada vez que entra al ciclo se le asigna a la funcion una cadena que se llama etiqueta(char *etiqueta).
Problemas con la función "crearArchivoTABSIM" hay varios:
* No cierras el archivo.
* Solo abres el archivo para agregar una linea de texto al final de el, en ese caso ábrelo en el modo "a" y ya que se trata de modo texto se pueden sustituir las dos llamadas a fwrite por una sola a fprintf:
Código
  1. fprintf(tb, "%s\n", etiqueta);
* No liberas la memoria reservada para la lista.

Si le mando las etiquetas ET1, ET2,ET3,ET4

deberia imprimir

1) ET1
2)ET1    ET2
3)ET1   ET2    ET3
4)ET1   ET2    ET3     ET4

pero el problema que tengo es que solo me esta imprimiendo el primer nodo
Completamente normal ya que:
1) La función "crearListaEtiquetas" tiene un nombre errado: no crea etiquetas, crea solo una.
2) Las variables declaradas en una función se destruyen al terminar esta, para preservar sus valores estos se deben comunicar a la función llamante (main en tu caso en relación a "crearArchivoTABSIM") mediante parámetros de salida o su valor de retorno, como no utilizas ninguno el resultado es: cuando termina la función "crearArchivoTABSIM" la lista (con un solo nodo) se pierde.

Un saludo