Salve a tutti stavo studiando da un libro unversitario una lista linkata ordinata (cioè che ad ogni inserimento casuale dalla tastiera mi garantisce che la lista sia automaticamente ordinata).Ho implementato il codice suggerito e ho riscontrato che l'ordinamento mi è garantito se inserisco decrescentemente tali valori mentre se li inserisco a casaccio questo non avviene.Qualcuno di buona volontà può aiutarmi?Grazie mille in anticipo . Questo è il codice:

Header file ListaDO.h
codice:
#ifndef LISTAD_H_
#define LISTAD_H_

typedef int E;
struct nodo;
typedef nodo * L;
struct nodo{
       E elem;
       L punt;
       };
       
class lista{
        
        private:
                L l;
                void inserisceric(L & p,const E e);
                bool inlistric(const L p,const E e);
                
        public:
               lista(){l=0;}
               ~lista();
               bool empty()const;
               bool full()const;
               void push(const E e);
               void pop(E & e);
               void lastpop(E & e);
               void inserisce(const E e){return inserisceric(l,e);}
               bool inlist(const E e) {return inlistric(l,e);}
               void print();
               
      };
#endif
File implementativo della classe lista

codice:
#include "listaDO.h"
#include <iostream>
using namespace std;

lista::~lista(){
L p,q;
for(p=l;p!=0;p=q){
  q=p->punt;
  delete p;
 }
 
}

bool lista::empty() const {return(l==0);}

bool lista::full() const {return false;}

void lista::push(const E e){

L q=new nodo;
q->elem=e;
q->punt=l;
l=q;
cout<<"Inserimento effettuato dell'elemento "<<e;
}

void lista::pop(E & e)
{
  L temp=l;
  e=l->elem;
  l=l->punt;
  delete temp;
  cout<<"estrazione effettuata dell'elemento "<<e;  
}

      

void lista::lastpop(E & e)
{
  if(l->punt==0) pop(e);
 else{
      L temp=l;
      while(temp->punt->punt) temp=temp->punt;
      e=temp->punt->elem;
      L q=temp->punt;
      temp->punt=0;
      delete q;
      cout<<"estrazione effettuata dell'elemento "<<e;}
}

void lista::inserisceric(L & p,const E e) //funzione ricorsiva
{
  if((p==0)||(e<p->elem))
   push(e);
  else inserisceric(p->punt,e);
}
     
     
bool lista::inlistric(const L p,const E e) //funzione ricorsiva
{
  if(p==0) return false;
  else{
       if(e==p->elem) return true;
       else return inlistric(p->punt,e);
      }
}

void lista::print()
{
 L temp=l;
 while(temp){
 cout<<temp->elem<<" ";
 temp=temp->punt;}
}
File del main

codice:
#include <cstdlib>
#include <iostream>
#include "listaDO.h"

using namespace std;

int main(int argc, char *argv[])
{
 E elem;
 lista Q;
 int scelta;
 bool fine=false;
 
 do{
   do{
      cout<<"Gestione di una lista dinamica ordinata";
      cout<<"\n1)Inserimento elemento";
      cout<<"\n2)Estrazione in testa";
      cout<<"\n3)Estrazione in coda";
      cout<<"\n4)Lista piena?";
      cout<<"\n5)Lista vuota?";
      cout<<"\n6)Ricerca elemento";
      cout<<"\n7)Stampa elementi in lista";
      cout<<"\n8)Uscita dal programma";
      cout<<"\nFai la tua scelta -> ";
      cin>>scelta;
     }while(scelta<1 || scelta>8);
     
     switch(scelta){
                    
                    case 1:
                           if(Q.full())cout<<"Inserimento non possibile!\n";
                           else{cout<<"Inserisci un elemento nella lista -> ";
                                cin>>elem;
                                Q.inserisce(elem);
                                }
                           break;
                                
                    case 2:
                           if(Q.empty()) cout<<"Impossibile estrarre in testa!\n";
                           else Q.pop(elem);
                           break;
                           
                    case 3:
                           if(Q.empty()) cout<<"Impossibile estrarre in coda!\n";
                           else Q.pop(elem);
                           break;
                           
                    case 4:
                           if(Q.full())cout<<"Lista piena!\n";
                           else cout<<"Lista non piena!\n";
                           break;
                           
                    case 5:
                           if(Q.empty()) cout<<"Lista vuota!\n";
                           else cout<<"Lista non vuote!\n";
                           break;
                           
                    case 6:
                           if(Q.empty()) cout<<"Lista vuota!Impossibile ricercare\n";
                           else{cout<<"Inserisci elemento da ricercare -> ";
                                cin>>elem;
                                 if(Q.inlist(elem)) cout<<"Elemento presente!\n";
                                 else cout<<"Elemento non presente!\n";}
                           break;
                           
                    case 7: 
                           if(Q.empty()) cout<<"Lista vuota!Impossibile stampare\n";
                           else Q.print();
                           break;
                    
                    case 8:
                           fine=true;
                           break;
                           
                    default: break;
                 }
                 
     cout<<"\n\n";
     system("PAUSE");
     system("CLS");
     }while(!fine);
     
    system("PAUSE");
    return EXIT_SUCCESS;
}