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

    [C++]Inserimento in lista ordinata(ricorsivamente)

    Salve ragazzi,

    stò cercando di capire come inserire un elemento in una lista ordinata, IN MODO RICORSIVO.
    Per esempio, supponiamo che la lista è la seguente:

    codice:
    [3][-]--->[4][-]--->[7][-]---> NULL
    Adesso, vorrei inserire l'elemento 5, che dovebbe essere inserito trà 4 e 7, quindi otterrei una struttura di questo tipo:

    codice:
    [3][-]--->[4][-]--->[5][-]--->[7][-]---> NULL
    Io ho iniziato a mettere giù un pò di codice:

    codice:
    #include<iostream>
    
    
    using namespace std;
    
    
    typedef struct nodo {
      int value;
      struct nodo *link;
    };
    
    
    nodo inserimento(nodo *head, int elemento);
    
    
    int main()
    {
    nodo *head=NULL;
    
    inserimento(head, elemento);
    }
    
    
    nodo inserimento(nodo *head, int elemento){
     
      if(head==NULL){
        (*head)->value=elemento;
        (*head)->link=NULL;
      }
      ......
    
    }
    Adesso, non riesco a capire come continuare il tutto.
    Qualcuno potrebbe aiutarmi a completare il programma?

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

  2. #2
    a livello di logica la funzione ricorsiva che agisce sui nodi la farei così


    (se valore del nodo successivo attualmente in esame è > del valore che voglio inserire) || (se nodo successivo a quello attuale == NULL)
    inserisci
    return

    altrimenti ricorri su nodo successivo

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Per adesso, sono riuscito ad inserire un solo valore nella lista, ecco il codice:

    L'ho provato è funziona perfettamente:

    codice:
    #include<iostream>
    using namespace std;
    
    struct nodo {
      int value;
      struct nodo *link;
    };
    
    typedef struct nodo *lista;
    
    // prototipi delle funzioni
    lista inserimento(lista &head, int elemento);
    lista stampa_lista(lista &head);
    
    int main()
    {
    	lista head=NULL;
    	int elemento;
    
    	inserimento(head, elemento);
    	stampa_lista(head);
    }
    
    
    
    lista inserimento(lista &head, int elemento){
    
    	
    	/* nel caso in cui non ci sono nodi */	
    	if (head == NULL)
    	{
    		head=new nodo;
    		cin>>head->value;
    		head->link=NULL;
    	}		
    }
    
    lista stampa_lista(lista &head){
    	
    	cout<<"Valori lista:"<<endl;		
    	cout<<head->value<<endl;
    
    }
    Ho due dubbi:
    1) Se non passo la lista per riferimento (&head) nelle funzioni, mi restituisce come errore: "Errore di segmentazione", perchè?

    2) se dichiaro la struttura così non va bene:
    codice:
    typedef struct nodo_lista *lista;
    struct nodo_lista{
    	int value;
    	lista link;
    };
    Adesso vorrei capire come inserire altri elementi nella lista, in modo ordinato.

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

  4. #4
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ragazzi, io ho creato questo codice per l'inserimento di elementi in una lista ordinata:

    codice:
    #include <iostream>
    using namespace std;
    
    
    typedef struct nodo{
    	int valore;
    	nodo *link;
     }lista;
    
    
    void insert( lista *head,int elemento);
    
    
    int main(){
    	
    	lista *head=NULL;
    	
    	int n;
    	//Inseriamo da tastiera il nuovo numero da inserire.
    	cout << "Elemento Da inserire: "<<endl;
    	cin>> n;
    
    	insert(head,n);
    	
    	//Stampa della lista!
    	lista *temp;
    	temp=head;
    	while (temp != NULL) {
    		
    		cout << temp->valore;
    		temp=temp->link;
    	}
    	
    	return 0;
    }
    
    lista insert( lista *head,int elemento){
    
    	lista *temp;
    	temp->link=head;
    	while (temp->link != NULL and elemento>temp->link->valore) {
    		temp=temp->link;
    	}
    	
    	if (temp->link==NULL) {
    		temp->link=new lista;
    		temp->link->valore=elemento;
    		temp->link->link=NULL;
    	}
    		
    }

    ma mi dà errore nella funzione precisamente in questa riga:

    temp->link=head;

    ecco l'errore:
    Program received signal: “EXC_BAD_ACCESS”.
    sharedlibrary apply-load-rules all


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

  5. #5
    non hai allocato temp ma hai definito solo il suo puntatore
    temp->link "non esiste" e quindi ti da quel segmentation fault
    all that you need:
    http://www.cplusplus.com/reference/clibrary/

  6. #6
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ho risolto grazie alla tua delucidazione ma ora non mi stampa!
    Questa è la funzione:

    codice:
    #include <iostream>
    using namespace std;
    
    
    typedef struct nodo{
    	int valore;
    	nodo *link;
     }lista;
    
    
    lista insert( lista *head,int elemento);
    void stampa(lista *head);
    
    int main(){
    	
    	lista *head=NULL;
    	
    	int n;
    	//Inseriamo da tastiera il nuovo numero da inserire.
    	cout << "Elemento Da inserire: "<<endl;
    	cin>> n;
    
    	insert(head,n);
    	stampa(head);
    	return 0;
    }
    
    lista insert( lista *head,int elemento){
    
    	lista *temp;
    	temp=new lista;
    	temp->link=head;
    	while (temp->link != NULL and elemento>temp->link->valore) {
    		temp=temp->link;
    	}
    	
    	if (temp->link==NULL) {
    		temp->link=new lista;
    		temp->link->valore=elemento;
    		temp->link->link=NULL;
    	}
    		
    }
    
    void stampa(lista *head){
    	
    	lista *temp;
    	temp=head;	
    	
    	while (temp != NULL){
    		cout<<temp->valore<<endl;
    		temp=temp->link;
    	}
    }
    Questo è il mio codice attuale,
    Grazie
    Con i sogni possiamo conoscere il futuro...

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

  8. #8
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Finalmente ci sono riuscito.
    Volevo solo chiarire 2 dubbi, per farveli individuare ho preferito mettere dei punti "?".

    1) perchè il programma mi funziona solo se passo la testa in questo modo:
    codice:
    lista insert( lista *&head, int elemento);
    cioè, perchè passare *&

    2) precisamente con:
    codice:
    head=temp;              // ?
    questo cosa faccio? perchè?


    Questo il codice:
    Codice PHP:
    #include<iostream>

    using namespace std;

    /* Tipo di dato lista */
    typedef struct nodo{
        
    int valore;
        
    nodo *link;
    lista;



    /* Prototipi delle functions */
    lista insertlista *&headint elemento);
    void stampa(lista *head);



    int main()
    {

        
    lista *head=NULL;

        
    char choise;
        
    int elemento;

        do {
            
    cout << "Elemento da inserire: "<<endl;
            
    cin>>elemento;
            
    insert(headelemento);
            
    cout<<"Continuare l'inserimento?(s/n)"<<endl;
            
    cin>>choise;

        } while(
    choise=='s' || choise=='S');


        
    stampa(head);


        return 
    0;
    }


    /* function per inserire in modo ordinato gli elementi nella lista */
    lista insert(lista *&headint elemento) {

        
    lista *temp, *prec, *current;

        
    current=head;

        
    /* se il nodo corrente, cioè nel primo caso la testa(NULL) => vedi [ current=head ] e' nullo
         * o l'elemento e' <= del valore del puntatore corrente => nel nostro caso sempre NULL, poichè non
         * esiste alcun nodo,
         * INSERISCO L'ELEMENTO IN TESTA ALLA LISTA
         */
        
    if(current == NULL || elemento <= current->valore){

            
    temp=new lista;         // alloco dinamicamente memoria per un nodo temporaneo(temp)
            
    temp->valore=elemento;  // salvo l'elemento nel nodo temporaneo
            
    temp->link=current;     // il nuovo nodo creato, punterà a current che equivale alla testa, quindi il valore viene messo dietro la testa
            
    head=temp;              // ?

        
    } else {

            
    /* altrimenti se il nodo corrente non è nullo, cioè vale a dire esiste almeno un nodo
             * e l'elemento da inserire è maggiore di quelli precedenti,
             * fin quando il nodo corrente non punterà a NULL e l'elemento da inserire
             * è > di quelli già presenti nella lista,
             * salverò ad ogni iterazione il nodo subito precedente a quello che ha valore più grande dell'elemento da inserire.
             * es. |3|->|8|->|22|->NULL, se volessi inserire 5, savlerei il nodo con valore 3, in quanto alla itererazione successiva,
             * avremo un nodo che ha valore > dell'elemento da inserire(uscendo così dal while).
             */
            
    while(current != NULL && elemento current->valore){

                
    prec=current;           // salvo il nodo precedente
                
    current=current->link;  // scorro la lista

            
    }

            
    temp=new lista;         // alloco dinamicamente memoria per un nodo temporaneo(temp)
            
    temp->valore=elemento;  // salvo l'elemento nel nodo temporaneo
            
    temp->link=current;     // il nodo che viene inserito, punterà a quello successivo, nel nostro esempio al nodo ->|8|
            
    prec->link=temp;        // il nodo precedente, nel nostro caso |3|-> punterà al nuovo nodo inserito, nel nostro esempio |5|
        
    }
    }


    /* function per stampare gli elementi della lista */
    void stampa(lista *head) {

        
    lista *tmp;
        
    tmp=head;

        
    cout<<"Lista stampata:"<<endl;

        while (
    tmp != NULL) {
            
    cout<<tmp->valore<<endl;
            
    tmp=tmp->link;
        }

    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.