#include "lista_encad_ord.h"

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

Lista cria_lista()
{
	return NULL;
}

int lista_vazia(Lista lst)
{
	if(lst == NULL)
		return 1;
	return 0;		/* lst não vazia  */
}

int insere_ord(Lista *lst, int elem)
{
	/* Aloca um novo nó */
	Lista N = (Lista) malloc(sizeof(struct no));

	if(N == NULL)
		return 0; /* Falha */

	N->info = elem; /* Insere o conteudo (valor do elem) */

	if(lista_vazia(*lst) || elem <= (*lst)->info)
	{
		N->prox = *lst; /* Aponto pro 1º nó atual da lista */
		*lst = N; /* Faz a lista apontar pro novo nó */
		return 1;
	}

	/* Percorrimento da lista(elem > 1º nó da lista) */
	Lista aux = *lst; /* Faz apontar pro 1º nó */
	while(aux->prox != NULL && aux->prox->info < elem)
		aux = aux->prox; /* Avança */

	/* Insere o novo elemento */
	N->prox = aux->prox; /* Se aux é o ultimo, N->prox == NULL */
	aux->prox = N;
	return 1;
}

int remove_ord(Lista *lst, int elem)
{
	if(lista_vazia(*lst) || elem < (*lst)->info)
		return 0; /* Falha */

	Lista aux = *lst; /* Ponteiro auxiliar para o 1º nó */

	/* Remove elem 1º elem nó da lista */
	if(elem == (*lst)->info)
	{
		*lst = aux->prox; /* Lista aponta p/ o 2º nó */
		free(aux); /* Libera memoria alocada */
		return 1;
	}

	/* Percorrimento até final ou achar elem ou nó maior */
	while(aux->prox != NULL && aux->prox->info < elem)
		aux = aux->prox;

	if(aux->prox == NULL || aux->prox->info > elem)
		return 0;

	/* Remove elemento (apos o 1º nó da lista) */
	Lista aux2 = aux->prox; /* Aponta nó a ser removido */
	aux->prox = aux2->prox; /* Retira nó da lista */
	free(aux2);
	return 1;
}

void print_lista(Lista lst)
{
	Lista temp;
	temp = lst;
	printf("Lista = {");
	while(temp != NULL)
	{
		printf("%d ", temp->info);
		temp = temp->prox;
	}
	printf("}\n");
}

