Ho un problema con la funzione per eliminare un elemento all'interno di una lista. Questo quando è presente un solo elemento me lo elimina ed elimina anche l'elemento che si trova più in alto nella lista, ma gli altri no. Vi posto il codice:

listaord.h

codice:
#ifndef LISTAORD_H_
#define LISTAORD_H_

#include <iostream>

struct Record;
typedef Record* L;
typedef int E;
struct Record
{
	E elem;
	L punt;

};

void inizializza(L& l);
bool empty(const L& l);
bool full(const L& l);
void inserisce(L& l,const E& e);
bool elimina(L& l,const E& e);
void stampa(const L l);

#endif /*LISTAORD_H_*/
listaord.cpp

codice:
//Contiene le definizioni delle funzioni

#include <iostream>
#include "listaord.h"

using namespace std;

//Inizializza lista
void inizializza(L& l){
	l=NULL;
}

//Controlla se Vuota
bool empty(const L& l){
	return(l==NULL);
}

//Controlla se piena
bool full(const L& l){
	return false;
}

//Funzione utilizzata da Inserisce
void push(L& l,const E& e){

L q=new Record;
	q->elem=e;
	q->punt=l;
	l=q;
}

//Funzione Inserisce
void inserisce(L& l,const E& e){
	if((l==NULL) || (e>l->elem))
		push(l,e);
	else inserisce(l->punt,e);
	}

//Utilizzata da Elimina
void eliminatesta(L& l){

L lc=l->punt;
	delete l;
	l=lc;
}

//Elimina
bool elimina(L& l,const E& e){
	
	bool trovato=false;
	
	if(l!=NULL){
		
		if(e==l->elem){
			trovato=true;
			eliminatesta(l);
				}
		return trovato;
	}
		else return elimina(l->punt,e);	
		
}

//Stampa
void stampa(const L l){
	
	if(l!=NULL){
		cout<<l->elem<<endl;
		stampa(l->punt);
	}
}

usalistaord.cpp

codice:
#include <iostream>
#include "listaord.h"

using namespace std;

//Prototipi di funzioni definite in questo modulo


void presenta_menu(int& scelta);
void inserimento(L& l);
void estrazione(L& l);
void print(const L& l);

int main() {
L l;	//definisce variabile di tipo lista

int scelta, esci=0;
	inizializza(l); 	// inizializza la lista
	do {
	   presenta_menu(scelta);
	   switch (scelta) {
	      case 1: inserimento(l);break;
	      case 2: estrazione(l);break;
		  case 3: print(l);break;
		  case 4: esci=1;break;
		  default: cout << "\n opzione errata!";
	   }
	} while (!esci);
}

void presenta_menu(int& scelta) {
	do {
	// stampa il menu' delle operazioni previste
	
	   cout<<"\n   Gestione di una lista dinamica ORDINATA";
	   cout<<"\n1) Inserimento di un elemento\n ";
	   cout<<"\n2) Cancellazione di un elemento\n ";
	   cout<<"\n3) Visualizza la lista\n ";
	   cout<<"\n4) Fine\n ";
	   cout<<"\n Inserisci una opzione: ";
	   cin>>scelta;
	   cout << "\n";
	} while ((scelta<1)||(scelta>4));
}


void inserimento(L& l) {
E e ;
	
	cout<<"Opzione 1 - inserimento di un elemento\n ";
	cout<<"elemento= "; cin>>e;
	if (!full(l)) inserisce(l,e);
	else cout<<"\n Lista piena\n ";
}

void estrazione(L& l) {
E e;

	cout<<"Opzione 2 - cancella un elemento\n ";
	if (!empty(l)) {
		cout<<"elemento da eliminare= "; cin>>e;
		if (elimina(l,e))
		   cout<<"\nelemento =	"<<e << "cancellato!";
        else  cout<<"Elemento non presente nella lista.\n ";
	}
	else cout<<"Lista vuota cancellazione impossibile\n ";
}


void print(const L& l) {
	cout<<"Opzione 3 - stampa della lista\n ";
	if (!empty(l)) 
		stampa(l);
		else cout << "\nLista vuota!";
}