Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Cancellazione Lista Linkata
Forum - C/C++ - Cancellazione Lista Linkata

Avatar
uranio (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/12/2008

Segnala al moderatore
Postato alle 20:07
Mercoledì, 03/12/2008
Ciao a tutti, sto provando a implementare le funzioni di una lista linkata, però non so come procedere con la funzione di cancellazione di tutta la lista(void destroy(element * h) ), spero che voi possiate aiutarmi :) grazie in anticipo!!:k:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct element {
  5.         int info;                  /* valore dell’elemento */
  6.         struct element* next;  /* indirizzo del prossimo elemento */
  7. };
  8.  
  9. typedef struct element element; //consente di usare il tipo element come sinonimo del tipo struct element.
  10.  
  11. element* insert(element* list, int n);
  12. element* find(element* list, int n);
  13. void print_list(element* h);
  14. element* delete(element* h, int n);
  15.  
  16. void destroy(element* h);
  17.  
  18. int conta; // variabile globale
  19.  
  20. int main (void){
  21.         char c;
  22.         int n, count=0;
  23.         element* head;
  24.         element* prova;
  25.         head= NULL;
  26.         prova= NULL;
  27.        
  28.        
  29.         while( ( c = getchar ()) != 'f' ){      /* c e’ il prossimo carattere letto da standard input Il ciclo termina quando c e’ il carattere ’f’ */
  30.                 switch(c){
  31.                         case '+':
  32.                                 c++;
  33.                                 scanf("%d", &n);
  34.                                 if( (find(head,n) )== NULL ){  
  35.                                 head= insert(head, n); 
  36.                                
  37.                                 }                      
  38.                         break;
  39.                        
  40.                         case '?':
  41.                                 c++;
  42.                                 scanf("%d", &n);
  43.                                 prova= find(head, n);
  44.                                 if(prova != NULL){
  45.                                         printf("trovato\n");                                   
  46.                                 }       else printf("non trovato \n");                         
  47.                         break;
  48.                        
  49.                         case '-':
  50.                                 c++;
  51.                                 scanf("%d", &n);
  52.                                
  53.                                 head= delete(head, n);
  54.                                
  55.                        
  56.                         break;
  57.                        
  58.                         case 'c':
  59.                                 printf("numero elementi lista: %d\n", conta);
  60.                         break;
  61.                        
  62.                         case 'p':
  63.                                 print_list(head);
  64.                         break;
  65.                        
  66.                         case 'd':
  67.                                 //printf("%d\n", head->info);
  68.                                 destroy(head);
  69.                         break;
  70.                 }
  71.         }
  72.        
  73.         //printf("ciao\n");
  74.         return 0;
  75. }
  76.  
  77. element* insert(element* list, int n){
  78.         element *new_node;
  79.         new_node= malloc(sizeof(element));
  80.        
  81.         if(new_node == NULL){
  82.                 exit(EXIT_FAILURE);
  83.         }
  84.         new_node -> info = n;
  85.         new_node -> next = list;
  86.        
  87.         conta++;
  88.         return new_node;
  89.  
  90. }
  91.  
  92. element* find(element* list, int n){
  93.         while( list != NULL && list -> info != n){
  94.                 list= list -> next;
  95.         }              
  96.         return list;
  97.                
  98.        
  99. }
  100.  
  101. void print_list(element* h){
  102.         int n; 
  103.         element *elemento;
  104.         elemento= h;   
  105.         while( elemento != NULL ){
  106.                 n= elemento ->info;            
  107.                 printf("n: %d\n", n);
  108.                 elemento= elemento -> next;
  109.         }
  110. }
  111.  
  112. element* delete(element* h, int n){
  113.         element *prev, *curr;
  114.        
  115.         for(curr= h, prev= NULL; curr !=NULL; prev= curr, curr= curr -> next)
  116.                 if(curr -> info == n) break;
  117.                
  118.         if(curr == NULL)  //se non ho trovato niente   
  119.                 return h;
  120.        
  121.         if(prev == NULL)        h = h -> next;
  122.        
  123.         else    prev -> next = curr -> next;
  124.        
  125.  
  126.         free(curr);
  127.        
  128.         conta--;
  129.  
  130.         return h;
  131. }
  132.  
  133. void destroy(element* h){
  134.        
  135.         element *curr,*prev;
  136.        
  137.         while( h != NULL ){
  138.                 h = delete(h, h -> info);
  139.                 h= h -> next;  
  140.         }
  141.  
  142. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 22:07
Mercoledì, 03/12/2008
E per adesso che errore ti da?


Il mio blog: https://piero.dev
PM Quote
Avatar
uranio (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/12/2008

Segnala al moderatore
Postato alle 22:55
Mercoledì, 03/12/2008
ciao, grazie di aver risposto :), per ora non da errore ma non cancella, ad esempio se inserisco 3 elementi, nell'ultima posizione mette 0 poi nelle altre dei valori che mi sembrano siano degli indirizzi di memoria.  :-?

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:13
Giovedì, 04/12/2008
Assumendo che il resto del codice funzioni (cosa che non ho testato), si potrebbe fare qualcosa del genere:

Codice sorgente - presumibilmente C/C++

  1. void destroy(element* h){
  2.     if (h == null) return; //Fine
  3.  
  4.     element *next = h->next;
  5.     delete(h, h->info);
  6.     destroy(next);
  7. }



E poi passare a destroy il primo elemento della lista.


Il mio blog: https://piero.dev
PM Quote
Avatar
uranio (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/12/2008

Segnala al moderatore
Postato alle 20:46
Giovedì, 04/12/2008
Ciao, grazie ancora dell'aiuto ,comunque il resto del codice sembra funzionare il problema è questa funzione :d:d in teoria il tuo codice dovrebbe essere corretto anche perché la funzione delete singolarmente funziona, invece se richiamata da destroy mi da in output  
Codice sorgente - presumibilmente Plain Text

  1. +1+2+3       // +1 = insert(element *list, 1)..
  2. p            // stampa
  3. n: 3
  4. n: 2
  5. n: 1
  6. -2            //delete(element* h, 2)
  7. p
  8. n: 3
  9. n: 1
  10. d             //void destroy(element *h)
  11. p
  12. n: 134520848
  13. n: 134520864



che se non sbaglio sono indirizzi di memoria vero? :(

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 9:13
Venerdì, 05/12/2008
Ma hai provato a modificare il codice provando a scrivere una funzione come quella che ti ho indicato?


Il mio blog: https://piero.dev
PM Quote
Avatar
uranio (Normal User)
Newbie


Messaggi: 4
Iscritto: 03/12/2008

Segnala al moderatore
Postato alle 18:54
Sabato, 06/12/2008
si, utilizzando la tu funzione ottengo l'output che ho postato :d, la cosa strana è che la funzione delete funziona se chiamata da singoli elementi invece con la ricorsione non va...:(, ciao e grazie

Ultima modifica effettuata da uranio il 06/12/2008 alle 18:55
PM Quote