#include <stdio.h>
#include <stdlib.h>

typedef struct lligada {
    int valor;
    struct lligada *prox;
} *LInt;

void addHead (LInt *l, int val){
    LInt newHead = malloc(sizeof(*newHead));
    newHead->valor = val;
    newHead->prox = *l;
    *l = newHead;
}

void print(LInt list){
    LInt curr = list;
    while (curr != NULL){
        printf("%d -> ", curr->valor);
        curr = curr->prox;
    }
    printf("NULL");
}

int removeAll (LInt *l, int x){
    int r = 0;
    LInt pt = *l, ant = NULL;
    while (pt != NULL){
        if (pt -> valor == x){
            if (ant == NULL){
                *l = pt->prox;
            }
            else {
                ant -> prox = pt -> prox;
            }
            LInt toDelete = pt;
            pt = pt -> prox;
            free(toDelete);
            r++;
        }
        else {
            ant = pt;
            pt = pt -> prox;
        }
    }

    return r;
}

int main() {
    LInt list = NULL;
    addHead(&list, 10);
    addHead(&list, 20);
    addHead(&list, 15);
    addHead(&list, 10);
    addHead(&list, 12);
    addHead(&list, 10);
    addHead(&list, 10);
    addHead(&list, 13);
    addHead(&list, 10);

    print(list);
    int removed = removeAll(&list, 10);
    printf("\nRemoved nodes: %d\n", removed);
    print(list);
}
