Relativamente al primo codice:
- il secondo typedef è inutile, in quanto nel C++ la definizione di una struct/class comporta la definizione di un nuovo tipo;
- il terzo typedef, tanto spesso utilizzato nei codici postati sui forum, secondo me sarebbe meglio evitarlo... comporta una semplificazione minima, ma rende il codice meno chiaro;
- la funzione creaLista() è perfettamente inutile;
- in C++ di solito si utilizza nullptr e non NULL;
- nella funzione stampaLista() la variabile corrente è superflua;
- credo inoltre che qualsiasi implementazione di una lista concatenata debba contenere una funzione per l'inserimento in testa e in coda;
- la funzione inserisciElemento() (che forse sarebbe più corretto chiamare inserisciElemento_in_ordine) potresti anche renderla di tipo void e implementarla sfruttando le suddette due funzioni introdotte nel punto precedente;
- la funzione leggi è sbagliata... cosa ritorna la funzione se trovato è falso? Se fossi in te renderei la funzione di tipo bool e passerei la variabile valore come argomento.
In pratica farei qualcosa del genere:
#include <iostream>
using namespace std;
typedef int T;
struct nodo
{
T valore;
struct nodo *next;
};
void aggiungi_in_testa(nodo **ptr, T info)
{
nodo *nuovo = new nodo;
nuovo->valore = info;
nuovo->next = *ptr;
*ptr = nuovo;
}
void aggiungi_in_coda(nodo **ptr, T info)
{
nodo **temp = ptr;
while(*temp)
{
temp = &(*temp)->next;
}
aggiungi_in_testa(temp, info);
}
void aggiungi_in_ordine(nodo **ptr, T info)
{
nodo **temp = ptr;
while(*temp && (*temp)->valore < info)
{
temp = &(*temp)->next;
}
aggiungi_in_testa(temp, info);
}
bool trova(nodo *ptr, T info)
{
while(ptr)
{
if(ptr->valore == info)
{
return true;
}
ptr = ptr->next;
}
return false;
}
void stampa_lista(nodo *ptr)
{
while(ptr)
{
cout << ptr->valore << " ";
ptr = ptr->next;
}
}
int main()
{
nodo* lista = nullptr;
aggiungi_in_coda(&lista, 3);
aggiungi_in_testa(&lista, 2);
aggiungi_in_coda(&lista, 4);
aggiungi_in_testa(&lista, 1);
aggiungi_in_coda(&lista, 6);
aggiungi_in_ordine(&lista, 0);
aggiungi_in_ordine(&lista, 5);
aggiungi_in_ordine(&lista, 9);
aggiungi_in_ordine(&lista, 7);
aggiungi_in_ordine(&lista, 8);
if(trova(lista, 6))
{
stampa_lista(lista);
}
}
Se hai qualche dubbio chiedi pure.
Per quanto riguarda il secondo codice, dopo se ho tempo gli do un'occhiata.