Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [C++]Lista in C++

  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C++]Lista in C++

    Salve ragazzi stò cercando di creare una lista in C++ e tutte le rispettive functions per la gestione della lista stessa.

    Questo è il codice che ho implementato:

    codice:
    #include <iostream>
    
    using namespace std;
    
    
    // dichiarazione della struttura "elemento"
    struct elemento {
    	int info;
    	struct elemento *punt;
    };
    
    
    // prototipi delle funzioni
    struct elemento *aggiungiInfo(struct elemento *p);
    void visualizzaLista(struct elemento *p);
    
    
    int main()
    {
    	struct elemento *lista=NULL; 	// puntatore della lista
    	int oper;
    	char next;
    
    	cout<<"Decidi l'operazione da svolgere:"<<endl;
    	cout<<"1) AGGIUNGI INFORMAZIONE"<<endl;
    	cout<<"2) VISUALIZZA LISTA"<<endl;
    	cin>>oper;
    
    	do
    	{
    		if (oper == 1)
    		{
    			lista=aggiungiInfo(lista);
    		}	
    		else if (oper == 2)
    		{
    			visualizzaLista(lista);
    		}
    
    		cout<<"Vuoi continuare? s/n:"<<endl;
    		cin>>next;
    	}
    	while (next=='s' or next=='S');
    }
    
    
    
    
    
    // corpo della funzione "struct elemento *aggiungiInfo()"
    struct elemento *aggiungiInfo(struct elemento *p){
    	
    	struct elemento *successivo;
    	int intero;
    
    	cout<<"Inserisci numero > "<<endl;
    	cin>>intero;
    
    	if (p != NULL){
    		// aggiungo dinamicamente gli elementi successivi
    		successivo=new elemento;
    		successivo->info=intero;
    		successivo->punt=p;
    	}else{
    		// creazione del primo elemento
    		p=new elemento;
    		p->info=intero;
    		p->punt=NULL;
    		// assegno p a successivo
    		successivo=p;
    	}
            // visualizzo la lista parziale ad ogni inserimento
    	visualizzaLista(p);
    	
    	return (successivo);
    }
    
    
    
    
    
    // corpo della funzione "visualizzaLista"
    void visualizzaLista(struct elemento *p){
    
    	if (p == NULL)
    	{
    		cout<<"Nessun informazione presente nella lista"<<endl;
    	}else{
    		// stampo la lista
    		while(p != NULL){	
    			cout<<"Numero > "<<p->info<<endl;
    			p=p->punt;		
    		}	
    	}
    	return;	
    }
    I miei dubbi sono questi:

    1)Come mai quando inserisco il primo elemento(es. 46) nella lista, me lo inserisce ma non me lo visualizza, quando inserisco il secondo elemento(es. 72), me lo inserisce ma mi fà visualizzare quello precedente, ovvero 46. Se ne inserisco un altro(es. 89) , mi visualizza 46 e 72 e così via.

    2)Come posso modificare il codice per far si che ad ogni inserimento ritorno di nuovo al menu iniziale, dove mi chiede di aggiungere un informazione o visualizzare la lista?

    3)C'è qualcuno che sà spiegarmi in modo davvero semplice la function "aggiungiInfo"? dalla dichiarazione fino al return.

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

  2. #2
    E' sbagliato il modo in cui gestisci i collegamenti e il puntatore che ritorni.
    I metodi che gestiscono l'aggiunta e la rimozione di elementi nella lista devono ritornare un puntatore alla testa della lista (che può essere modificata oppure no).
    Questa è la funzione modificata e correttamente funzionante (la correttezza dipende dal comportamento da te desiderato ovviamente )

    codice:
    struct elemento *aggiungiInfo(struct elemento *testa){
        
        struct elemento *successivo;
        int intero;
        
        cout<<"Inserisci numero > "<<endl;
        cin>>intero;
        
        if (testa != NULL){
    	// la lista non è vuota, aggiungo un elemento in
    	// testa o in coda (in questo caso in coda)
    	// Cerco la fine della lista
    	struct elemento *tmp;
    	for (tmp = testa; tmp->punt != NULL; tmp = tmp->punt) {
    	    
    	}
    	// ho trovato l'ultimo elemento della lista, aggiungo il mio in coda
    	successivo=new elemento;
    	successivo->info=intero;
    	tmp->punt = successivo;
    	successivo->punt = NULL; // l'ultimo elemento deve puntare a NULL come prossimo elemento
        }else{
    	// la lista è vuota, creo il primo elemento
    	successivo=new elemento;
    	successivo->info=intero;
    	successivo->punt=NULL;
    	// Metto la testa della lista uguale all'elemento appena creato
    	testa = successivo;
        }
        // visualizzo la lista parziale ad ogni inserimento
        visualizzaLista(testa);
        
        return testa;
    }
    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)

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.