Elimina tutte le occorrenze

/*[Elimina2]. Scrivere una funzione che prese in input una lista di
interi ed un intero k, elimini dalla lista tutte le occorenze di k, se `e presente. Se
lista `e la definizione dell’elemento di una lista (con un valore intero ed un puntatore
all’elemento successivo) e listaPtr `e un puntatore a lista, la segnautra della funzione
1
sar`a:
listaPtr eliminaTutti (listaPtr l, int k)
Input: Il metodo main legger`a un primo intero n che rappresenta il numero di
elementi da inserire nella lista, poi legger`a n interi e li inserir`a in TESTA alla lista
e poi legger`a un intero k, che rappresenta il numero da eliminare. Se, ad esempio,
l’input `e: 8 1 2 3 4 5 6 7 8 5, allora avremo una lista formata da n = 8 elementi.
Essi vengono inseriti in TESTA nell’ordine, quindi otterremo una lista contenente:
8− > 7− > 6− > 5− > 5− > 5− > 2− > 1. Da questa lista vogliamo eliminare
tutte le occorrenze del numero 5.
Output: Il metodo main stamper`a la lista senza la prima occorrenza del numero
k, se esiste. Nell’esempio precedente stamper`a: 8 7 2 1. Tutti gli elementi vengono
stampati separati da UN SOLO spazio.*/

#include
#include

struct nodo
{
int elem;
struct nodo * next;
};

typedef struct nodo L_ELEM;
typedef struct nodo * L_PTR;

void stampa_lista(L_PTR p);
L_PTR inserisci_in_testa(L_PTR L, int val);
L_PTR cancella(L_PTR L, int del);

int main()
{
L_PTR startPtr = NULL;
int k=0;
int val=0;
int del=0;
scanf("%d",&k); /*primo numero*/
while(k>0) /* Inserisco in testa */
{
scanf("%d",&val);
startPtr = inserisci_in_testa(startPtr, val);
//printf("%d", &startPtr);
k--;
}
//printf("-%d-", startPtr->elem);
scanf("%d", &del);
startPtr = cancella(startPtr, del);
stampa_lista(startPtr);
system("pause");
return 0;
}

void stampa_lista(L_PTR p) {
while (p != NULL) {
printf("%d ", p->elem);
p = p->next;
}
//printf("NULL\n");
return;
}

/*inserisci un nuovo elemento in testa alla lista*/
L_PTR inserisci_in_testa(L_PTR L1, int val)
{
L_PTR temp_ptr;
temp_ptr=malloc(sizeof(L_ELEM));
temp_ptr->elem=val;
temp_ptr->next=L1;
L1=temp_ptr;

return L1;
}
/*
cancella ogni k
void cancella(L_PTR * L, int val)
{
L_PTR tempPtr;
if (*L==NULL) return;
else if (((*L)->elem)==val)
{
tempPtr=*L;
*L=(*L)->next;
free(tempPtr);
cancella(L,val);
}
else cancella(&((*L)->next),val);
}*/

L_PTR cancella(L_PTR L, int val)
{
if (L==NULL) return NULL;
if (L->elem==val)
{
L=cancella(L->next,val);
return L;
}else
{
L->next=cancella(L->next,val);
return L;
}
}

Commenti