Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 28
  1. #11
    dici una cosa del genere????

    Codice PHP:
    struct nodo *creaelemento(int val)
    {
       
    struct nodo *temp;
       
    temp=(struct nodo*)malloc(sizeof(struct nodo));
       if(
    temp)
       {
          
    temp->data=val;
          
    temp->next=NULL;
       }
       else
          
    printf("Impossibile allocare");

       return (
    temp);

    e nel main....
    Codice PHP:
    printf("Valore da inserire: ");
    scanf("%d", &val);
    while(
    val){
       
    creaelemento(val);
       
    scanf("%d", &val);

    scusa ma il return di creaelemento a cosa viene associato???

  2. #12
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    allora, io ti ho semplicemente postato il ciclo while... chiaro che devi mettere tutto quello che ci mettevi senza, quindi anche l'assegnazione del valore ritornato dalla funzione e via dicendo.

    Altrimenti come ho detto prima fai una cosa di questo genere:

    codice:
    void creaelemento(struct nodo** ptr, int val)
    {
       struct nodo *temp;
       temp=(struct nodo*)malloc(sizeof(struct nodo));
       if(temp)
       {
          temp->data=val;
          temp->next=NULL;
          *ptr=temp;
       }
       else
          printf("Impossibile allocare");
    }
    
    printf("Valore da inserire: ");
    scanf("%d", &val);
    while(val){
       creaelemento(&lista, val);
       scanf("%d", &val);
    }
    semplicemente passi l'indirizzo del puntatore (un puntatore a puntatore) e con un solo deriferimento ne cambi l'indirizzo di memoria contenuto.
    chiaro che come prima, ho buttato giù il tutto in pochi istanti senza provarlo. E' per farti capire come fare, non garantisco che copiandolo incollandolo funzioni perfettamente.

  3. #13
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Riparto dall'ultima tua risposta al mio post ...

    ho ancora un dubbio, ma come faccio per creare nuovi elementi????????
    E io non riesco a capire cosa intendi con questa domanda.

    Un nuovo elemento lo crei con la funzione

    creaelemento

    che, fra l'altro, hai scritto tu ...

    cioè io per creare un nuovo nodo della lista devo creare un nuovo puntatore a cui andrò ad assegnarci tramite la funzione creaelemento() una nuova area di memoria, ma se non conosco quanti elementi devo creare come faccio poi a crearne di nuovi? non so se riesco ad essere chiaro . . .
    No ... non sei affatto chiaro ...

    Non sai quanti elementi devi creare ... e allora? Quando lo devi creare, chiami la funzione ... altrimenti non la chiami ...

    Ma qual e' il problema?

    in questo esempio per creare il nodo e' stato creato un nuovo puntatore alla struttura

    struct nodo *nuovo;

    a cui poi tramite la funzione creaelemento() gli e' stata assegnata la nuova area di memoria. . .
    Ok

    ma se dovessi crearne un altro?
    come faccio in runtime a definire un nuovo puntatore alla struttura?
    Non devi fare nulla a runtime ... il puntatore da usare e' lo stesso ...

    Mettiamo che devo costruire un programma che chiede a terminale dei valori e gli inserisce uno per uno nella lista fin quando l'utente non digitata lo zero (banale se fosse un vettore).
    Io nn conosco quanti elementi l'utente tenterà di inserire!
    Come posso gestire questo caso?
    Per capirci ... ecco un esempio completo ... dimmi cosa non comprendi ...

    codice:
    #include <stdio.h>
    #include <string.h>
    
    struct nodo
    { 
       char data[50]; 
       struct nodo *next; 
    }; 
    
    struct nodo *lista=NULL; 
    
    void aggiungiElemento(char *val) 
    { 
       struct nodo *temp; 
       temp=(struct nodo*)malloc(sizeof(struct nodo)); 
       if(temp) 
       { 
          strcpy(temp->data, val); 
          temp->next=lista;
    	  lista=temp;
       } 
       else 
          printf("Memoria non disponibile - Elemento non aggiunto\n"); 
    }
    
    void main(void)
    {
    	char val[50];
    
    	while(1)
    	{
    		printf("Dato da inserire: "); 
    
    		fgets(val, 50, stdin);
    		val[strlen(val)-1]=0;
    
    		if(strlen(val))
    			aggiungiElemento(val); 
    		else
    			break;
    	}
    
    	printf("\nElenco:\n");
    	struct nodo *t = lista;
    	while(t)
    	{
    		printf("%s\n", t->data);
    		t=t->next;
    	}
    }

  4. #14
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Lak3d
    allora, ...
    Scusa Lak3d,

    ma nel tuo codice, quando viene presa in considerazione la lista gia' esistente?

    Se assegni alla testa della lista il puntatore al nuovo elemento

    *ptr=temp;

    tutta lista viene persa perche' non esiste piu' un riferimento agli altri elementi ....

    E poi tieni presente che il payload e' una stringa e non un intero ...

  5. #15
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    hai ragione... allora basta scorrerla, inserire l'elemento nuovo in ultima posizione e non ritornare nulla. Se non c'è un ordinamento il primo elemento sarà sempre quello.

    io mi ero basato su questo:

    codice:
    nuovo = creaelemento();
    if(nuovo)
    {
       nuovo->next = lista;
       lista = nuovo;
    }
    anche in questo caso il puntatore lista che punta al primo elemento punterà sempre all'ultimo inserito.

  6. #16
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da Lak3d
    hai ragione... allora basta scorrerla, inserire l'elemento nuovo in ultima posizione e non ritornare nulla. Se non c'è un ordinamento il primo elemento sarà sempre quello.
    Certo, questo e' un metodo, ma non ne hai mostrato il codice.

    E comunque, questo metodo risulta sempre piu' "pesante" ad ogni elemento inserito, perche' se ne hai inserito 100000, per il prossimo bisognera' scorrere tutta la lista per inserirlo ...

    io mi ero basato su questo:

    codice:
    nuovo = creaelemento();
    if(nuovo)
    {
       nuovo->next = lista;
       lista = nuovo;
    }
    E questo e' il metodo per evitare lo scorrimento in quanto il nuovo elemento viene inserito sempre in testa.

    anche in questo caso il puntatore lista che punta al primo elemento punterà sempre all'ultimo inserito.
    Sì, ma tutto il resto della lista ci sara' sempre perche' c'e' la linea

    nuovo->next = lista;

    che era proprio quello che mancava nel tuo codice ...

  7. #17
    Utente di HTML.it L'avatar di Lak3d
    Registrato dal
    Aug 2006
    Messaggi
    1,031
    ahhhh ho capito!
    sarà meglio che la prossima volta testi il codice che propongo...

  8. #18
    provo a commentarlo vediamo cosa riesco a fare . . . .

    Originariamente inviato da oregon

    codice:
    #include <stdio.h>
    #include <string.h>
    
    struct nodo
    { 
       char data[50]; 
       struct nodo *next; 
    }; 
    
    struct nodo *lista=NULL; /*Testa della lista*/
    
    void aggiungiElemento(char *val){/*perche void????*/
       struct nodo *temp;/*variabile temporanea per nuovo nodo*/ 
       temp=(struct nodo*)malloc(sizeof(struct nodo));/*assegno a temp una nuova area di memoria*/ 
       if(temp)/*se e' diverso da NULL*/ 
       { 
          strcpy(temp->data, val); /*copio il valore val nella struttura temp*/
          temp->next=lista;/*assegno a temp->next il valore NULL*/
    	  lista=temp;/*???????????????*/
       } 
       else 
          printf("Memoria non disponibile - Elemento non aggiunto\n"); /*nel caso temp fosse NULL*/
    }
    
    void main(void){
    	char val[50];
    	while(1){
    		printf("Dato da inserire: "); 
    
    		fgets(val, 50, stdin);
    		val[strlen(val)-1]=0;
    
    		if(strlen(val))/*???????*/
    			aggiungiElemento(val); 
    		else
    			break;
    	}
    
    	printf("\nElenco:\n");
    	struct nodo *t = lista;
    	while(t)
    	{
    		printf("%s\n", t->data);
    		t=t->next;
    	}
    }
    La restante parte del codice sono sincero nn riesco a commentarla. . .
    da quanto però riesco a capire, si vengono cosi a creare infiniti nodi della lista di nome temp????

    la stampa avviene dall'ultimo elemento inserito fino al primo giusto?

  9. #19
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da donato.sciarra
    La restante parte del codice sono sincero nn riesco a commentarla. . .
    Provaci ...

    da quanto però riesco a capire, si vengono cosi a creare infiniti nodi della lista di nome temp????
    I nodi della lista non hanno nome ...

    la stampa avviene dall'ultimo elemento inserito fino al primo giusto?
    Giusto. Questo perche' il nuovo elemento viene inserito in testa ( e questo dovrebbe spiegarti la riga lista=temp; ) ...

    Se vuoi inserire il nuovo nodo alla fine, devi dichiarare un secondo puntatore che punti sempre all'ultimo elemento.

    P.S. Questo commento

    temp->next=lista;/*assegno a temp->next il valore NULL*/

    e' ovviamente sbagliato ...

  10. #20
    scusa perche' l'ultimo e' sbagliato lista non è null????

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