problema con una lista

Iniciado por m@o_614, 1 Mayo 2014, 21:35 PM

0 Miembros y 2 Visitantes están viendo este tema.

m@o_614

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).

void crearArchivoTABSIM(char *etiqueta)
{
   FILE *tb;
   ETIQ *p = NULL;
   if((strcmp(etiqueta,"null")) != 0)
   {
       crearListaEtiquetas(&p,etiqueta);
       imprimirEtiquetas(p);
       if((tb = fopen("TABSIM.txt","a+")) != NULL)
       {
           fwrite(etiqueta,strlen(etiqueta),1,tb);
           fwrite("\n",1,1,tb);
       }
   }
}


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


void crearListaEtiquetas(ETIQ **p,char *etiqueta)
{
   ETIQ *nuevo;
   nuevo = crearEtiqueta(etiqueta);
   nuevo->sig = *p;
   *p = nuevo;
}

ETIQ *crearEtiqueta(char *etiqueta)
{
   ETIQ *x;
   int lon;
   lon = strlen(etiqueta);
   x = malloc(sizeof(ETIQ));
   x->Etiqueta = malloc((lon+1)*sizeof(char));
   strcpy(x->Etiqueta,etiqueta);
   return x;
}

void imprimirEtiquetas(ETIQ *p)
{
   ETIQ *ptr;
   for(ptr = p;ptr!=NULL;ptr = ptr->sig)
      printf("[%s]\n",ptr->Etiqueta);
}
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

rir3760

Cita de: m@o_614 en  1 Mayo 2014, 21:35 PMTengo 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:
fprintf(tb, "%s\n", etiqueta);
* No liberas la memoria reservada para la lista.

Cita de: m@o_614 en  1 Mayo 2014, 21:35 PMSi 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
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