#include "lista_encad_circ.h"

struct no
{
	int info;
	struct no * prox;
};

int lista_vazia(Lista lst)
{
	if(lst == NULL)
		return 1;
	else
		return 0;
}

int insere_final(Lista *lst, int elem)
{
	/* Aloca um novo nó e preenche campo info */
	Lista N = (Lista) malloc(sizeof(struct no));
	if(N == NULL) return 0;
	N->info = elem;

	/* Trata lista vazia */
	if(lista_vazia(*lst))
	{
		N->prox = N; /* Faz o novo nó apontar para ele mesmo */
		*lst = N; /* Faz a lista apontar para o novo nó (ultimo nó) */
	}

	/* Trata lista com elementos (1 ou +) */
	else
	{
		N->prox = (*lst)->prox; /* Faz o novo nó apontar o 1º nó */
		(*lst)->prox = N; /* Faz o último nó apontar para o novo nó */
		*lst = N; /* Faz a lista apontar para o novo nó (ultimo nó) */
	}
	return 1;
}

int remove_inicio(Lista *lst, int *elem)
{
	if(lista_vazia(*lst))
		return 0;
	Lista aux = (*lst)->prox; /* Faz apontar pro primeiro nó */
	*elem = aux->info; /* Retorna valor do nó a ser removido */

	if(*lst == (*lst)->prox)
		*lst = NULL; /* Trata lista com 1 unico nó */
	else /* lista com 1+ elementos */
		(*lst)->prox = aux->prox;
	free(aux);
	return 1;
}

void imprime_lista(Lista *lst)
{
	Lista aux = (*lst)->prox;
	printf("{ ");
	while((*lst)->prox != NULL)
	{
		printf("%d ", aux->prox);
		aux->prox = (*lst)->prox;
	}
	printf("}");
}
