#include "lista_encad.h"
struct no{
	int info;
	struct no *prox;
};
Lista cria_lista() {
	return NULL;
}
int lista_vazia(Lista lst) {
	if(lst == NULL)
		return 1;
	return 0;
}
int insere_ord(Lista *lst) {
	Lista N = (Lista) malloc(sizeof(struct no));
	if(N == NULL)
		return 0;
	N->info = elem;
	if(*lst == NULL || elem <= (*lst)->info) {
		N->prox = *lst;
		*lst = N;
		return 1; }
	Lista aux = *lst;
	while(aux->prox != NULL && aux->prox->info <= elem)
		aux = aux->prox;
	N->prox = aux->prox;
	aux->prox = N;
	return 1;
}

int remove_ord(Lista *lst, int elem) {
	if(elem < (*lst)->info || *lst == NULL)
		return 0;
	Lista aux = *lst;
	if(elem == (*lst)->info) {
		*lst = aux->prox;
		free(aux);
		return 1;
	}
	Lista aux = *lst;
	while(aux->prox != NULL && aux->prox->info < elem)
		aux = aux->prox;
	if(aux->prox == NULL || aux->prox->info > elem)
		return 0;
	Lista aux2 = aux->prox; /* Aponta nó a ser removido */
	aux->prox = aux2->prox; /* Retira nó da lista */
	freeu(aux2);
	return 1;
}

void imprime_lista(Lista lst) {
	Lista aux = lst;
	printf("{");
	for(aux = lst;aux != NULL;aux = aux->prox)
		printf("%d ", aux->info);
	printf("}\n");
}
Lista intercala(Lista *L1, Lista *L2) {
	Lista L3 = (Lista) malloc(sizeof(struct no));
	if(*L1 == NULL || *L2 == NULL || L3 == NULL)
		return 0;
	Lista aux, aux2;
	for(aux = *L1;aux != NULL;aux = aux->prox)
		insere_ord(L3, aux->info);
	for(aux2 = *L2;aux2 != NULL;aux2 = aux2->prox)
		insere_ord(L3, aux2->info);
	return L3;
}

int remove_impares(Lista *lst) {
	if(*lst == NULL || lista_vazia(*lst))
		return 0;
	Lista aux = *lst;
	for(aux = *lst;aux != NULL;aux = aux->prox) {
		if(aux->info % 2 != 0)
			remove_elem(lst, aux->info);
	}
	return 1;
}
int menor_elem_lista(Lista *lst) {
	if(*lst == NULL) {
		printf("Falha ao recuperar o menor elemento da lista\n");
		return 0;
	}
	int menor_elem = 99999999;
	Lista aux = *lst;
	for(aux = *lst;aux != NULL;aux = aux->prox) {
		if(aux->info < menor_elem)
			menor_elem = aux->info;
	}
	printf("Menor elemento da lista: %d\n", menor_elem);
	return 1;
}
int tamanho_lista(Lista *lst) {
	if(*lst == NULL) {
		printf("Falha ao recuperar o tamanho da lista\n");
		return 0;
	}
	Lista aux;
	int tamanho = 0;
	for(aux = *lst;aux != NULL;aux = aux->prox)
		tamanho++;
	printf("A lista tem < %d > elementos\n", tamanho);
	return 1;
}
int is_lista_igual(Lista *L1, Lista *L2) {
	if(L1 == NULL || L2 == NULL || L3 == NULL)
		return 0;
	Lista aux = *L1;
	Lista aux2 = *L2;
	while(aux != NULL && aux2 != NULL) {
		if(aux->info != aux2->info)
			return 0;
		aux = aux->prox;
		aux2 = aux2->prox;
	}
	return 1;
}
