/* Escriba un programa C que reciba un número entero positivo n y un conjunto
de palabras (como argumentos al main) y retorne cuántas y cuáles son las
palabras que contienen más de n caracteres */

#include <stdio.h>
#include <math.h>
#include <malloc.h>

struct infopalabras {
				char *pal;
				struct infopalabras* sig;
};


void imprimirpalabras(struct infopalabras * p);

struct infopalabras *primerelem,*aux;

int main(int argc, char * argv[])
{
	primerelem=NULL; /* Creamos la lista */

	if(argc<3) {
		printf("No se han ingresado palabras");
		return 0;
	}
	else {
		int cantletras=0;
		cantletras=straint(argv[1]);
		
		if( cantletras > 0 ) { /*controlamos el nro de letras*/
			
			
			int i;
			int cant=0; /* contador de palabras */

			for(i=2;i<argc;i++)	{ /* recorremos el vector de parametros */
				
				/* la palabra tiene mas letras de las indicadas?*/
				if (longitud(argv[i])>cantletras) {
					cant++;
					/* Creamos un nodo para guardar la palabra */
					aux=(struct infopalabras *)malloc(sizeof(struct infopalabras));
					aux->pal=argv[i];
					aux->sig=NULL;
					
					if (primerelem==NULL) primerelem=aux;
					else {
						struct infopalabras *p;
						p=primerelem;
						while (p->sig!=NULL) p=p->sig;
						p->sig=aux;
					}
				}

			}


			if (!cant) 
				printf("No hay palabras con mas de %d \n",cantletras);
			else {
				if(cant==1) 
					printf("Hay una palabra con mas de %d letras: \n",cantletras);
				else 
					printf("Hay %d palabras con mas de %d letras: \n",cant,cantletras); 
				imprimirpalabras(primerelem);
			}				
			
		}
		else {
		  printf("Cantidad de letras invalida");	
		  return 0;
		}
	}

		
	
}

int straint(char * cad) /*Convierte la cadena apuntada por cad a un int*/
{
	
	if(*cad) {

		char *aux=cad;
		int entero=0;
		
		int i,j;
		for(i=0;*aux;i++,aux++); /* obtengo la longitud de la cadena */
		aux--; /* apunto al ultimo digito */
			
		for(j=0;j<i;j++){ /* suma los valores de cada digito */
			
			switch(*aux) {
			case '0':
					break;
			case '1':
					entero+=(1*pow(10,j));
					break;
			case '2':
					entero+=(2*pow(10,j));
					break;
			case '3':
					entero+=(3*pow(10,j));
					break;
			case '4':
					entero+=(4*pow(10,j));
					break;
			case '5':
					entero+=(5*pow(10,j));
					break;
			case '6':
					entero+=(6*pow(10,j));
					break;
			case '7':
					entero+=(7*pow(10,j));
					break;
			case '8':
					entero+=(8*pow(10,j));
					break;
			case '9':
					entero+=(9*pow(10,j));
					break;
			default : 
					return 0;
			}
			aux--;
			
		}
		return entero;
		
	}
	else return 0;

}		

int longitud(char *cad) /*Decuelve la longitud de una cadena*/
{
	int i;
	char* aux;
	aux=cad;
	for(i=0;*aux;i++,aux++);
	return i;
}


/* recorre la lista de palabras y las imprime */
void imprimirpalabras(struct infopalabras * p)
{
	struct infopalabras * l;
	l=p;
	while (l!=NULL) {
		printf("%s \n",l->pal);
		l=l->sig;
	}
}
