Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156

    [C] cancellazione nodo lista

    Salve a tutti. Non riesco a cancellare un nodo di una lista, in particolare ricevo come errore " segmentation fault". Il main e la struttura sono i seguenti :
    codice:
      
    int main()
    {
    	t_info inf;
    	t_list lista=NULL;
    	int scelta=1;
    	while(scelta!=0)
    	{
    		inf=read_info();
    		lista=node_insert(lista,inf);
    		printf("Vuoi inserire un'altro nominativo? 1/0 \n");
    		scanf("%d",&scelta);		
    	}
    	print_list(lista);
    	printf("Quale nominativo vuoi cancellare?\n");
    	inf=read_info();
    	lista=node_delete(lista,inf);
    	print_list(lista);
    	return EXIT_SUCCESS;
    }
    codice:
      
    struct s_info
    {
    	char nome[15];
    	char cognome[15];
    	int eta;
    };

    e prima della "node_delete" non ci sono errori perchè va tutto bene. La funzione e' :
    codice:
       
    t_list node_delete(t_list lista,t_info inf)
    {
    	t_node* prec=NULL;
    	t_node* curr=lista;
    	while((curr!=NULL) && greater(inf,curr->info))
    	{
    		prec=curr;
    		curr=curr->link;
    	}
    	if(prec!=NULL && equal(inf,curr->info))
    	{
    	    if(prec==NULL)
    		{
    			lista=curr->link;
    		}
    		else
    		{
    			prec->link=curr->link;
    		}
    		free(curr);
    		return lista;
    	}
    	return lista;
    	
    }
    "greater" funziona sicuramente bene perchè l'ho già usato per creare la lista ordinata, mentre equal è questa
    codice:
       
    bool equal(t_info info1,t_info info2)
    {
    	if( ((strcmp(info1.nome,info2.nome))==0)  && ((strcmp(info1.cognome,info2.cognome))==0) && (info1.eta==info2.eta))
    	return true;
    	else
    	return false;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho provato tutto il codice ma in questa linea

    while((curr!=NULL) && greater(inf,curr->info))

    quando curr è uguale a NULL, curr->info ti darà un errore ... no ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da oregon
    Non ho provato tutto il codice ma in questa linea

    while((curr!=NULL) && greater(inf,curr->info))

    quando curr è uguale a NULL, curr->info ti darà un errore ... no ?
    Se il compilatore è furbo e trova che curr è uguale a NULL salta direttamente alla prossima istruzione fuori dall' if, non è quello il problema.
    Il problema credo sia molto prima:

    codice:
    int main()
    {
    	t_info inf;
    	t_list lista=NULL;  //  lista è uguale a NULL
    	int scelta=1;
    	while(scelta!=0)
    	{
    		inf=read_info();
    		lista=node_insert(lista,inf);  // cosa fa la node_insert?
    		printf("Vuoi inserire un'altro nominativo? 1/0 \n");
    		scanf("%d",&scelta);		
    	}
    	print_list(lista);
    	printf("Quale nominativo vuoi cancellare?\n");
    	inf=read_info();
    	lista=node_delete(lista,inf);
    	print_list(lista);
    	return EXIT_SUCCESS;
    }
    La node_insert prevede il caso in cui il primo parametro passato sia NULL?

  4. #4
    codice:
    if(prec!=NULL && equal(inf,curr->info))
    	{
    	    if(prec==NULL)
    		{
    			lista=curr->link;
    		}
    		else
    		{
    			prec->link=curr->link;
    		}
    		free(curr);
    		return lista;
    	}
    Il secondo if non si verificherà mai perché se prec è null non entra nemmeno nel blocco, sicuro dell'algoritmo?
    ...

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Se il compilatore è furbo
    Il secondo if non si verificherà mai perché
    Calma ... non tutti i compilatori adottano le ottimizzazioni del caso ...

    Ad esempio mingw (con l'IDE DevC++ per intenderci) dà problemi ... quindi occhio.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Mingw non è il compilatore ma è utilizzato da più compilatori e comunque c non è un linguaggio lazy quindi, seppur possa risultare corretta con le ottimizzazioni del caso, quella tecnica è scorretta e da non addottare.

    Apparte che non ha senso.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Originariamente inviato da Scara95
    Mingw non è il compilatore
    MinGW è il porting in ambiente Windows di GCC.
    Evitiamo di fare i precisini ...

    addottare.
    adottare

    Apparte
    A parte
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Hai ragione, addottare era un'errore di battitura, per apparte mi scuso, mimetica del parlato.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Short circuit evaluation

    Qui dice che il C fa la valutazione a corto circuito, ed è coerente con tutti i compilatori che ho provato.
    Altra cosa è non usare un costrutto perché ci sono un sacco di compilatori che si basano su dialetti C non ISO che non implementano parte del linguaggio.
    ...

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    156
    Originariamente inviato da Caiodark
    Il secondo if non si verificherà mai perché se prec è null non entra nemmeno nel blocco, sicuro dell'algoritmo?
    Avevo fatto confusione con le variabili, al posto di prec ci va curr. Ho sostituito e adesso non mi da più il segementation fault ma nella seconda stampa la lista apparare così come l'ho letta, ovvero non mi cancella l'elemento che ho richiesto di cancellare!

    @oregon per quanto riguarda il problema della doppia condizione nell'if, io sapevo che se la prima non era verificata saltava direttamente oltre; comunque ho provato anche a dividere gli if e non cambia nulla, quindi penso che il mio compilatore si comporti in modo " furbo " ( per la cronaca, uso geany ).

    edit:
    @ who am I
    codice:
      
    t_list node_insert(t_list lista,t_info inf)
    {
    	t_node *succ=lista;
    	t_node *prec=NULL;
    	t_node *new_node;
    	while(succ!=NULL && greater(inf,succ->info))
    	{
    		prec=succ;
    		succ=succ->link;
    	}
    	new_node=node_create(inf);
    	if(new_node==NULL)
    	{
    		printf("Errore nell'allocazione della memoria\n");
    		exit(1);
    	}
    	else
    	{
    		if(prec==NULL)
    		{
    			new_node->link=lista;
    			return new_node;
    		}
    		else
    		{
    			new_node->link=succ;
    			prec->link=new_node;
    			return lista;
    		}
    	}
    }

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.