Ciao di nuovo, vi aggiorno. Sono riuscito a fare la mia funzione di tipo void per aggiungere i nodi di una lista. Ora l'esercizio chiede di cancellare tutte le occorrenze di una chiave data.
Il problema è che mi da segmentation fault. Ho provato a fare qualche prova printeffando qua e la ma nn ne arrivo a capo.. Vi lascio il codice sperando che qualcuno trovi l'inghippo (il codice e pieno di commenti, nella speranza di semplificarvi la vita ). Un grazie in anticipo.
//cancella tutte le occorrenze della chiave data da una lista
#include <stdio.h>
#include <stdlib.h>
struct Nodo{
int data;
struct Nodo *next, *prev;
};
typedef struct Nodo nodo;
void CancellaTutto();
void CancellaPrimo(nodo**);
void CancellaUltimo();
void Insert(nodo** ptr, int data);
void Print(nodo*);
int main(){
nodo* head = NULL;
Insert(&head,1);
Insert(&head,2);
Insert(&head,3);
Insert(&head,5);
Print(head);
CancellaTutto(&head,5);
Print(head);
return 0;
}
void CancellaTutto(nodo** head, int data){
nodo *p = *head; //p punta all'indirizzo di head
nodo *t;
nodo* c = *head;
/*if(*head == NULL);{
printf("La lista e vuota");
exit(0);}*/
while(c->data == data){ //finche il primo della lista e uguale a data cancellalo e fai puntare head al nodo successivo
CancellaPrimo(head);
c = *head;} //C Punta solo al primo della lista nn lo incremento
p = c->next; //c e la testa senza la chiave....continuo la ricerca dal successivo
while(p ->next != NULL){ //(se arriva qui vuol dire che il primo della lista non contiene la chiave). Finche
//il successivo a p nn e nullo
if(p->data == data){ //se p contiene data cancellalo e collega il precedente al successivo
t = p->next;
p->prev->next = t;
t->prev = p->prev;
free(p);
p = t;} //ora p punta a t (quello che ho impostato successore del vecchio p)
else
p = p->next;} /* //se p nn contiene data p punta al successivo
if(p->next == NULL && p->data == data){ //se l ultimo nodo contiene data
t = p->prev;
printf("%d",t->data);
free(p); //t punta al precedente di p. Cancello p e faccio puntare a t NULL
t->next = NULL;}*/
}
void CancellaPrimo(nodo** head){
nodo* p = *head; //p e un puntatore di tipo nodo che memorizza l indirizzo del puntatore head
//(p ora contiene l indirizzo di head)
nodo* n = *head; //n ora contiene l idirizzo di head
n = n->next; //n ora punta all indirizzo del nodo successivo a head
/*free(p->data);*/ //perche mi da errore?
free(p);
*head = n; //ora head punta al successivo
}
void Insert(nodo** ptr, int data){
nodo* temp = (nodo*)malloc(sizeof(nodo));
temp->data = data;
temp->next = NULL;
if(*ptr==NULL){
*ptr = temp;}
else{
nodo* temp1 = *ptr;
while(temp1->next != NULL)
temp1= temp1->next;
temp1->next = temp;}
}
void Print(nodo* head){
nodo* temp = head;
while(temp != NULL){
printf("%d ",temp->data);
temp = temp->next;}
printf("\n");
}