#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_elem(Lista *lst, int elem) {
	Lista N = (Lista) malloc(sizeof(struct no));
	if(N == NULL)
		return 0;
	/* Preenche os campos do novo nó */
	N->info = elem;
	N->prox = *lst; /* Aponta para o primeiro nó da lista */
	*lst = N; /* Faz a lista apontar para o novo nó */
	return 1;
}

int remove_elem(Lista *lst, int elem) {
	if(*lst == NULL || lista_vazia(*lst))
		return 0;
	Lista aux = *lst; /* Ponteiro pro 1º nó */
	if(elem == (*lst)->info) {
		*lst = aux->prox;
		free(aux);
		return 1;
	}
	while(aux->prox != NULL && aux->prox->info != elem)
		aux = aux->prox;
	if(aux->prox == NULL)
		return 0;
	Lista aux2 = aux->prox; /* Aponta o nó a ser removido */
	aux->prox = aux2->prox; /* Retira nó apontado p/ aux2 da lista */
	free(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");
}
int remove_todos(Lista *lst, int elem) {
	if(*lst == NULL || lista_vazia(*lst))
		return 0;
	Lista aux = *lst;
	for(aux = *lst;aux != NULL;aux = aux->prox)
	{
		if(aux->info == elem)
			remove_elem(lst, aux->info);
	}
	return 1;
}

int insere_final(Lista *lst, int elem) {
	Lista N = (Lista) malloc(sizeof(struct no));
	if(N == NULL || *lst == NULL)
		return 0;
	N->info = elem;
	N->prox = NULL;
	if(lista_vazia(*lst))
		(*lst) = N;
	else {
		Lista aux = *lst;
		while(aux->prox != NULL)
			aux = aux->prox;
		aux->prox = N;
	}
	return 1;
}

int remove_pares(Lista *lst) {
	Lista aux = *lst;
	if(*lst == NULL || aux == NULL)
		return 0;
	for(aux = *lst;aux != NULL;aux = aux->prox) {
		if(aux->info % 2 == 0)
			remove_elem(lst, aux->info);
	}
	return 1;
}
int maior_elem_lista(Lista *lst) {
	if(*lst == NULL) {
		printf("Falha ao recuperar o menor elemento da lista\n");
		return 0;
	}
	int maior_elem = -99999999;
	Lista aux = *lst;
	for(aux = *lst;aux != NULL;aux = aux->prox) {
		if(aux->info > maior_elem)
			maior_elem = aux->info;
	}
	printf("Maior elemento da lista: %d\n", maior_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;
}
Lista *concatena_lista(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_elem(L3, aux->info);
	for(aux = *L2;aux != NULL;aux = aux->prox)
		insere_elem(L3, aux->info);
	return L3; }
