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

struct no{
    elem_t *info;
    struct no *prox;
};

typedef struct no no_t;

struct lista_enc{
    no_t * prim;
};

lista_enc_t * lstenc_criar(){
    lista_enc_t * l = (lista_enc_t*)malloc(sizeof(lista_enc_t));
    l->prim = NULL;
    return l;
};

void lstenc_inserir(lista_enc_t *l, elem_t * info){
    no_t * no = (no_t*)malloc(sizeof(no_t));
    no->info = info;
    no->prox = l->prim;
    l->prim = no;
};

void lstenc_buscar(lista_enc_t *l, int id, no_t **ant, no_t **no){
    *ant = NULL;
    *no =l->prim;

    while(*no!=NULL && elem_get_id((*no)->info)!=id){
        *ant = *no;
        *no = (*no)->prox;
    }

}

void lstenc_inserir_em_ordem(lista_enc_t *l, elem_t * info){
    no_t *ant,*no;

    lstenc_buscar(l,elem_get_id(info),&ant,&no);

    if (!no){
        no_t *no = (no_t*)malloc(sizeof(no));
        no->info = info;

        if (ant){
            no->prox = ant->prox;
            ant->prox = no;
        }
        else{
            no->prox = l->prim;
            l->prim = no;
        }
    }
};


elem_t * lstenc_remover(lista_enc_t *l, int id){
    elem_t * e = NULL;
    no_t *ant,*no;

    lstenc_buscar(l,id,&ant,&no);
    if (no){
        e = no->info;
        if (ant){
            ant->prox = no->prox;
        }
        else{
            l->prim = no->prox;

        }
        free(no);
    }

    return e;
};

elem_t * lstenc_remover_primeiro(lista_enc_t *l){
    if (!l->prim) return NULL;

    no_t * no = l->prim;
    elem_t *e = no->info;
    l->prim = l->prim->prox;
    free(no);

    return e;

};

void lstenc_destruir(lista_enc_t *l){
    for (no_t * no = l->prim, *aux; no!=NULL; aux = no, no=no->prox, free(aux));
};

void lstenc_imprimir(lista_enc_t *l){
    printf("l:[");
    for (no_t * no = l->prim; no!=NULL;no=no->prox){
        printf("%d ",elem_get_id(no->info));
    }
    printf("]\n");
};
