#include "lista_encad_cab_ord.h"
struct no {
	int info;
	struct no * prox;
};
Lista cria_lista() {
	Lista cab = (Lista) malloc(sizeof(struct no));
	if(cab == NULL)
		return 0;
	cab->prox = NULL;
	cab->info = 0;
	return cab;
}
int lista_vazia(Lista *lst) {
	if((*lst)->prox == NULL)
		return 1;
	return 0;
}
int insere_ord(Lista *lst, int elem) {
	Lista N = (Lista) malloc(sizeof(struct no));
	if(N == NULL)
		return 0;
	N->info = elem;
	Lista aux = *lst; /* aux aponta para cabeçalho */
	while(aux->prox != NULL && aux->prox->info < elem)
		aux = aux->prox;
	N->prox = aux->prox; /* Insere novo nó na lista */
	aux->prox = N;
	(*lst)->info++;
	return 1;
}
int remove_ord(Lista *lst, int elem) {
	if(lista_vazia(lst))
		return 0;
	Lista aux = *lst; /* Lista auxiliar */
	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 */
	free(aux);
	(*lst)->info--;
	return 1;
}
void imprime_lista(Lista lst) {
	Lista aux;
	printf("{");
	for(aux = lst;aux->prox != NULL;aux = aux->prox)
		printf("%d ", aux->prox->info);
	printf("}\n");
}
int tamanho_lista(Lista *lst) {
	if(*lst == NULL)
		return 0;
	int tamanho = 0;
	Lista aux;
	for(aux = *lst;aux->prox != NULL;aux = aux->prox)
		tamanho++;
	printf("A lista tem < %d > elementos.\n", tamanho);
	return 1;
}
int remove_impares(Lista *lst) {
	if(*lst == NULL)
		return 0;
	Lista aux = (*lst)->prox;
	while(aux != NULL) {
		if(aux->info % 2 != 0)
			remove_ord(lst, aux->info);
		aux = aux->prox;
	}
	return 1;
}
int menor_elem_lista(Lista *lst) {
	if(*lst == NULL)
		return 0;
	int menor_elem = 9999999;
	Lista aux;
	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 is_lista_igual(Lista *L1, Lista *L2) {
	if(L1 == NULL || L2 == NULL)
		return 1;
	if(tamanho_lista(L1) != tamanho_lista(L2))
		return 0;
	Lista aux = *L1;
	Lista aux2 = *L2;
	while(aux != NULL && aux2 != NULL) {
		if(aux->info != aux2->info)
			return 0;
		aux = aux->prox;
		aux2 = aux->prox;
	}
	return 1;
}
int 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;
}
