Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Inserimento numeri su lista ordinata
Forum - C/C++ - Inserimento numeri su lista ordinata

Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 14:21
Domenica, 19/01/2014
(Premetto che la lezione non l'ho seguita causa malattia, quindi ho visto per conto mio questa parte dei puntatori a struct)

L'esercizio consiste nel leggere una sequenza di numeri interi, terminata da un
numero negativo, e la memorizza in una lista concatenata in modo tale che risulti
ordinata in senso crescente. Ho provato però non capisco perchè non funziona in certi casi. Sapreste aiutarmi? :d

P.S. con questi numeri non ordina correttamente: 5 2 6 4 8 1 -1

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. struct lista{
  7.     int val;
  8.     lista *next;
  9. };
  10.  
  11. void inserisci_testa(lista *&l, int x);
  12. void inserisci_coda(lista *&l, int x);
  13. void inserisci_ordinato(lista *&l, int x);
  14. int length(lista *l);
  15. void stampa_lista(lista *&l);
  16.  
  17. int main()
  18. {
  19.     int x;
  20.     lista *l1 = NULL;
  21.     cout << "Dai una sequenza di numeri interi (negativo per smettere):\n";
  22.     do{
  23.         cin >> x;
  24.         if(x >= 0)
  25.             inserisci_ordinato(l1, x);
  26.     } while(x >= 0);
  27.      if( length(l1) == 0 )
  28.         cout << "\nLetto e memorizzato nessun numero\n";
  29.     else if( length(l1) == 1 )
  30.         cout << "\nLetto e memorizzato un solo numero\n";
  31.     else
  32.         cout << "\nLetti e memorizzati "<< length(l1) << " numeri\n";
  33.     cout << "\nSequenza ordinata:\n";
  34.     stampa_lista(l1);
  35.  
  36.     cout << "\n\n";
  37.     return 0;
  38. }
  39.  
  40. bool lista_vuota(lista *l){
  41.      return (l == NULL);
  42. }
  43.  
  44. void inserisci_testa(lista *&l, int x){
  45.     lista *t = new lista;
  46.     t -> val = x;
  47.     t -> next = l;
  48.     l = t;
  49. }
  50.  
  51. void inserisci_coda(lista *&l, int x){
  52.     if( lista_vuota(l) )
  53.         inserisci_testa(l, x);
  54.     else{
  55.         lista *t;
  56.         for(t = l; t -> next != NULL; t = t -> next);
  57.         t -> next = new lista;
  58.         t -> next -> val = x;
  59.         t -> next -> next = NULL;
  60.     }
  61. }
  62.  
  63. void inserisci_ordinato(lista *&l, int x){
  64.     if(lista_vuota(l) || l -> val >= x)
  65.         inserisci_testa(l, x);
  66.     else if(l -> val < x)
  67.         inserisci_coda(l, x);
  68. }
  69.  
  70. int length(lista *l){
  71.     if (l == NULL)
  72.         return 0;
  73.     else
  74.         return ( length(l -> next) + 1 );
  75. }
  76.  
  77. void stampa_lista(lista *&l){
  78.     lista *t = new lista;
  79.     for(t = l; t != NULL; t = t -> next)
  80.         cout << t -> val << "  ";
  81. }


Ultima modifica effettuata da bububs il 19/01/2014 alle 14:22
PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 16:36
Domenica, 19/01/2014

Il confronto lo fa sempre col primo valore puntato della struttura Lista, quindi il 4 risulterà maggiore del 2
e quindi verrà messo dopo il 6, quindi nessun errore


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 16:51
Domenica, 19/01/2014
Intanto grazie per la risposta.
Ma se io volessi invece la lista ordinata e quindi invece di: 1 2 5 6 4 8, questo: 1 2 4 5 6 8, come dovrei cambiare il codice?

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 17:03
Domenica, 19/01/2014

Potresti inserire un semplice Bubble Sort


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 12:53
Lunedì, 20/01/2014
Ho risolto grazie. :k:
Mi è sorto un altro dubbio.. se volessi scambiare il primo elemento della lista con un puntatore passato alla funzione, del tipo: scambia(lista *&l, lista *p){} come dovrei comportarmi?

PM Quote