RICERCA DI UN ELEMENTO con inserimento in testa

di il
5 risposte

RICERCA DI UN ELEMENTO con inserimento in testa

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;
 }
}

5 Risposte

  • Re: RICERCA DI UN ELEMENTO con inserimento in testa

    Salve, Random
    Il problema sta nella funzione "cerca".
    
    for(aus=p; aus!=NULL; aus=aus->next){
        if(aus->inf==val){
           return aus;
        }
        return NULL; //<---
     }
    
    Quando questo segmento di codice viene eseguito:
    - aus != NULL, inizia il ciclo for
    - Viene verificata la condizione aus-inf == val. Se è vera la funzione termina restituendo aus. Altrimenti passa alla riga successiva...
    - ...dove il programma restituisce NULL, ancora dentro il primo 'giro' del ciclo! In questo modo fa il controllo solo per il primo elemento

    Tutto ciò che devi fare per correggere questo errore è spostare quel "return NULL" al di fuori del ciclo for
  • Re: RICERCA DI UN ELEMENTO con inserimento in testa

    Grazie mille, adesso ho capito
  • Re: RICERCA DI UN ELEMENTO con inserimento in testa

    Buonasera, volendo evitare di aprire post simili, ho trovato questo non proprio recente!
    Detto ciò, inserisco qui il codice per la ricerca di un elemento in una lista, con l'aggiunta nel caso in cui l'elemento non fosse presente...
    Accetto consigli per una migliore implementazione grazie!
    struct nodo *ricerca(struct nodo *l, int val) {
    	int count = 0;
    	while(l != NULL) {
    		if (l->info == val) {
    			count ++;
    		}
    		l = l->next;
    	}
    	if(count != 0) {
    		printf("\n Il valore inserito [%d] e' stato trovato!", val);
    	}
    	else {
    		printf("\n Il valore non e' presente nella lista!");
    	}
    	printf("\n Valore trovato %d volte", count);
    	return l;
    }
    NB: Il codice l'ho testato e sembra funzionare...
  • Re: RICERCA DI UN ELEMENTO con inserimento in testa

    Vincenzo.79 ha scritto:


    Buonasera, volendo evitare di aprire post simili, ho trovato questo non proprio recente!
    La prima volta ci può pure stare, ma dopo che ti è stato fatto notare che il regolamento vieta la riesumazione di vecchi topic, perché mai continui a farlo?! Cosa ti costa aprire un topic nuovo?

    Sia per quanto detto sopra sia per il fatto che non ha senso postare tue soluzioni a vecchi (e banali) problemi altrui, a questo giro io passo.

    Se posso, visto che ti stai occupando di liste, ti consiglio di aprire un topic nuovo in cui postare un codice compilabile sulle liste che comprende le funzioni base di inserimento in testa, inserimento in coda e stampa. A quel punto riceverai tutti i consigli che vuoi per una migliore implementazione e magari potrei suggerirti anche funzioni un po' più avanzate sempre relative alle liste.
  • Re: RICERCA DI UN ELEMENTO con inserimento in testa

    La prima volta ci può pure stare, ma dopo che ti è stato fatto notare che il regolamento vieta la riesumazione di vecchi topic, perché mai continui a farlo?! Cosa ti costa aprire un topic nuovo?
    Sia per quanto detto sopra sia per il fatto che non ha senso postare tue soluzioni a vecchi (e banali) problemi altrui, a questo giro io passo.
    Chiedo venia, quando ho letto il messaggio di evitare di riesumare topic troppo vecchi, avevo già risposta e quindi oramai è fatta...scusami ancora starò più attento...
    Se posso, visto che ti stai occupando di liste, ti consiglio di aprire un topic nuovo in cui postare un codice compilabile sulle liste che comprende le funzioni base di inserimento in testa, inserimento in coda e stampa. A quel punto riceverai tutti i consigli che vuoi per una migliore implementazione e magari potrei suggerirti anche funzioni un po' più avanzate sempre relative alle liste.
    In effetti ho bisogno proprio di queste tre implementazioni per ora a livello base...
    Seguirò sicuramente il tuo consiglio ed aprirò una discussione in merito...
Devi accedere o registrarti per scrivere nel forum
5 risposte