Listas encadeadas - inserção

Considere uma lista encadeada com nó cabeça le definida por células

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

Sua tarefa nesse exercício é implementar a operação de inserção na lista encadeada encabeçada por le. Para tanto, você deve submeter um arquivo contendo apenas:

  1. Os #include necessários para execução das instruções utilizadas no seu código.

  2. A definição da struct celula.

  3. Uma função que insere um elemento xx no início da lista encadeada, cujo protótipo deve ser:
void insere_inicio (celula *le, int x);
  1. Uma função que insere um elemento xx imediatamente antes da primeira ocorrência de um elemento yy na lista encadeada. Se yy não estiver na lista encadeada, xx deve ser inserido ao final. O protótipo dessa função deve ser
void insere_antes (celula *le, int x, int y);