Segnalazione errori!

di Anonimizzato12152 il
4 risposte
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

  • 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).
  • Grazie, in effetti era abbastanza ovvio, però, ritornando al problema principale, l'errore dov'è??
  • 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;
    }
    
    
  • 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