#include "lista_ord.h"

/*
* =================================================
*    Filename:  .c
* Description:
*     Created:  dd/mm/18 hh:mm
* =================================================
*/

struct lista
{
	int no[MAX];
	int Fim;
};

Lista *cria_lista()
{
	Lista *lst;
	lst = (Lista*) malloc(sizeof(Lista));
	if(lst != NULL)
		lst->Fim = 0;
	return lst;
}

int free_lista(Lista **lst)
{
	free(*lst);
	*lst = NULL;
}

int lista_cheia(Lista *lst)
{
	if(lst->Fim == MAX)
		return 1;
	return 0;
}

int lista_vazia(Lista *lst)
{
	if(lst == NULL)
		exit(-1);
	return (lst->Fim == 0);
}

int insere_ord(Lista *lst, int elem)
{
	if(lst == NULL || lista_cheia(lst))
		exit(-1);

	/* Trata lista vazia ou elemento >= ultimo da lista  */
	if(lista_vazia(lst) || elem >= lst->no[lst->Fim-1])
		lst->no[lst->Fim] = elem; /* insere no final  */
	else
	{
		int aux = 0;
		while(elem >= lst->no[aux]) /* Percorrimento...  */
			aux++;

		for(int i = lst->Fim; i > aux;i--) /* Deslocamento  */
			lst->no[i] = lst->no[i-1];
		lst->no[aux] = elem; /* Inclui o elemento na lista  */
	}
	lst->Fim++; /* Avanca o Fim  */
	return 1;
}

int remove_ord(Lista *lst, int elem)
{
	if(lst == NULL || lista_vazia(lst) || elem < lst->no[0] ||
			elem > lst->no[lst->Fim-1])
		exit(-1);

	int aux = 0;
	/* Percorre ate achar o elemento ou chegar no fim da lista  */
	while(aux < lst->Fim && lst->no[aux] < elem)
		aux++;

	if(aux == lst->Fim || lst->no[aux] > elem) /* elem nao existe  */
		exit(-1);

	/* Deslocamento a esquerda do sucessor ate o fnal da lista  */
	for(int i = aux+1;i < lst->Fim;i++)
		lst->no[i-1] = lst->no[i];

	lst->Fim--;
	return 0;
}

Lista *intercala_ord(Lista *L1, Lista *L2)
{
	Lista *L3;
	L3 = cria_lista();

	if(L1 == NULL || L2 == NULL || L3 == NULL)
		exit(-1);

	for(int i = 0;i < L1->Fim;i++)
		insere_ord(L3,L1->no[i]);

	for(int i = 0;i < L2->Fim;i++)
		insere_ord(L3,L2->no[i]);

	return L3;

}

void print_lista(Lista* lst)
{
	printf("Lista: {");
	for(int i = 0;i < lst->Fim;i++)
		printf("%d ", lst->no[i]);
	printf("}\n");
	getchar();
}

