#include "lista.h"

struct lista{
	int no[MAX];
	int Fim;
};

Lista cria_lista()
{
	Lista lst;

	lst = (Lista) malloc(sizeof(struct lista));

	if(lst != NULL)
		lst->Fim = 0;
	return lst;
}

int lista_vazia(Lista lst)
{
	if(lst->Fim == 0)
		return 1;
	else
		return 0;
}

int lista_cheia(Lista lst)
{
	if(lst->Fim == MAX)
		return 1;
	else
		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é achar o elem ou final de lista */
	while(aux < lst->Fim && lst->no[aux] != elem)
		aux++;

	if(aux == lst->Fim) /* Final de lista */
		return 0;

	/* Deslocament a esq. do sucessor até o final da lista */
	for(i = aux+1;i < lst->Fim;i++)
		lst->no[i-1] = lst->no[i];

	lst->Fim--;
	return 1;
}

int remove_todos(Lista lst, int elemento)
{
	if(lst == NULL || lista_vazia(lst))
		return 0;

	int Aux = lst->Fim, i = 0;

	while(i < lst->Fim)
	{
		if(lst->no[i] == elemento)
		{
			if(i == lst->Fim-1)
			{
				lst->Fim--;
				return 1;
			}
			else
			{
				for(int 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;
}

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

