Advertisement
Denny707

Inserimento Ordinato Iterativo e Ricorsivo

May 28th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /*
  5.  Scopo :
  6.  Inserire in modo ordinato elementi in una linked list
  7.  
  8.  Specifiche:
  9.  void addNodoOrdinato(nodo *head,int n)
  10.  void addNodoOrdinatoRicorsivo(nodo *nodoDaCercare,int n)
  11.  
  12.  Lista dei parametri:
  13.  nodo *head |   puntatore alla testa della lista
  14.  int n      |   Elemento da inserire
  15.  
  16.  Indicatori di errore
  17.  Nessuno
  18.  
  19.  Procedure ausiliarie
  20.  void display(nodo *head) { //funzione di stampa dei dati
  21.  
  22.  Esempio d'uso:
  23.  addNodoOrdinato(head,0);
  24.  addNodoOrdinato(head,-12);
  25.  addNodoOrdinato(head,288);
  26.  addNodoOrdinato(head,14);
  27.  
  28.  addNodoOrdinatoRicorsivo(head,44);
  29.  addNodoOrdinatoRicorsivo(head,9);
  30.  addNodoOrdinatoRicorsivo(head,54);
  31.  addNodoOrdinatoRicorsivo(head,-4);
  32.  addNodoOrdinatoRicorsivo(head,2);
  33.  
  34.  OUTPUT:    -12 -4 0 2 9 14 44 54 288
  35.  
  36.  */
  37. struct nodo{
  38.     int info;
  39.     nodo *link;
  40. };
  41.  
  42. void addNodoOrdinato(nodo *head,int n) {
  43.     nodo *newNode = new nodo();
  44.     nodo *previous = NULL;
  45.     nodo *current = head;
  46.     while (current != NULL && n > current->info) {
  47.         previous = current;
  48.         current = current->link;
  49.     }
  50.    
  51.     if (previous == NULL) { //Se l'elemento da inserire Γ¨ piΓΉ piccolo della head
  52.         nodo *newNode2 = new nodo(); //creo un nodo
  53.         newNode2->info = head->info; //copio il valore di head in questo nuovo nodo
  54.         head->info = n;    //valorizzo la testa col nuovo valore
  55.         head->link = newNode2; //collego la testa al nuovo nodo
  56.     } else {
  57.         previous->link = newNode;
  58.     }
  59.     newNode->link = current;
  60.     newNode->info = n;
  61. }
  62.  
  63. void addNodoOrdinatoRicorsivo(nodo *nodoDaCercare,int n){
  64.     nodo *newNode = new nodo();
  65.     nodo *nodoAttuale = new nodo();
  66.     nodoAttuale=nodoDaCercare;
  67.    
  68.     if(n>nodoDaCercare->info){
  69.         if(nodoDaCercare->link!=NULL){
  70.             addNodoOrdinatoRicorsivo(nodoDaCercare->link,n);
  71.         }else{
  72.             newNode->info=n;
  73.             newNode->link=NULL;
  74.             nodoDaCercare->link=newNode;
  75.         }
  76.     }else{
  77.         nodoDaCercare = nodoDaCercare->link;
  78.         newNode->info = nodoAttuale->info;   //mi salvo il valore del nodoAttuale in nuovo nodo
  79.         newNode->link = nodoDaCercare;
  80.         nodoAttuale->link = newNode;         //e modifico il nodoAttuale con i dati da inserire
  81.         nodoAttuale->info = n;
  82.     }
  83. }
  84.  
  85. void display(nodo *head) { //funzione di stampa dei dati
  86.     nodo *list = head;
  87.     cout << list->info << " ";
  88.     do{
  89.         list = list->link;
  90.         cout << list->info << " ";
  91.     }while(list->link != NULL);
  92.     cout<<endl;
  93. }
  94.  
  95. int main(int argc, const char * argv[]) {
  96.     nodo *head= new nodo();
  97.  
  98.     addNodoOrdinato(head,0);
  99.     addNodoOrdinato(head,-12);
  100.     addNodoOrdinato(head,288);
  101.     addNodoOrdinato(head,14);
  102.    
  103.     addNodoOrdinatoRicorsivo(head,44);
  104.     addNodoOrdinatoRicorsivo(head,9);
  105.     addNodoOrdinatoRicorsivo(head,54);
  106.     addNodoOrdinatoRicorsivo(head,-4);
  107.     addNodoOrdinatoRicorsivo(head,2);
  108.    
  109.     display(head);
  110.     return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement