Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760

    C - errore iniziale in liste vuote

    Se inserisco entrambe le liste vuote, mi da ,in linux questo messaggio "Floating point exception",come posso risolvere

    codice:
    #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;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Probabilmente perche' in questa linea

    media=(somma/conteggio);

    la variabile conteggio e' uguale a zero e non puoi dividere per zero.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    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?
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    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

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    dopo alcuni tentativi andati male,ho risolto ,anche se non è il termine più adatto usando la funzione free già compresa nella libreria.....

  7. #7
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    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:
    codice:
    void myFree ( node* top )
    {
        node* tmp;
        tmp = top;
        
        if ( top == NULL ) return;
        
        while ( top->next != NULL ) {
              tmp = top->next;
              free(top);
              top = tmp;
        }
    }
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    760
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.