Ya solucione el problema por si a alguien le sirve
Slds,
h**p://www . psicofxp.com/forums/programacion.313/961273-lista-abierta-con-tokens-de-strtok.html
Mi programa abre un archivo de texto, lee linea en linea, separa las palabras por delimitadores y todo perfecto.
ahora bien las quiero almacenar en una lista abierta, pero sucede que guarda correctamente la primer linea, pero a partir de la segunda linea solo guarda porciones de texto y no la palabra completa.
Dato: si le envio manualmente datos a la lista abierta addPalabra(&lista,"palabra1")... addPalabra(&lista,"palabraN") las alamacena y las puedo recorrer perfectamente.
Problema: pero al mandarle las palabras separadas que envia el STRTOK llegan bien a la funcion y luego las almacena correctamente en el nodo nuevo->palabra pero algo mas sucede que es lo que hace que se parta las palabras al almacenarlas en la lista.
Alguien q compile al ojo... y pueda darme una mano... luego de estoy tengo q iomplementar busqueda con Expresiones regulares, pero eso sera otra historia.
Gracias.
:D
Código:
/*======================================================= UMG 090 04 960 sombradeculto Lee Archivo, separa lineas, lee cadenas con STRTOK y almacena en Lista Abierta _________________________________________________________*/ #include <stdio.h> // strcmp #include <string.h> //free #include <malloc.h> //PAUSE #include <stdlib.h> int c,i; char* token; // guarda temporalemte TOKEN obtenido char linea[256]; // Recibe linea a linea del .txt char delim[] = {" \n\t"}; // delimitadores para TOKEN void serializar (void); // Proceso que serializa TOKEN y crea lista de palabras /*======================================================= Estructura para almacenar las palabras para realizar busqueda con expresiones _________________________________________________________*/ typedef struct _nodo{ char *palabra; struct _nodo *siguiente; }tipoNodo; typedef tipoNodo *Lista; typedef tipoNodo *pNodo; void addPalabra(Lista *l, char *palabra); void freeMem(Lista *); void recorrerLista(Lista l); int listaVacia(Lista l); Lista lista = NULL; // Se crea lista NULL //======================================================= int main(void){ freeMem(&lista); serializar(); addPalabra(&lista,"HOLA1"); addPalabra(&lista,"HOLA2"); addPalabra(&lista,"HOLA3"); addPalabra(&lista,"DOLA4"); addPalabra(&lista,"HOLA5"); addPalabra(&lista,"HOLA6"); recorrerLista(lista); freeMem(&lista); recorrerLista(lista); system ("PAUSE"); return 0; } /*======================================================= Abre el archivo lee por lineas separa por palabras y envia a estructura de nodos*/ void serializar (void){ // Abre el .txt relativo en la carpeta FILE *f = fopen("texto.txt","r"); char *temp; if (f==NULL){ perror("Error al abrir el fichero") ; }else{ while ( (fgets(linea,256,f)) != NULL){ printf("%s\n",linea); token = strtok(linea, delim); while (token){ //printf("Token: %s\n",token); addPalabra(&lista, token); //addPalabra(&lista, token = strtok(NULL, delim)); token = strtok(NULL, delim); c++; }; }; fclose(f); } free(token); } /*======================================================= Inserta Nueva palabra a listado de nodos */ void addPalabra(Lista *lista, char *palabra){ pNodo nuevo, anterior; nuevo = (pNodo)malloc(sizeof(tipoNodo)); nuevo->palabra = palabra; //printf("tOkEn: %s\n",nuevo->palabra); if ( nuevo->palabra == '\0' || nuevo->palabra == '\n' || nuevo->palabra == NULL){ printf("Llego un null\n"); }else{ if (listaVacia(*lista)) { nuevo->siguiente = *lista; *lista = nuevo; //printf("tOkEn: %s\n",nuevo->palabra); }else{ anterior = *lista; while (anterior->siguiente) anterior = anterior->siguiente; nuevo->siguiente = anterior->siguiente; anterior->siguiente = nuevo; } } } /*======================================================= Revisa si la lista de palabras esta vacia */ int listaVacia(Lista lista){ return (lista == NULL); } /*======================================================= Recorre la lista */ void recorrerLista(Lista lista){ pNodo nodo = lista; if (listaVacia(lista)) printf("Lista Vacia\n"); else{ //for (i=0; i < c; i++){ while (nodo){ printf("LISTA: %s\n", nodo->palabra); nodo = nodo->siguiente; } } } /*======================================================= Libera la memoria utilizada por la lista */ void freeMem(Lista *lista){ pNodo nodo; while (*lista){ nodo = *lista; *lista = nodo->siguiente; free(nodo); } }