/****************************************************************************
PROGRAMA:	lista
AUTOR:		Kiko
FECHA:		12.07.94
FINALIDAD:	Crea una lista enlazada con todas las palabras que se
						encuentran en un fichero de texto.
COMENTARIOS:	Considera palabras cualquier secuencia de caracteres que no
							contenga espacios en blanco, tabuladores o fines de linea (\n).
							La lista contiene las palabras en el mismo orden en que aparecen
							en el texto.
							Como salida, el programa genera, recorriendo la lista, todas las
							palabras del fichero de entrada.
HISTORIA:
BIBLIOGRAFIA:
MODO DE UTILIZACION:	Una vez compilado, ejecutar:
				lista fichero
			donde fichero es el nombre del fichero de texto con
			cuyas palabras se crear  la lista enlazada.
****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define MAXSTR  255
#define CR 	'\n'
#define SPACE 	' '
#define TAB	'\t'

typedef struct nodo {
	char *palabra;
	struct nodo *sig;
} lista;
/*--------------------------------------------------------------------------*/
lista *crear_lista(char *nombre_fichero) {
	FILE *f;
	char ch;
	char palabra[MAXSTR];
	int numchar;						/* N£mero de caracteres de la palabra */
	lista *nodo, *anterior, *primero;

	if ((f = fopen(nombre_fichero, "r")) == NULL) {
		printf("Error tratando de abrir el fichero %s\n", nombre_fichero);
		exit(0);
	}

	anterior = NULL;
	primero = NULL;

	while ((ch = (char)getc(f)) != EOF) {
		numchar = 0;
		while (ch != SPACE && ch != CR && ch != TAB && ch != EOF) {
			palabra[numchar++] = ch;
			ch = (char)getc(f);
		}
		palabra[numchar] = '\0';
		printf("%s\n", palabra);

		if (numchar != 0) {
			nodo = (lista *)malloc(sizeof(lista));
			nodo->palabra = (char *)malloc(strlen(palabra) + 1);
			strcpy(nodo->palabra, palabra);
			nodo->sig = NULL;
			if (primero == NULL)
				primero = nodo;
			else
				anterior->sig = nodo;
			anterior = nodo;
		}

	}
	return(primero);
}
/*--------------------------------------------------------------------------*/
void recorrer_lista(lista *L) {
	while (L != NULL) {
		printf("%s\n", L->palabra);
		L = L->sig;
	}
	return;
}
/*--------------------------------------------------------------------------*/
void main(int argc, char *argv[]) {
	lista *L;

	clrscr();
	if (argc != 2) {
		printf("Modo de uso: lista nombre_de_fichero_de_texto\n");
		exit(0);
	}
	L = crear_lista(argv[1]);
	recorrer_lista(L);
	exit(0);
}
/*--------------------------------------------------------------------------*/

