fionda08 (Normal User)
Newbie
Messaggi: 3
Iscritto: 22/09/2010
|
Salve a tutti io ho un problema con la cancellazione del primo elemento di una lista qst e il codice:
****************************
Codice sorgente - presumibilmente C++ |
#include <stdio.h> #include <stdlib.h> #include <string.h> struct info{ char nome[10]; int numero; struct info *next; }; typedef struct info info; void inserisci(info *p); void stampa(info *p); void cancella(info *p); int main (int argc,char **argv){ info *p ,*head; p=(info*)malloc(sizeof(info)); head=p; inserisci (p); stampa(head); cancella (head); stampa(head); } void inserisci(info *p){ int i; printf("inserisci nome\n"); for(i=0;i<3;i++){ scanf("%s %d",p->nome,&p->numero); if(i<2){ p->next=(info*)malloc(sizeof(info)); p=p->next; } } } void stampa(info *p){ printf("*******\n"); while(p!=NULL){ printf("%s %d\n",p->nome,p->numero); p=p->next; } } void cancella(info *p){ char temp[10]; info *t; printf("inserisci nome da cancellare \n"); scanf("%s",temp); if(strcmp(temp,p->nome)==0){ t=p; p=p->next; free(t); } }
|
*******************************
e se per esempio inserisco
marco 1
giovanni 2
luca 3
e voglio eliminare naturalmente solo il primo
qst e il risutato
1
giovanni 2
luca 3
HELP!! ps sono sotto Linux potrebbe esservi d'aiuto
grazie in aticipo
Ultima modifica effettuata da Il Totem il 23/09/2010 alle 13:06 |
|
giuseppe93 (Ex-Member)
Pro
Messaggi: 166
Iscritto: 02/08/2009
|
ciao! prova a fare una funzione di tipo info che restitiusca la nuova base, qualcosa del tipo
Codice sorgente - presumibilmente C/C++ |
info * nuova_testa(info *testa){
return testa->next;}
|
e poi nella funzione cancella se verifichi che devi cancellare la base fai
Codice sorgente - presumibilmente Plain Text |
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
Postato originariamente da fionda08:
Salve a tutti io ho un problema con la cancellazione del primo elemento di una lista qst e il codice:
[...]
void cancella(info *p){
char temp[10];
info *t;
printf("inserisci nome da cancellare \n");
scanf("%s",temp);
if(strcmp(temp,p->nome)==0){
t=p;
p=p->next;
free(t);
}
}
[...]
|
Salve, l'errore sta nella definizione della funzione cancella, il modo in cui il puntatore viene passato fa si che la modifica non venga esportata al di fuori di essa. la definizione deve essere:
void cancella(info **p)
Ciao.
P.S.
in futuro sarebbe opportuno che tu usassi i tag Code per includere del codice sorgente.
Ciao. |
|
fionda08 (Normal User)
Newbie
Messaggi: 3
Iscritto: 22/09/2010
|
ciao gigisoft ho fatto come hai detto tu
Codice sorgente - presumibilmente C/C++ |
[...]
void cancella(info **p){
char temp[10];
info *t;
printf("inserisci nome da cancellare \n");
scanf("%s",temp);
if(strcmp(temp,p->nome)==0){
t=p;
p=p->next;
free(t);
}
}
[...]
|
ma mi da il seguente errore quando compilo
Codice sorgente - presumibilmente Delphi |
test.c: In function ‘main’: test.c:27: warning: passing argument 1 of ‘cancella’ from incompatible pointer type test.c:17: note: expected ‘struct info **’ but argument is of type ‘struct info *’ test.c: In function ‘cancella’: test.c:65: error: request for member ‘nome’ in something not a structure or union test.c:66: warning: assignment from incompatible pointer type test.c:67: error: request for member ‘next’ in something not a structure or union make: *** [test] Errore 1
|
come mai e aggiungo se puoi anche se puoi darmi una breve spiegazione su questo **info cke sinceramente non l'ho capito molto... grazie della tua disponibilita |
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Tu elimini l'elemento, ma la testa rimane sempre la stessa. Quindi è logico che visualizzi un elemento vuoto.
Le soluzioni sono due. O dichiari la funzione in modo che restituisca la nuova testa:
Codice sorgente - presumibilmente Plain Text |
e in questo caso devi aggiungere una return:
Codice sorgente - presumibilmente C/C++ |
if(strcmp(temp,p->nome)==0){
t=p;
p=p->next;
free(t);
return p;
}
|
oppure fai come ha detto gigisof e usi un puntatore doppio:
Codice sorgente - presumibilmente C/C++ |
Se usi quest'ultimo metodo, devi modificare la chiamata a funzione:
Codice sorgente - presumibilmente Plain Text |
e di conseguenza anche il codice di cancella
Codice sorgente - presumibilmente Plain Text |
if(strcmp(temp,p->nome)==0){
t=p;
*p=(*p)->next;
free(t);
}
|
|
|
fionda08 (Normal User)
Newbie
Messaggi: 3
Iscritto: 22/09/2010
|
qst funziona alla grande...
Codice sorgente - presumibilmente C/C++ |
void cancella(info *p,bau **h){
bau *temp;
temp=p;
char nomdel[20];
printf("Inserire nome da eliminare: ");
scanf("%s", nomdel);
if(strcmp(nomdel,p->nome)==0){
temp=p->next;
free(p);
*h=temp;
}
while (p->next!=NULL){
temp=p->next;
if(strcmp(nomdel, temp->nome)==0){
p->next=temp->next;
}
p=p->next;}}
|
qst codice me l'ha dato un mio amico... sapete spiegarmi pero all'interno del while come funziona?!?
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Penso che quel while salti tutti gli elementi uguali (con nome uguale). Però non vengono liberati, manca la free. A questo punto sarebbe meglio riscrivere tutto in modo migliore: il tuo codice controllava solo il primo elemento, e pensavo fosse fatto apposta per comportarsi così, ma vedendo questo non ne sono più tanto convinto.
|
|