Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    [C] insert in lista concatenata

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    typedef struct nodo *lista;
    typedef struct nodo {
            int val;
            nodo* next;
            } Nodo;
            
            
    lista insert(lista *L, int valore){
          Nodo *corrente;
          Nodo *precedente;
          Nodo *nuovo;
          nuovo=malloc(sizeof(Nodo));
          if(nuovo==NULL){
                       printf("mem esaurita");
                       return NULL;}
          nuovo->val=valore;
          nuovo->next=NULL;
          
          corrente = *L;
          precedente = NULL;
          
          while(corrente->next!=NULL && valore<corrente->val){
          precedente=corrente;     
          corrente=corrente->next;
          }
          if(precedente==NULL){
          nuovo=*L;
          nuovo->next==NULL;
          }
          else{
               nuovo->next=corrente;
               precedente->next=nuovo;
               }
               return *L;
          }
          
    int main (){
        lista concat = NULL;
        int val;
        printf("inserisci valore nodo, 0 termina:");      
        while(scanf("%d", &val)!=0){
        insert(&concat, val);
        printf("inserisci valore nodo:");
        }
        system ("PAUSE");
        return 0;
        }
    l'errore è (riga 14, la riga della malloc)
    In function `nodo* insert(nodo**, int)':
    invalid conversion from `void*' to `Nodo*'



    edit: ho provato a fare il cast sulla malloc, quindi nuovo=(Nodo*)malloc(sizeof(Nodo));
    ora nessun errore di sintassi, ma evidentemente c'è qlc errore logico xke il programma crasha

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Prima di tutto, questa

    nuovo->next==NULL;

    e' sbagliata ...

    Comunque, non si capisce il ragionamento che hai fatto nella insert ... cosa dovrebbe fare la insert esattamente per te?

    E infine ... il ciclo della scanf non termina con lo zero (che e' un valore accettato ...)
    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è prima di tutto, direi che è inutile fare 2 typedef:
    codice:
    typedef struct nodo *lista;
    typedef struct nodo {
            int val;
            nodo* next;
            } Nodo;
    perchè poi si rischia di fare un pò di confusione, come hai fatto tu in qualche caso: infatti quando richiami la funzione insert, non c'è bisogno che passi il puntatore alla testa per riferimento:
    codice:
    insert(&concat, val);
    anche perchè poi lo ritorni con a funzione stessa (return L)!
    poi la malloc, è una funzione che ritorna un tipo char*, quindi quando non allochi le stringhe è bene fare un cast, come hai fatto tu.
    per quanto riguarda il crash, bene in genere quando si inserisce in lista, che sia in testa o coda, si fa sempre in 2 modi: si controlla se il puntatore iniziale è NULL, per vedere se è il primo inserimento, e si procede in un modo, e poi gli altri si eseguono in un altro modo! poi infine volevo spiegato l'utilizzo di quel while() nella funzione insert?? che ti devi ciclare?!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  4. #4
    Originariamente inviato da oregon
    Prima di tutto, questa

    nuovo->next==NULL;

    e' sbagliata ...

    Comunque, non si capisce il ragionamento che hai fatto nella insert ... cosa dovrebbe fare la insert esattamente per te?

    E infine ... il ciclo della scanf non termina con lo zero (che e' un valore accettato ...)
    Originariamente inviato da MrX87
    bhè prima di tutto, direi che è inutile fare 2 typedef:
    codice:
    typedef struct nodo *lista;
    typedef struct nodo {
            int val;
            nodo* next;
            } Nodo;
    perchè poi si rischia di fare un pò di confusione, come hai fatto tu in qualche caso: infatti quando richiami la funzione insert, non c'è bisogno che passi il puntatore alla testa per riferimento:
    codice:
    insert(&concat, val);
    anche perchè poi lo ritorni con a funzione stessa (return L)!
    No il procedimento va bene
    Nodo è un nuovo dato di tipo struttura nodo
    e lista invece è un nuovo dato di tipo puntatore a struttura nodo
    Originariamente inviato da MrX87
    poi la malloc, è una funzione che ritorna un tipo char*, quindi quando non allochi le stringhe è bene fare un cast, come hai fatto tu.
    Ma no che dici, la malloc restituisce un puntatore a void*
    Originariamente inviato da MrX87
    per quanto riguarda il crash, bene in genere quando si inserisce in lista, che sia in testa o coda, si fa sempre in 2 modi: si controlla se il puntatore iniziale è NULL, per vedere se è il primo inserimento, e si procede in un modo, e poi gli altri si eseguono in un altro modo! poi infine volevo spiegato l'utilizzo di quel while() nella funzione insert?? che ti devi ciclare?!
    Forse hai letto un pò troppo in fretta il codice.

    @ant_alt
    Avevi solo fatto un pò di confusione con i puntatori.
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct nodo *lista;
    
    typedef struct nodo
    {
    	int val;
    	struct nodo *next;
    } Nodo;
    
    lista insert(lista *L, int valore)
    {
    	Nodo *corrente;
    	Nodo *precedente;
    	Nodo *nuovo;
    
    	nuovo = (Nodo*)malloc(sizeof(Nodo));
    	if(NULL==nuovo)
    	{
    		printf("mem esaurita");
    		return NULL;
    	}
    	nuovo->val  = valore;
    	nuovo->next = NULL;
    
    	corrente   = *L;
    	precedente = NULL;
    
    	while( NULL!=corrente && valore>corrente->val )
    	{
    		precedente = corrente;
    		corrente   = corrente->next;
    	}
    
    	if(NULL==precedente)
    	{
    		nuovo->next = *L;
    		*L = nuovo;
    	}
    	else
    	{
    		nuovo->next      = corrente;
    		precedente->next = nuovo;
    	}
    	return *L;
    }
    
    void visualizza( Nodo *L)
    {
    	while( L )
    	{
    		printf("%d,", L->val);
    		L = L->next;
    	}
    	printf("\n\n");
    }
    
    int main(void)
    {
    	lista concat = NULL;
    	int   val;
    	printf("inserisci valore nodo (0 termina) : ");
    	while(scanf("%d", &val)!=0 && val!=0)
    	{
    		insert( &concat, val);
    		printf("inserisci valore nodo (0 termina) : ");
    	}
    
    	visualizza( concat );
    
    	system("PAUSE");
    	return 0;
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  5. #5
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Ma no che dici, la malloc restituisce un puntatore a void*
    chiedo venia per gli errori...in effetti sono andato a controllare nel sito dell'ANSI C e la malloc restituisce un void*...poi forse si ho letto un pò velocemente...chiedo ancora scusa...però l'unica cosa che non mi convince è perchè alla funzione insert passi il puntatore a L(che è di tipo lista, ovvero già un puntatore alla struttura nodo) e poi lo ritorni anche??
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  6. #6
    Originariamente inviato da MrX87
    chiedo venia per gli errori...in effetti sono andato a controllare nel sito dell'ANSI C e la malloc restituisce un void*...poi forse si ho letto un pò velocemente...chiedo ancora scusa...però l'unica cosa che non mi convince è perchè alla funzione insert passi il puntatore a L(che è di tipo lista, ovvero già un puntatore alla struttura nodo) e poi lo ritorni anche??
    Si in effetti è utile al solo fine di controllare che insert riesca effettivamente ad inserire l'elemento
    restituendo la locazione di memoria della testa della lista, oppure NULL in caso di errore.
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Si in effetti è utile al solo fine di controllare che insert riesca effettivamente ad inserire l'elemento
    restituendo la locazione di memoria della testa della lista, oppure NULL in caso di errore.
    bhè allora scusa non è la stessa cosa se lo passi per valore?? tanto poi lo ritorni sempre, quindi mica perdi la testa della lista?! certo che però devi cambiare il test se l'allocazione del puntatore nuovo va a buon fine, altrimenti torneresti NULL alla testa!
    codice:
    if(nuovo==NULL){
                       printf("mem esaurita");
                       exit(0);
    }
    e fare una chiamata così:
    codice:
    concat = insert ( concat, valore );
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  8. #8
    Si è un modo egualmente valido
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  9. #9
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    okayy...thanks per il chiarimento!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  10. #10
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da Samuele_70
    ...

    grazie

    quindi il problema era solo nel while?
    codice:
    while(corrente->next!=NULL && valore<corrente->val)
    o mi è sfuggito altro?

    altra cosa: nella tua funzione visualizza passi come argomento puntatore a nodo (che secondo la mia typedef sarebbe "lista")
    perchè poi si usa L->val?? cioè a me sembra che tu abbia usato due operatori di risoluzione (prima il puntatore a nodo e poi ->)...perchè mai funziona?

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 © 2025 vBulletin Solutions, Inc. All rights reserved.