#include "lista_n_ord.h"
struct lista {
	int no[MAX];
	int Fim;
};
Lista cria_lista(){
	Lista lst = (Lista) malloc(sizeof(struct lista));
	if(lst != NULL)
		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_elem(Lista lst, int elem){
	if(lst == NULL || lista_cheia(lst))
		return 0;
	lst->no[lst->Fim] = elem;
	lst->Fim++;
	return 1;
}

int remove_elem(Lista lst, int elem){
	if(lst == NULL || lista_vazia(lst))
		return 0;
	int i, aux = 0;
	/* Percorrimento até final de lista ou achar elem */
	while(aux < lst->Fim && lst->no[aux] != elem)
		aux++;
	/* Verifica se é final da lista */
	if(aux == lst->Fim)
		return 0;
	for(i = aux+1;i < lst->Fim;i++)
		lst->no[i-1] = lst->no[i];
	lst->Fim--;
	return 1;
}

void imprime_lista(Lista lst){
	int aux;
	printf("{");
	for(aux = 0;aux < lst->Fim;aux++)
		printf("%d ", lst->no[aux]);
	printf("}\n");
}

int remove_todos(Lista lst, int elem){
	if(lst == NULL || lista_vazia(lst))
		return 0;
	int i = 0, j, aux = lst->Fim;
	while(i < lst->Fim){
		if(lst->no[i] == elem) {
			if(i == lst->Fim-1) {
				lst->Fim--;
				return 1;
			}
			else {
				for(j = i;j < lst->Fim-1;j++)
					lst->no[j] = lst->no[j+1];
				lst->Fim--;
			}
		}
		else
			i++;
	}
	if(lst->Fim < aux)
		return 1;
	return 0;
}

int insere_inicio(Lista lst, int elem) {
	if(lst == NULL || lista_cheia(lst))
		return 0;
	if(lista_vazia(lst))
		lst->no[lst->Fim] = elem;
	int i, aux = 0;
	for(i = lst->Fim;i > 0;i--)
		lst->no[i] = lst->no[i-1];
	lst->no[0] = elem;
	lst->Fim++;
	return 1;
}

int remover_impares(Lista lst) {
	if(lst == NULL || lista_vazia(lst))
		return 0;

	int i = 0, j, aux = lst->Fim;
	while(i < lst->Fim) {
		if(lst->no[i] % 2 != 0) {
			if(i == lst->Fim-1) {
				lst->Fim--;
				return 1;
			}
			else {
				for(j = i;j < lst->Fim-1;j++)
					lst->no[j] = lst->no[j+1];
				lst->Fim--;
			}
		}
		else
			i++;
	}
	if(lst->Fim < aux)
		return 1;
	return 0;
}

int menor_elem(Lista lst) {
	if(lst == NULL || lista_vazia(lst)) {
		printf("Falha ao recuperar o menor elemento da lista\n");
		return 0;
	}
	int menor_elem = 9999999, counter = 0;;
	/* Percorre a lista */
	for(counter = 0; counter < lst->Fim; counter++)
		if(lst->no[counter] < menor_elem)
			menor_elem = lst->no[counter];
	printf("Menor elemento da lista: %d\n", menor_elem);
	return 1;
}

int tamanho_lista(Lista lst) {
	if(lst == NULL) {
		printf("Falha ao obter o tamanho da lista\n");
		return 0;
	}
	printf("Tamanho da lista: %d\n", lst->Fim);
	return 1;
}

Lista concatenar_lista(Lista L1, Lista L2) {
	Lista L3 = cria_lista();
	if(L1 == NULL || L2 == NULL || L3 == NULL)
		return 0;
	int count = 0;
	for(count = 0;count < L1->Fim;count++)
		insere_elem(L3, L1->no[count]);
	for(count = 0;count < L2->Fim;count++)
		insere_elem(L3, L2->no[count]);
	return L3;
}

