Segnalazione errori!

di il
4 risposte

Segnalazione errori!

Salve a tutti e grazie per il vostro tempo.
Ho iniziato a studiare le liste e devo fare un programma che crea una lista di n nodi e poi una funzione che trovi un nodo particolare immesso dall'utente.
Posto il codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct node {

	int val;
	struct node *next;	// puntatore al prossimo nodo

} node;

/*
 * head e' l'inizio della lista.
 * E' una variabile globale (si evita il passaggio del puntatore ad ogni funzione
 * che la richiede).
 */
node *head = NULL;

/*
 * crea un nuovo nodo, inserendo il valore (int value) nel membro val.
 * Ritorna un puntatore di tipo "node" se la creazione
 * del nodo sull'heap e' riuscita, altrimenti NULL
 */
node *makenode(int value) {

	node *new = malloc(sizeof(node));
	
	// controlla se l'allocazione e' riuscita ed inizializza i membri
	if ( new != NULL ) {
		new->val = value;
		new->next = NULL;
		return new;
	}

	return NULL;
}


/*
 * inserisce un nodo in CODA alla lista
 */
void enqueue(node *n) {

	node *tail = head;
	
	// primo nodo
	if ( head == NULL ) {
		head = n;
		return;
	}

	// scorre la lista fino alla fine
	while ( tail->next != NULL )	
		tail = tail->next;
	
	// aggancia il nodo in coda
	tail->next = n;
}

/*
 * cancella tutti i nodi della lista
*/

node *findnode(int value){
     
     node *tail = head;
     
     while( tail->next != NULL )
            if(value == tail->val)
            return tail;
            else
            tail = tail->next;

     return NULL;
}

void rmlist(void) {
//????Gia perfezionata
	while ( head != NULL ) {
		node *t = head->next;
		free(head);
		head = t;
	}
}

/*
 * stampa il contenuto della lista (membro val di ogni nodo)
*/
void dumplist(void) {
	
	node *t = head;

	while ( t != NULL ) {
		printf("Val = %d\n", t->val);
		t = t->next;
	}
}

