Duvida em lista encadeada em c

Boa noite, galera. Gostaria de uma ajudinha em completar a funcao abaixo. Só consegui remover os “anos” que repetem da lista, o resto estou quebrando a cabeça. Quem puder ajudar, ficarei muito grato.

separa_ano – a função recebe a lista encadeada (ou seja, o endereço do
primeiro nó da lista) e um ano, e MODIFICANDO a lista original, retorna uma
(sub)lista encadeada somente com os livros daquele ano. Não devem ser criados
novos nós. O trecho correspondente aos livros desse ano deve ser “cortado” da
lista original. A lista original deve ser “emendada”, e o endereço do primeiro nó do
trecho (sublista) arrancado deve ser retornado ( sendo necessário colocar NULL no
campo prox do último nó dessa (sub)lista ). A sua função deve levar em conta a
ordenação da lista original. A função retorna o endereço do primeiro nó da (sub)
lista resultante. Para facilitar, considere que o ano solicitado nunca é o do
primeiro livro ou do último livro. Se não existir nenhum livro para o ano recebido,
a função retorna NULL.

typedef struct noDaLista NoDaLista;
struct noDaLista
{
 char titulo[51];
 char autor[51];
 int ano;
 int quantidade;
 NoDaLista *prox;
};

NoDaLista* separa_ano( NoDaLista *lista, int ano) {
  NoDaLista *p, *a;
  p = lista;
  a = NULL;
  NoDaLista *novo = (NoDaLista *)malloc(sizeof(NoDaLista));
  while(p != NULL)
  {
    if(p->ano == ano)
    {
      a->prox = p->prox;
      free(p);
      p = a;
    }
    a = p;
    p = p->prox;
  }
  return lista;
}