Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C++]Inserire elementi uno dopo l'altro in una lista

    Salve ragazzi, stò cercando di capire come inserire elementi in una lista(non ordinata, devo semplicemente inserire elementi uno dopo l'altro)

    ho fatto una cosa del genere, ma mi stampa solo il primo valore inserito.

    premetto che nel main ho una cosa di questo tipo:
    codice:
    			lista *head=NULL;
    			int elemento;
    			char continua;
    
    			do{
    				cout<<"Inserisci l'elemento da inserire:"<<endl;
    				cin>>elemento;
    				addElem(head, elemento);
    				cout<<"Vuoi continuare ad inserire elementi?"<<endl;
    				cin>>continua;
    			} while(continua == 's' || continua=='S');
    			cout<<endl<<"Stampo gli elementi:"<<endl;
    			stampa_lista(head);
    codice:
    void addElem(lista *&head, int elemento){
    	lista *new_node=new lista;
    	lista *temp=new lista;
    	
    	new_node->value=elemento;
    	new_node->link=NULL;
    
    	if(head==NULL){
    		head=new_node;
    		temp=head;
    	}else{
    		temp->link=new_node;
      		temp=new_node;
     	}
    }
    Questa è la mia funzione per stampare la lista:
    codice:
    void stampa_lista(lista *head){
    
    	cout<<"Elementi della lista:"<<endl;
    	while (head != NULL){
    		cout<<head->value<<" ";
    		head=head->link;
    	}
    }
    Cos'è che sbaglio? come potrei modificare la mia function addElem?

    Grazie anticipatamente,
    gaten
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Sbagli perchè se entri nel ramo else nella funzione addElem non colleghi mai il nuovo elemento con quelli già presente in lista.
    Dovresti fare qualcosa tipo:

    codice:
    void addElem(lista *&head, int elemento){
        lista *new_node=new lista;
        
        new_node->value=elemento;
        new_node->link=NULL;
        
        if(head==NULL){
    	head=new_node;
        }else{
    	lista *temp; // puntatore temporaneo da inizializzare alla testa della lista
    	
    	for (temp = head; temp->link != NULL; temp = temp->link) {
    	    ;
    	}
    	
    	// qui temp è uguale all'ultimo elemento in lista
    	
    	temp->link = new_node; // collego l'ultimo elemento con l'elemento appena creato
        }
    }
    Non ho testato la funzione, ma così dovrebbe aggiungerli correttamente.
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    All'inserimento del secondo elemento mi dà: "Errore di segmentazione"

    Ecco il codice:

    codice:
    lista addElem(lista *&head, int elemento){
    	lista *new_node=new lista;
    
    	new_node->value=elemento;
    	new_node->link=NULL;
    
    	if (head == NULL){
    		head=new_node;
    	}else{
    		lista *temp;	
    		temp=head;
    		while (temp != NULL){
    			temp=temp->link;
    		}
    		temp->link=new_node;
    	}
    }
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ho notato che il mio errore era nel while:
    facevo:
    [CODE]
    while (temp != NULL)
    [CODE]
    anzichè:
    codice:
    while (temp->link !=NULL)
    ricky cortesemente mi puoi spiegare per bene perchè così?
    perchè questo non va bene?
    codice:
    lista addElem(lista *&head, int elemento){
    
    lista *temp, *prev, *new_node;
    
    if(head==NULL){
      head->value=elemento;
      head->link=NULL;
    } else {
      temp=head;
      while(temp->link != NULL){
          prev=temp;
          temp=temp->link;
      }
     new_node=new lista;
     new_node->value=elemento;
     new_node->link=NULL;
     prev->link=new_node;
    }
    poi perchè si deve fare obbligatoriamente *&head?
    Con i sogni possiamo conoscere il futuro...

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Supponiamo che la testa inizialmente è vuota:

    head=NULL;

    io richiamo la function addElem e gli passo come parametri: NULL e l'elemento esempio: 7

    entro nel primo if(head==NULL) e inserisco il primo elemento, ottenendo una cosa del tipo:

    |7|-|----->NULL

    Adesso supponiamo di inserire un altro elemento es: 5

    entro nell'else, poichè la lista non è vuota. Assegno a temp=head. Scorro con il while fino ad arrivare ad uno spazio NULL per inserire l'elemento e quindi il tutto diventa:

    |7|-|--->|5|-|--->NULL.

    ADESSO, inserisco come elemento 9, entro nell'else della function , ed eseguo nuovamente questa assegnazione:

    temp=head; ==> quanto vale in questo istante, dopo aver inserito: 7 e 5?
    come vengono salvati gli elementi precedenti?
    Con i sogni possiamo conoscere il futuro...

  6. #6
    In pratica, con una lista di questo tipo, hai bisogno solamente al puntatore alla testa della lista, gli altri elementi si trovano seguendo la catena dei link. Ecco perchè all'ingresso dell'else il puntatore temp è inizializzato alla testa della lista e poi portato fino all'ultimo elemento seguendo la catena dei link. A questo punto all'ultimo elemento si aggiunge il nodo appena creato.
    Temp all'inizio vale quanto head, ma dopo il for è uguale all'ultimo elemento (quello con link a NULL), perchè cicli fino a trovare l'ultimo elemento, in coda al quale inserire il tuo dato.
    Spero di essere stato comprensibile.

    Edit: si deve mettere un riferimento al puntatore alla testa perchè può venire modificata (ad esempio se la lista è vuota), quindi è necessario modificare tale valore per riferimento. Usare una copia del puntatore non ne aggiornerebbe il valore al di fuori della funzione.
    Se state chiamando per i piedini mancanti,lasciate il vostro indirizzo,e i piedi di ricambio vi saranno consegnati da mio nipote Jody. E ora, io devo ritornare nel dolce abbraccio della cripta... Ma tornerò!!!

    The Simpson ; AABF08 (Domenica orrenda domenica)

  7. #7
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Grazie mille!
    Con i sogni possiamo conoscere il futuro...

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.