// main
int main() {

	int i = 0;
	int y;
	clock_t t;
	
	printf("Numbers of node: ");
	scanf("%d", &y);

    t = clock();

	// inserisce dei nodi
	while ( i < y ) {
		node *n = makenode(i);
		if ( n != NULL )
			enqueue(n);
		i++;
	}

    t = clock() - t;
  
	// stampa tutta la lista
	//dumplist();

	// cancella la lista
	rmlist();
	
	printf ("It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);

    node *a;

    printf("\nNodo da cercare: ");
    scanf("%d", &y);
    
    a = findnode(y);
    
    if( a != NULL)
    printf("Nodo trovato: %d", a->val);
    else
    printf("Nodo non trovato");
    
    system("pause");

	return 0;
}
Il problema è che dopo aver inserito il valore del nodo da cercare e premuto invio mi parte la segnalazione errori.
Come mai?? Non capisco perché queste cose non si presentino in fase di compilazione...
Evidentemente l'errore dev'essere nella funzione findnode, ma a me sembra proprio tutto a posto. HELP!
P.s
Lasciate stare l'evidente complessità della funzione enqueue, l'importante è che funzioni.

4 Risposte

  • Re: Segnalazione errori!

    Perché ti meravigli? Gli errori di compilazione sono quelli relativi alla "sintassi" del linguaggio, legati alle "regole" di scrittura che il compilatore può subito evidenziare.

    Ad esempio se scrivi

    A ° B

    il compilatore ti dice subito che ° non è un carattere accettabile per il tuo programma e te lo dice subito.

    Ma se scrivi

    A / B

    formalmente è tutto corretto (è una divisione) ma se, al momento dell'esecuzione (a runtime) il valore di B è zero, allora avrai un errore (che il compilatore non poteva rilevare).
  • Re: Segnalazione errori!

    Grazie, in effetti era abbastanza ovvio, però, ritornando al problema principale, l'errore dov'è??
  • Re: Segnalazione errori!

    L'errore piu grosso è nella funzione find hai dimenticato le graffe nel while,e sempre il while non ricerca bene la lista.
    Prima poi di controllare la velocità del codice pensa a scriverlo meglio.L'ottimizzazione può avvenire anche in un secondo momento,ovvero quando si avrà la conoscienza del linguaggio.
    Dimenticavo se prima cancelli la lista e poi ricerchi un nodo con una funzione buggata allora si che avrai i problemi!
    Ultima cosa,scaricati code::blocks e disinstalla immediatamente dev-c++

    Ti posto un pò di codice a mio avviso piu pulito e comprensivo di programmazione difensiva.
    
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    typedef struct _NODE
    {
       int val;
       struct _NODE *next;   // puntatore al prossimo nodo
    }NODE;
    
    /*
    * head e' l'inizio della lista.
    * E' una variabile globale (si evita il passaggio del puntatore ad ogni funzione
    * che la richiede).
    */
    NODE *head = NULL;
    
    /*
    * crea un nuovo nodo, inserendo il valore (int value) nel membro val.
    * Ritorna un puntatore di tipo "node" se la creazione
    * del nodo sull'heap e' riuscita, altrimenti NULL
    */
    NODE *makenode(int value)
    {
        NODE *n = malloc(sizeof(NODE));
            if (n == NULL) return NULL;
    
       n->val = value;
       n->next = NULL;
       return n;
    }
    
    
    /*
    * inserisce un nodo in CODA alla lista
    */
    void enqueue(NODE *n)
    {
        if (n == NULL) return;
        if (head == NULL)
        {
            head=n;
            return;
        }
    
        // scorre la lista fino alla fine
        NODE *tail;
        for (tail = head; tail->next != NULL; tail = tail->next);
    
        // aggancia il nodo in coda
        tail->next = n;
    }
    
    /*
    * cancella tutti i nodi della lista
    */
    
    NODE *findnode(int value)
    {
        NODE *tail;
        for (tail = head; tail != NULL; tail = tail->next)
            if (value == tail->val) return tail;
    
        return NULL;
    }
    
    void rmlist(void)
    {
        while ( head != NULL )
        {
            NODE *t = head->next;
            free(head);
            head = t;
        }
    }
    
    /*
    * stampa il contenuto della lista (membro val di ogni nodo)
    */
    void dumplist(void)
    {
        NODE *t;
        for (t = head; t != NULL; t = t->next)
            printf("Val = %d\n", t->val);
    }
    
    // main
    int main()
    {
        int countnode;
    
        printf("Numbers of node: ");
        scanf("%d", &countnode);
    
        // inserisce dei nodi
        int i;
        for (i=0; i < countnode; i++)
            enqueue(makenode(i));
    
    
        // stampa tutta la lista
        dumplist();
    
    
        int id;
        printf("\nNodo da cercare: ");
        scanf("%d", &id);
    
        NODE *f = findnode(id);
    
        if( f != NULL)
            printf("Nodo trovato: %d", f->val);
        else
            printf("Nodo non trovato");
    
    
        // cancella la lista
        rmlist();
    
    
       return 0;
    }
    
    
  • Re: Segnalazione errori!

    vbextreme ha scritto:


    L'errore piu grosso è nella funzione find hai dimenticato le graffe nel while,e sempre il while non ricerca bene la lista.
    Prima poi di controllare la velocità del codice pensa a scriverlo meglio.L'ottimizzazione può avvenire anche in un secondo momento,ovvero quando si avrà la conoscienza del linguaggio.
    Dimenticavo se prima cancelli la lista e poi ricerchi un nodo con una funzione buggata allora si che avrai i problemi!
    Ops! La solita distrazione, comunque se scrivo l'istruzione sotto il while me la prende senza bisogno delle graffe.
Devi accedere o registrarti per scrivere nel forum
4 risposte