Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - cancellazione primo elemento di una lista
Forum - C/C++ - cancellazione primo elemento di una lista

Avatar
fionda08 (Normal User)
Newbie


Messaggi: 3
Iscritto: 22/09/2010

Segnala al moderatore
Postato alle 13:07
Mercoledì, 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++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. struct info{
  6.         char nome[10];
  7.         int numero;
  8.         struct info *next;
  9. };
  10.  
  11. typedef struct info info;
  12.  
  13. void inserisci(info *p);
  14.  
  15. void stampa(info *p);
  16.  
  17. void cancella(info *p);
  18.  
  19. int main (int argc,char **argv){
  20.        
  21.         info *p ,*head;
  22.         p=(info*)malloc(sizeof(info));
  23.         head=p;
  24.  
  25.         inserisci (p);
  26.         stampa(head);
  27.         cancella (head);
  28.         stampa(head);
  29.        
  30. }
  31.  
  32.  
  33. void inserisci(info *p){
  34.  
  35.         int i;
  36.  
  37.         printf("inserisci nome\n");
  38.         for(i=0;i<3;i++){
  39.  
  40.                 scanf("%s %d",p->nome,&p->numero);
  41.                
  42.                 if(i<2){
  43.                         p->next=(info*)malloc(sizeof(info));
  44.                         p=p->next;
  45.                 }
  46.         }
  47. }
  48.  
  49. void stampa(info *p){
  50.        
  51.         printf("*******\n");
  52.         while(p!=NULL){
  53.                 printf("%s %d\n",p->nome,p->numero);
  54.                 p=p->next;
  55.         }
  56. }
  57.  
  58. void cancella(info *p){
  59.        
  60.         char temp[10];
  61.         info *t;
  62.         printf("inserisci nome da cancellare \n");
  63.         scanf("%s",temp);
  64.        
  65.         if(strcmp(temp,p->nome)==0){
  66.                 t=p;
  67.                 p=p->next;
  68.                 free(t);
  69.         }              
  70. }


*******************************
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:k:

Ultima modifica effettuata da Il Totem il 23/09/2010 alle 13:06


fionda08
PM Quote
Avatar
giuseppe93 (Ex-Member)
Pro


Messaggi: 166
Iscritto: 02/08/2009

Segnala al moderatore
Postato alle 20:07
Mercoledì, 22/09/2010
ciao! prova a fare una funzione di tipo info che restitiusca la nuova base, qualcosa del tipo
Codice sorgente - presumibilmente C/C++

  1. info * nuova_testa(info *testa){
  2. return testa->next;}


e poi nella funzione cancella se verifichi che devi cancellare la base fai
Codice sorgente - presumibilmente Plain Text

  1. p=nuova_testa(p);



:)
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 8:43
Giovedì, 23/09/2010
Testo quotato

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.


Le cose si fanno per bene o non si fanno affatto
PM Quote
Avatar
fionda08 (Normal User)
Newbie


Messaggi: 3
Iscritto: 22/09/2010

Segnala al moderatore
Postato alle 10:36
Giovedì, 23/09/2010
ciao gigisoft ho fatto come hai detto tu
Codice sorgente - presumibilmente C/C++

  1. [...]
  2.  
  3. void cancella(info **p){
  4.    
  5.     char temp[10];
  6.     info *t;
  7.     printf("inserisci nome da cancellare \n");
  8.     scanf("%s",temp);
  9.    
  10.     if(strcmp(temp,p->nome)==0){
  11.         t=p;
  12.         p=p->next;
  13.         free(t);
  14.     }        
  15. }
  16. [...]



ma mi da il seguente errore quando compilo
Codice sorgente - presumibilmente Delphi

  1. test.c: In function ‘main’:
  2. test.c:27: warning: passing argument 1 of ‘cancella’ from incompatible pointer type
  3. test.c:17: note: expected ‘struct info **’ but argument is of type ‘struct info *
  4. test.c: In function ‘cancella’:
  5. test.c:65: error: request for member ‘nome’ in something not a structure or union
  6. test.c:66: warning: assignment from incompatible pointer type
  7. test.c:67: error: request for member ‘next’ in something not a structure or union
  8. 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


fionda08
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 13:13
Giovedì, 23/09/2010
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

  1. info* cancella(info *p)


e in questo caso devi aggiungere una return:
Codice sorgente - presumibilmente C/C++

  1. if(strcmp(temp,p->nome)==0){
  2.         t=p;
  3.         p=p->next;
  4.         free(t);
  5.         return p;
  6. }


oppure fai come ha detto gigisof e usi un puntatore doppio:
Codice sorgente - presumibilmente C/C++

  1. void cancella(info **p)


Se usi quest'ultimo metodo, devi modificare la chiamata a funzione:
Codice sorgente - presumibilmente Plain Text

  1. cancella(&head);


e di conseguenza anche il codice di cancella
Codice sorgente - presumibilmente Plain Text

  1. if(strcmp(temp,p->nome)==0){
  2.         t=p;
  3.         *p=(*p)->next;
  4.         free(t);
  5. }



"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
fionda08 (Normal User)
Newbie


Messaggi: 3
Iscritto: 22/09/2010

Segnala al moderatore
Postato alle 14:49
Giovedì, 23/09/2010
qst funziona alla grande...
Codice sorgente - presumibilmente C/C++

  1. void cancella(info *p,bau **h){
  2. bau *temp;
  3. temp=p;
  4. char nomdel[20];
  5. printf("Inserire nome da eliminare: ");
  6. scanf("%s", nomdel);
  7. if(strcmp(nomdel,p->nome)==0){
  8. temp=p->next;
  9. free(p);
  10. *h=temp;
  11. }
  12.  
  13.  
  14. while (p->next!=NULL){
  15. temp=p->next;
  16.  
  17. if(strcmp(nomdel, temp->nome)==0){
  18.  
  19. p->next=temp->next;
  20. }
  21. p=p->next;}}



qst codice me l'ha dato un mio amico... sapete spiegarmi pero all'interno del while come funziona?!?


fionda08
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:16
Venerdì, 24/09/2010
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.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote