... /* neste ponto o polinômio referenciado por v ainda não foi liberado */ aux = v; /* salva numa variável auxiliar o polinomio referenciado por v */ v = multiplica(v, v); /* atualiza v com o resultado da operação (soma, produto, tanto faz...) */ libera(aux); /* libera o polinômio anteriormente referenciado por v */Quanto ao que você disse sobre "ser mais eficiente", não é só uma questão de eficiência... Está errado usar o p depois do libera(p)!
Você parece estar supondo que a chamada libera(p) atribui NULL a p, mas para fazer isso ela precisaria receber um ponteiro para o ponteiro p... Sem receber um ponteiro para ponteiro, a função libera pode até mexer na sua cópia do ponteiro p, mas isso não terá nenhum efeito sobre o ponteiro original!