Na aula passada passei a solução do problema de criar uma função que
excluísse um elemento da lista duplamente encadeada. Porém, a solução estava incompleta pois os ponteiros first e last da função main não eram atualizados dentro da função exclui. Assim, se vocês rodarem o programa e excluírem o primeiro elemento (aquele que first aponta) quando a função listar a lista vai aparecer um 0 como primeiro elemento. Por quê? Porque a região da memória que first apontava foi liberada (chamada da função free pela função exclui). Apesar de, dentro da função exclui, o parâmetro h (que recebe o valor de first) ser atualizado essa atualização não passa para o ponteiro first. Para entender como o problema foi resolvido leiam o pdf anexo (deve ter uns erros de português já que escrevi rápido e não revisei, as correções serão bem vindas.).
Segue em anexo também, a resolução do problema. Fiz duas funções
exclui uma sem gambiarra mas mais complicada pois foi necessário utilizar o recurso (*h)->next, pois como h é um ponteiro para ponteiro, é necessário primeiro transformá-lo no endereço original (daí o uso de parênteses) para depois acessar um campo da estrutura. A segunda versão, foi criada dois ponteiros auxiliares que recebem o endereço dos parâmetros.