Ciao !Ho appena iniziato le liste quindi ho un pò di difficoltà a capire..
In un esercizio da svolgere devo una volta inseriti gli elementi ( terminanti con 0) cancellare i numeri pari.
Ma qualcosa non va..
/*Gestione di una lista */
/*Inserisce dalla testa ed estrae dalla testa*/
/*Lista ordinata con cancellazione di pari */
#include <stdio.h>
#include<stdlib.h>
/*variabili esterne*/
struct node{ /*come è fatto il nodo*/
int value;
struct node * next;
};
struct node *first=NULL;/*first punta al primo elemento*/
/*dichiarazione funzioni*/
void read_numbers(void);
void delede_from_list(struct node *list,int n);
void visualizza_lista(struct node *q);
int main(void)
{
int n;
read_numbers();
printf("Inserisci valore :");
scanf("%d",&n);
delede_from_list(&first,n);/*cancella tutti gli elementi che non sono divisori di n*/
visualizza_lista(first);
return 0;
}
void read_numbers(void)
{
printf("Inserisci interi.Termina con 0");
for(;;)
{
struct node *cur ,*prev, *new_node;
new_node=malloc(sizeof(struct node));/* crea nuovo nodo*/
if(new_node==NULL)
{
printf("Database is full;can't add more parts\n");
return;
}
printf("\nInserisci:");
scanf("%d",&new_node->value);
if(new_node->value ==0)
{
free(new_node);
return ;
}
for(cur=first,prev=NULL;
cur!=NULL && new_node->value > cur->value;
prev=cur,cur=cur->next)
; /*si ferma quando new_node è inferiore di cur->value*/
if(cur!=NULL && new_node->value == cur->value)
{
printf("Elemento esiste gia'\n");
free(new_node);
return;
}
new_node->next=cur;/*new_node punta al nodo cur == passa avanti di cur*/
if (prev==NULL)
first=new_node;/*first punta al nodo new_node*/
else
prev->next=new_node;/*prev punta al nodo new_node*/
}
}
void delede_from_list(struct node *list,int n)
{
struct node *cur=list;
struct node *prev=NULL;
while(cur!=NULL)
{
if(n%(cur->value)!=0)
{
if (cur ==NULL)
break;
if (prev ==NULL)
list=list->next;
else
prev->next=cur->next;
free(cur); /*libero nodo*/
}
prev=cur;
cur=cur->next;
}
}
void visualizza_lista(struct node *q)
{
if(q!=NULL)
{
printf("%d\n",q->value);
visualizza_lista(q->next);
}
}