#include <stdio.h>
#include <stdlib.h>

struct No
{
    int dado;
    struct No *prox;
};
typedef struct No No;

struct lista
{
    struct No *inicio;
    struct No *fim;
};
typedef struct lista lista;

//----------- FUNCOES ----------//

lista* cria_lista();
void insere_inicio_lista(lista *li);
void insere_fim_lista(lista *li);
void imprime_lista(lista *li);
void esvazia_lista(lista *li);

//---------- MAIN ----------//

int main()
{
    No *aux;
    No *anterior;
    lista *li = cria_lista();
    imprime_lista(li);
    insere_inicio_lista(li);
    insere_inicio_lista(li);
    insere_inicio_lista(li);
    imprime_lista(li);


    return 0;
}

//----------    FUNCOES     ----------//

lista* cria_lista()
{
    lista* li = (lista*) malloc(sizeof(lista));
    if(li != NULL)
    {
        li->fim = NULL;
        li->inicio = NULL;
    }
    return li;
}

void insere_inicio_lista(lista *li)
{
    No *novo = (No*) malloc(sizeof(No));
    scanf("%d", &novo->dado);
    if(li->inicio == NULL)
    {
        li->inicio = novo;
        novo->prox = NULL;
        li->fim = novo;
    }
    else
    {
        novo->prox = li->inicio;
        li->inicio = novo;
    }
}

void insere_fim_lista(lista *li)
{
    No *novo = (No*)malloc(sizeof(No));
    scanf("%d", &novo->dado);
    if(li->inicio == NULL)
    {
        li->inicio = novo;
        novo->prox = NULL;
        li->fim = novo;
    }
    else
    {
        li->fim->prox = novo;
        li->fim = novo;
        li->fim->prox = NULL;
    }
}

void imprime_lista(lista *li) {
    if(li->inicio == NULL) {
        printf("Lista vazia!!\n");
    }
    else {
        No *aux = li->inicio;

        while(aux != NULL) { //while normal aqui garante que não usa o nó com NULL
            printf(" %d ", aux->dado);
            aux = aux->prox;
        }
    }
}

void esvazia_lista(lista *li)
{
    if(li->inicio == NULL)
    {
        printf("Lista vazia!!\n");
    }
    else
    {
        No *aux = li->inicio;
        while(aux != NULL)
        {
            li->inicio = li->inicio->prox;
            free(aux);
            aux = li->inicio;
        }
        printf("Lista esvaziada!\n");
    }
}
