PDA

Visualizza la versione completa : C - errore iniziale in liste vuote


gabama
24-02-2009, 23:11
Se inserisco entrambe le liste vuote, mi da ,in linux questo messaggio "Floating point exception",come posso risolvere


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

typedef struct nod {
int data;
struct nod *next;
struct nod *prev;
} node;

node *newnode(void)
{
return (node *)malloc(sizeof(node));
}


node *buildlis()
{
int x;
node *lis, *p, *last;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
if (x<=0)
lis= NULL; /* caso di lista vuota */
else
{
/* inserzione del primo elemento in una lista */
last=newnode();
lis = last;
last->data = x;
last->next = NULL;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
while (x>0)
/* Invariante: lis punta alla lista con tutti gli interi finora letti, tranne l'ultimo, e last punta all'ultimo nodo di tale lista */
{
p=newnode();
p->data = x;
p->next = NULL;
last->next = p;
last = p;
printf("nuovo numero da inserire in lista:\n");
scanf("%d", &x);
}
}
return(lis);
}
/* Stampa degli elementi di una lista */

/* Stampa degli elementi di una lista */
void printlis(node *lis)
{
node* tmp;

tmp = lis;
int somma=0;float media=0;int conteggio=0;

while (tmp != NULL) {
printf(">>>> %d\n", tmp->data) && (somma=somma+tmp->data) && (conteggio=conteggio+1) ;
tmp = tmp->next;

}
printf("Somma %d\n",somma);

printf("Conteggio %d \n",conteggio);
media=(somma/conteggio);
printf("Media %f",media);
}


void myFree ( node* top )
{
node* tmp;
tmp = top;

while ( top->next != NULL ) {
tmp = top->next;
free(top);
top = tmp;
}
}

node *multipli(node *l1,node *l2)
{
node *p,*head,*tail;
head=NULL;
if((l1==NULL) && (l2==NULL)) {return head;}}




int main()
{
node* head;node* head2;node *dispari;
int n;int m=6;
printf ("\n-----LISTA A-----\n");
head = buildlis ( );
printf ("\n-----LISTA B-----\n");
head2 = buildlis ( );
printf ("\n-----STAMPA LISTA A-----\n");
printlis(head);
printf ("\n-----STAMPA LISTA B-----\n");
printlis(head2);
printf ("\n-----STAMPA LISTA A MODIFICATA-----\n");
printlis(head);



myFree ( head );

return 0;
}

oregon
24-02-2009, 23:48
Probabilmente perche' in questa linea

media=(somma/conteggio);

la variabile conteggio e' uguale a zero e non puoi dividere per zero.

MrX87
25-02-2009, 00:03
bhà...veramente a me sembrava che il problema fosse anche nella funzione myFree..perchè viene passato il puntatore head e poi nel while si fa direttamente top->next e essendo top NULL, top->next non è definito! o sbaglio?

oregon
25-02-2009, 08:55
Anche ... ma prima hai l'errore della divisione per zero, anche perche' lui parla di "Floating point exception".

Sistemato quello, dovra' fare i conti con gli altri errori ...

gabama
25-02-2009, 14:30
grazie come al solito ragazzi per la vostra solita disponibilità e pazienza,
per mettere "insieme" i vostri consigli,ho già eliminato conteggio e poi devo allora "lavorare" nella in myfree,per top->next?
Ovviamente questo è solo nel caso le liste siano entrambe vuote perchè negli altri casi funziona.Però è anche vero che il caso che entrambe le liste siano vuote è una possibilità.....e quindi va adeguatamente aggiustata.....
grazie ancora ragazzi

gabama
25-02-2009, 21:03
dopo alcuni tentativi andati male,ho risolto ,anche se non è il termine più adatto usando la funzione free già compresa nella libreria.....

MrX87
26-02-2009, 14:31
bhè per quanto riguarda la myFree che avevi implementato tu, basta fare un controllo che il puntatore alla testa passato non sia NULL...altrimenti fai un return...più o meno in questo modo direi:


void myFree ( node* top )
{
node* tmp;
tmp = top;

if ( top == NULL ) return;

while ( top->next != NULL ) {
tmp = top->next;
free(top);
top = tmp;
}
}

gabama
26-02-2009, 23:53
mrx ti ringrazio molto per l' implementazione del codice,ma a questo punto uso la free del "programma",così evito inutili problemi.
Grazie mille a te e Oregon per i consigli
Ciao

Loading