Salve a tutti   , ho iniziato soltanto ieri le liste concatenate infatti vi chiedo se potreste darmi una delucidazione in merito a questo argomento. La prima difficoltà in cui mi sono imbattuta è 
la ricerca di un valore nella lista. In realtà sono riuscita a scrivere il codice capendo ogni singola riga ma non riesco a comprendere come mai il programma dopo aver inserito in testa questi elementi 5 4 3 2 1 nel momento in cui cerco il valore 5 mi dice che il valore è stato trovato, se inserisco 2 o un numero dopo il 5 mi dice che l'elemento non è stato trovato. Vi posto qui il codice, possibilmente sbaglio qualcosa senza rendermene conto.
/*RICERCA DI UN ELEMENTO con inserimento in testa*/
struct elemento{
 int inf;
 struct elemento *next;
};
struct elemento *ins_testa(struct elemento *p, int valore);
void stampa(struct elemento *p);
struct elemento *cerca(struct elemento *p, int val);
int main(){
struct elemento *p=NULL;
int dim, i, num, val;
 printf("Quanti elementi vuoi inserire nella lista?\n");
 printf("Inserisci DIMENSIONE: ");
 scanf("%d", &dim);
  for(i=0; i<dim; i++){
    printf("Inserisci elemento in posizione [%d]= ", i);
    scanf("%d", &num);
    p=ins_testa(p,num);
  }
 stampa(p);
 printf("Inserisci elemento da cercare: ");
 scanf("%d", &val);
 p=cerca(p,val);
 if(p==NULL){
  printf("Elemento non trovato!\n\n");
 }
 else{
  printf("Elemento trovato!\n\n");
 }
system("pause");
return 0;
}
struct elemento *ins_testa(struct elemento *p, int valore){
struct elemento *aus;
 aus=malloc(sizeof(struct elemento));
 aus->inf=valore;
 aus->next=p;
return aus;
}
void stampa(struct elemento *p){
printf("\nLISTA= ");
 while(p!=NULL){
  printf("%d\t", p->inf);
  p=p->next;
 }
printf("\n\n");
}
struct elemento *cerca(struct elemento *p, int val){
struct elemento *aus;
 for(aus=p; aus!=NULL; aus=aus->next){
    if(aus->inf==val){
     return aus;
    }
 return NULL;
 }
}