#include <stdio.h>
#include <stdlib.h>
#include "listaCirc.h"

struct   listaCirc  {
  int info ; /* info pode ser de qualquer tipo */
  struct listaCirc *prox; /* campo que armazena endereço do próximo elemento */
} ;

ListaCirc* lst_cria(){
    return   NULL ;
}

ListaCirc* lst_insere(ListaCirc* lis,int i){
  ListaCirc* novo = (ListaCirc*) malloc(sizeof(ListaCirc));
  novo->info  =  i ;
  if (!lst_vazia(lis)){
        novo->prox  = lis->prox ;
        lis->prox = novo;
  } else {
        novo->prox = novo;
  }
  return   novo  ;
}
int  lst_vazia(ListaCirc* lis){
  if (lis == NULL)
  	return 1;
  else
	return 0;
}
ListaCirc* lst_retira(ListaCirc* lis,int v){
    ListaCirc* ant; /* guarda elementoanterior */
    ListaCirc* p = lis;/* ponteiro p/ percorrer a lista */
    if (lst_vazia(lis))
        return lis;

    do {
      ant  =  p ;
      p  =  p->prox ;
    } while(p != lis && p->info != v);
/* verifica se achou o elemento */
  if (p == lis && ant->info != v) {

        return lis;

  }
     ant->prox = p->prox;
  free(p) ;
  return ant ;
}

void    lst_libera(ListaCirc* lis){
  ListaCirc* p  =  lis ;
  ListaCirc* t;
  do {
     t = p->prox;
     free(p); /* libera a memória apontada por “p”*/
     p = t;   /* faz  “p” apontar para o próximo */
  } while(p != lis);

}
ListaCirc*  lst_busca(ListaCirc* lis,int v){
  ListaCirc   *p ;
  for (p = lis; p != NULL; p = p->prox)  {
  	if (p->info == v)
         return p ;
  }
  return NULL;     /* não achou o elemento */
}

void  lst_imprime(ListaCirc* lis){
  ListaCirc* p = lis; /*variável auxiliar para percorrer a lista */
  int contador = 1;
  if (!lst_vazia(lis)) {

    do {
        printf("|Endereco do no %d:%u|\n",contador,p);
        printf("---------------------------------\n");
        printf ( "|info = %d| prox = %u|\n ",  p->info,p->prox) ;
        printf("---------------------------------\n\n\n");
        contador++;
        p = p->prox;
    } while (p != lis);

  }
}
