Funzioni per liste...[C]
Ragazzi sto facendo un programma con varie funzioni sulle liste e ve ne vorrei mostrare due perchè non capisco dove sia l'errore. Esse sono:
Una funzione per invertire gli elementi di una lista. L'errore è il seguente: quando vado a stampare la lista dopo averla invertita, mi viene stampato solo il primo elemento.
L'altra è una funzione per cercare l'elemento in una lista. In questo caso, l'errore è il seguente: anche se inserisco un valore che si trova nella lista, il compilatore mi dice che quel valore non è presente.
Per favore mi potete dare una mano?????
Una funzione per invertire gli elementi di una lista. L'errore è il seguente: quando vado a stampare la lista dopo averla invertita, mi viene stampato solo il primo elemento.
/*Inverte gli elementi di una lista*/ LISTA* inverti_lista(LISTA *primo){ LISTA *ultimo,*temp,*corrente; corrente=primo; ultimo=temp=NULL; while(corrente!=NULL){ temp=corrente->next; corrente->next=ultimo; ultimo=corrente; corrente=temp; } return ultimo; }
L'altra è una funzione per cercare l'elemento in una lista. In questo caso, l'errore è il seguente: anche se inserisco un valore che si trova nella lista, il compilatore mi dice che quel valore non è presente.
/*Ricerca un elemento all'interno di una lista*/ int ricerca_elemento(LISTA *p, double n){ while(p!=NULL){ if(n == p->val) return 1; p=p->next; } return 0; }
Per favore mi potete dare una mano?????
Risposte
"fk16":
Ragazzi sto facendo un programma con varie funzioni sulle liste e ve ne vorrei mostrare due perchè non capisco dove sia l'errore.
di che tipo di liste si tratta? linked-list, double-linker-list, con sentinella ....
L'altra è una funzione per cercare l'elemento in una lista. In questo caso, l'errore è il seguente: anche se inserisco un valore che si trova nella lista, il compilatore mi dice che quel valore non è presente.
/*Ricerca un elemento all'interno di una lista*/ int ricerca_elemento(LISTA *p, double n){ while(p!=NULL){ if(n == p->val) return 1; p=p->next; } return 0; }
Per favore mi potete dare una mano?????
il codice mi pare ok. Non è che non hai inizializzato l'ultimo elemento della lista a puntare a NULL? oppure dove chiami la funzione non consideri che con il valore $1$ vuol dire che l'elemento è contenuto nella lista (son supposizioni...).
se vuoi posso postarti il codice che ho fatto...
Il codice che hai messo non è d'aiuto, in quanto per esperienza, un errore in C puo provenire da diverse parti del codice, e non solo dalla funzione che genera l'errore stesso.
Detto ciò, se devi stampare semplicemente la lista, senza che la inverti "fisicamente", basta che parti dall'ultimo elemento e stampi fino al primo!
Inoltre c'è un errore nelle assegnazione dei vari puntatori:
se noti bene, ultimo è null, e tu ad ogni ciclo fai puntare corrente->next a null, e quindi togli ogni riferimento al successivo elemento, quindi ecco qui perchè stampi solo il primo elemento. Dovresti fare meglio questo pezzo, magari facendoti un disegnetto sulla carta che aiuta molto.
Detto ciò, se devi stampare semplicemente la lista, senza che la inverti "fisicamente", basta che parti dall'ultimo elemento e stampi fino al primo!
Inoltre c'è un errore nelle assegnazione dei vari puntatori:
/*Inverte gli elementi di una lista*/ LISTA* inverti_lista(LISTA *primo){ LISTA *ultimo,*temp,*corrente; corrente=primo; ultimo=temp=NULL; while(corrente!=NULL){ temp=corrente->next; corrente->next=ultimo; ultimo=corrente; corrente=temp; } return ultimo; }
se noti bene, ultimo è null, e tu ad ogni ciclo fai puntare corrente->next a null, e quindi togli ogni riferimento al successivo elemento, quindi ecco qui perchè stampi solo il primo elemento. Dovresti fare meglio questo pezzo, magari facendoti un disegnetto sulla carta che aiuta molto.
Il main da me fatto è il seguente....
Qunado chiamo la funzione ricerca_elemento sbaglio qualcosa???? Comunque grazie del consiglio per quanto riguarda l'altra funzione ora cerco di risolvere.
int main(){ int n,a,i; int n_ele,ele_diversi,n_ele_dispari; double sum_ele,b; double *vet; LISTA *p; vet=(double*)calloc(3,sizeof(double)); vet[0]=vet[1]=vet[2]=0; printf("Quanti elementi si vogliono?\n"); scanf("%d",&n); p=crea_lista(p,n); p=ordina_lista(p); stampa_lista(p); n_ele=conta_elementi(p); n_ele_dispari=elementi_dispari(p); ele_diversi=elementi_diversi(p); sum_ele=somma_elementi(p); max_min_medio(p,vet); printf("\nIl numero di elementi e': %d\n",n_ele); printf("\nIl numero di elementi diversi e': %d\n",ele_diversi); printf("\nIl numero di elementi dispari e': %d\n",n_ele_dispari); printf("\nLa somma degli elementi e': %lf\n",sum_ele); printf("\nIl valore massimo e': %lf\n",vet[0]); printf("\nIl valore minimo e': %lf\n",vet[1]); printf("\nIl valore medio e': %lf\n",vet[2]); printf("\nQuale valore della lista si vuole sapere?\n"); scanf("%d",&i); b=i_esimo_ele(p,i); printf("\nIl valore dell'elemento %d della lista e':%lf",i,b); printf("\nQuale numero vuoi cercare?\n"); scanf("%lf",&a); a=ricerca_elemento(p,a); if(a==1) printf("\nIl numero e' nella lista\n"); else printf("\nIl numero non e' nella lista\n"); inverti_lista(p); stampa_lista(p); printf("\n"); free(vet); elimina_lista(p); system("pause"); return 0; }
Qunado chiamo la funzione ricerca_elemento sbaglio qualcosa???? Comunque grazie del consiglio per quanto riguarda l'altra funzione ora cerco di risolvere.
"fk16":
Il main da me fatto è il seguente....
int main(){ int n,a,i; int n_ele,ele_diversi,n_ele_dispari; double sum_ele,b; double *vet; LISTA *p; vet=(double*)calloc(3,sizeof(double)); vet[0]=vet[1]=vet[2]=0; printf("Quanti elementi si vogliono?\n"); scanf("%d",&n); p=crea_lista(p,n); p=ordina_lista(p); stampa_lista(p); n_ele=conta_elementi(p); n_ele_dispari=elementi_dispari(p); ele_diversi=elementi_diversi(p); sum_ele=somma_elementi(p); max_min_medio(p,vet); printf("\nIl numero di elementi e': %d\n",n_ele); printf("\nIl numero di elementi diversi e': %d\n",ele_diversi); printf("\nIl numero di elementi dispari e': %d\n",n_ele_dispari); printf("\nLa somma degli elementi e': %lf\n",sum_ele); printf("\nIl valore massimo e': %lf\n",vet[0]); printf("\nIl valore minimo e': %lf\n",vet[1]); printf("\nIl valore medio e': %lf\n",vet[2]); printf("\nQuale valore della lista si vuole sapere?\n"); scanf("%d",&i); b=i_esimo_ele(p,i); printf("\nIl valore dell'elemento %d della lista e':%lf",i,b); printf("\nQuale numero vuoi cercare?\n"); scanf("%lf",&a); a=ricerca_elemento(p,a); if(a==1) printf("\nIl numero e' nella lista\n"); else printf("\nIl numero non e' nella lista\n"); inverti_lista(p); stampa_lista(p); printf("\n"); free(vet); elimina_lista(p); system("pause"); return 0; }
Qunado chiamo la funzione ricerca_elemento sbaglio qualcosa???? Comunque grazie del consiglio per quanto riguarda l'altra funzione ora cerco di risolvere.
Ora non vorrei dire una cazzata, ma la prima cosa che noto è che l'elemento che tu passi alla funzione di ricerca è un intero, quello richiesto nella segnatura è un double. Non ricordo se l'uguaglianza tra un double ed un intero si possa fare o meno senza troppi problemi
grazie mille.....il problema era proprio quello =)
"fk16":
grazie mille.....il problema era proprio quello =)
beh scusa, il compilatore non ti dava nessun warning riguardo a questa cosa?
no....mi lasciava compilare senza darmi nessun avvertimento.......e ora che mi ci fai pensare è molto strano....
magari c'hai un compilatore un pò naive che ti maschera i warning

"fk16":
no....mi lasciava compilare senza darmi nessun avvertimento.......e ora che mi ci fai pensare è molto strano....
scommetto tre biscotti secchi che utilizzi Dev-C++

"giozh":
Non ricordo se l'uguaglianza tra un double ed un intero si possa fare o meno senza troppi problemi
E' perfettamente possibile uguagliare un valore intero con uno a virgola mobile in quanto il valore intero viene automaticamente promosso al tipo a virgola fissa. Andrebbe in realtà comunque evitato il confronto diretto tra due double, ma non è questo il problema.
Il problema è piuttosto nella lettura da standard input in cui scanf è indotto a pensare che il puntatore ad a sia in effetti un puntatore a double:
scanf("%lf",&a);
Questo ha due conseguenze:
1. a non contiene il valore voluto;
2. scanf scrive oltre al limite di a (gli interi sono infatti normalmente a 16 o 32 bit a seconda del sistema mentre i double sono a 64bit..).
Ovviamente, qualsiasi compilatore moderno e decente del C dovrebbe verificare il tipo dei valori passati a scanf confrontandoli con quelli contenuti nella stringa.