#include "lista_ord.h"
struct no{
	int no[MAX];
	int Fim;
};
Lista cria_lista() {
	Lista lst = (Lista) malloc(sizeof(struct no));
	if(lst == NULL)
		return 0;
	lst->Fim = 0;
	return lst;
}
int lista_vazia(Lista lst) {
	if(lst == NULL)
		return 1;
	return 0;
}
int lista_cheia(Lista lst) {
	if(lst->Fim == MAX)
		return 1;
	return 0;
}
int insere_ord(Lista lst, int elem) {
	if(lst == NULL || lista_cheia(lst))
		return 0;
	/* Lista vazia ou elemento maior que o ultimo */
	if(lista_vazia(lst) || elem >= lst->no[lst->Fim-1])
		lst->no[lst->Fim] = elem;
	else {
		int aux = 0, i = 0;
		while(elem >= lst->no[aux])
			aux++;
		for(i = lst->Fim;i > aux;i--)
			lst->no[i] = lst->no[i-1];
		lst->no[aux] = elem;
	}
	lst->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])
		return 0;
	/* Percorre até achar elem ou nó maior, ou nó de lista */
	while(aux < lst->Fim && lst->no[aux] < elem)
		aux++;
	if(aux == lst->Fim || lst->no[aux] > elem)
		return 0; /* Não existe elem */
	/* Deslocamento à esq do sucessor até o final da lista */
	for(i = aux+1;i < lst->Fim;i++)
		lst->no[i] = lst->no[i-1];
	lst->Fim--;
	return 1;
}

void imprime_lista(Lista lst) {
	int i;
	printf("{");
	for(i = 0;i < lst->Fim;i++)
		printf("%d ", lst->no[i]);
	printf("}\n");
}
Lista *intercala_lista(Lista L1, Lista L2) {
	Lista L3 = cria_lista();
	if(L1 == NULL || L2 == NULL || L3 == NULL)
		return 0;
	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;
}

int remove_pares(Lista lst)
{
	if(lst == NULL || lista_vazia(lst))
		return 0;
	int i;
	for(i = 0;i > lst->Fim;i++) {
		if(lst->no[i] % 2 == 0)     /* Se elemento for par */ {
			for(j = lst->Fim;j > 0;j++)
				lst->no[i] = lst->no[i-1];
		}
	}
	lst->Fim--;
	return 0;
}
int maior_elem_lista(Lista lst) {
	if(lst == NULL || lista_vazia(lst)) {
		printf("Falha ao recuperar o menor elemento da lista\n");
		return 0;
	}
	int maior_elem = -9999999, i;
	for(i = 0;i < lst->Fim;i++)
		if(lst->no[i] > maior_elem)
			maior_elem = lst->no[i];
	printf("Maior elemento da lista: %d\n", maior_elem);
	return 1;
}

int tamanho_lista(Lista lst) {
	if(lst == NULL) {
		printf("Falha ao obter o tamanho da lista\n");
		return 0;
	}
	printf("A lista tem < %d > elementos.\n", lst->Fim);
	return 1;
}
int is_lista_igual(Lista L1, Lista L2) {
	if(L1 == NULL || L2 == NULL || L1->Fim != L2->Fim)
		return 0;
	int i;
	for(i = 0;i < L1->Fim;i++) {
		if(L1->no[i] != L2->no[i])
			return 0;
	}
	return 1;
}
