#include <stdlib.h>

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

typedef struct cel *apont; 

struct cel { int chave; apont prox; };

/* Implementação para LL não-circulares sem cabeça de lista */

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

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

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

main() {
  int n, i; apont ini = NULL, t;

  printf("Digite n: ");
  scanf("%d", &n);
  printf("Digite uma sequencia de %d numeros inteiros: ", n); 
  for (i=0; i<n; i++) {
    t = malloc(sizeof(struct cel)); 
    scanf("%d", &(t->chave));
    t->prox = ini;    /* os últimos serão os primeiros */
    ini = t;
  }
  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);
}
