#include <stdlib.h>

/* Lista ligada com cabeça de lista */

typedef struct cel *apont; 

struct cel { int chave; apont prox; };

void imprime (apont ini) {
  for (ini = ini->prox; ini != NULL; ini = ini->prox) printf("%d\n", ini->chave);
}

int conta (apont ini) {
  int c = 0;
  for (ini = ini->prox; ini != NULL; c++, ini = ini->prox); 
  return c;
}

void remove (apont ini, int x) {
  apont ant = ini;
  for (ini = ini->prox; ini != NULL; ini = ant->prox) {
    if (ini->chave == x) {
      ant->prox = ini->prox; 
      free(ini);
    }
    else ant = ant->prox;
  }
}

main() {
  int n, i; apont ini = malloc(sizeof(struct cel)), t = ini;

  printf("Digite n: ");
  scanf("%d", &n);
  printf("Digite uma sequencia de %d numeros inteiros: ", n); 
  for (i=0; i<n; i++) {
    t->prox = malloc(sizeof(struct cel)); 
    t = t->prox;
    scanf("%d", &(t->chave));
  }
  t->prox = NULL;
  imprime(ini);
  printf("A lista conta com %d elementos.\n", conta(ini));
  printf("Digite o numero a ser removido: ");
  scanf("%d", &i);
  remove(ini, i);
  imprime(ini);
}
