#include <stdio.h>
#include <stdlib.h>

struct nodo {
   int n;
   struct nodo *sgte;
};

void print(struct nodo *inicio) {
   struct nodo *p;

   printf("Lista: ");
   p = inicio;
   while (p!=NULL) {
      printf("%d ", (*p).n);
      p = (*p).sgte;
   }
   printf("\n");
}

struct nodo* insertAlInicio(struct nodo *inicio, int valor) {
   struct nodo *nuevo;

   nuevo = malloc(sizeof(struct nodo));
   (*nuevo).n = valor;
   (*nuevo).sgte = inicio;
   return nuevo;
}

struct nodo* insertAlFinal(struct nodo *inicio, int valor) {
   struct nodo *p, *nuevo;

   nuevo = malloc(sizeof(struct nodo));
   nuevo->n = valor;
   nuevo->sgte = NULL;

   if (inicio == NULL) {
      /* La lista esta vacia */
      inicio = nuevo;
   }
   else {
      p = inicio;
      while (p->sgte != NULL)
         p = p->sgte;
      p->sgte = nuevo;
   }

   return inicio;
}

/*
 * Version inicial de la funcion que busca un elemento
 * en la lista.  Falta agregar un if para controlar el
 * caso en que la lista esta vacia
 *
struct nodo *find(struct nodo *inicio, int buscado) {
   struct nodo *aux;

   aux = inicio;
   while (aux->sgte != NULL) {
      if (aux->n == buscado)
         return aux;
      aux = aux->sgte;
   }
   return NULL;
}
*/

struct nodo *find(struct nodo *inicio, int buscado) {
   struct nodo *p;

   p = inicio;
   while (p!=NULL && p->n!=buscado)
      p = p->sgte;
   return p;
}

main() {
	   struct nodo *l, *p;

   l = NULL;

   print(l);

   l = insertAlInicio(l,1);
   l = insertAlInicio(l,4);
   l = insertAlInicio(l,2);
   l = insertAlInicio(l,5);
   l = insertAlFinal(l,8);

   p = find(l,4);
   if (p==NULL)
      printf("4 no esta en la lista\n");
   else
      printf("%d OK\n", p->n);

   p = find(l,20);
   if (p==NULL)
      printf("20 no esta en la lista\n");
   else
      printf("%d OK\n", p->n);

   print(l);
}

