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++ - problemi con la Cancellazione di un elemento da una lista
Forum - C/C++ - problemi con la Cancellazione di un elemento da una lista

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
salve a tutti sto studiando le liste e non ho capito come faccio a canellare un elemento da una lista, ho provato a scrivere qualcosa ed il massimo che sono riuscito a fare è questo,

Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct list_t {
  5.  
  6.         char parola[10];
  7.         int numero;
  8.         struct list_t *next;
  9. };
  10.  
  11. typedef struct list_t list_t;
  12.  
  13. int main (int argc, char **argv){
  14.         int i =0;
  15.  
  16.         list_t *nuova_lista, *head, *delete;
  17.        
  18.         nuova_lista = (list_t *)malloc(sizeof(list_t));
  19.        
  20.         head = nuova_lista;
  21.         delete = head; 
  22.         for (i=0; i<4; i++){
  23.                 printf("Inserisci char e int\n");
  24.                 scanf("%s", nuova_lista -> parola);
  25.                 scanf("%d", &nuova_lista -> numero);
  26.                 nuova_lista -> next = (list_t *)malloc(sizeof(list_t));
  27.                 nuova_lista = nuova_lista ->next;
  28.         }
  29.         nuova_lista -> next = NULL;
  30.  
  31.        
  32.         while(delete != NULL ){
  33.                 if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
  34.                 free(delete -> next);
  35.                 delete -> next = delete -> next -> next;
  36.                 }
  37.                 delete = delete -> next;       
  38.        
  39.         }
  40.        
  41.        
  42.         printf("******************************************\n");
  43.         while(head -> next != NULL){
  44.                 printf("char: %s, int: %d\n", head -> parola, head -> numero);
  45.                 head = head -> next;
  46.         }
  47. }



con questo codice quando nell'inserimento scrivo giovanni 20
lui mi cancella l'elemento successivo!!... :d:d
:hail:vi prego aiutatemiiiii....

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:09
Venerdì, 11/06/2010
Codice sorgente - presumibilmente C/C++

  1. while(delete != NULL ){
  2.         if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
  3.         free(delete -> next);
  4.         delete -> next = delete -> next -> next;
  5.         }
  6.         delete = delete -> next;    
  7.    
  8.     }



il codice incriminato è questo, se è una single linked list (ovvero a scorrimento forward only), devi scorrere gli elementi controllando se il successivo dell'elemento corrente è l'elemento da cancellare. Se lo è, prima di chiamare la free, ti salvi il next di quello da eliminare e lo assegni come next dell'elemento corrente, poi chiami la free.

:)

Ultima modifica effettuata da HeDo il 11/06/2010 alle 18:21
PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 18:55
Venerdì, 11/06/2010
ciao!!!

Inoltre, secondo me, ci sono altri piccoli errori, infatti così come l'hai strutturato nel ciclo for allochi l'ultimo elemento senza utilizzarlo...
Inoltre nella cancellazione dovresti considerare come caso a parte il caso in cui l'elemento da eliminare si trova in testa...

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:09
Sabato, 12/06/2010
Sisi infatti ancora sono poco esperiente con queste liste, e tra qualche settimana ho l'esame all'università... speriamo in bene!.. Comunque ragazzi grazie per il vostro aiuto userò i vostri suggerimenti per modificare il mio codice se ho altri prblemi vi disturberò nuovamente :D

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 12:12
Sabato, 12/06/2010
Ecco qui il codice per a cancellazione adesso funzionante, voi cosa ne pensate?? va bene??

Codice sorgente - presumibilmente C/C++

  1. if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
  2.                 head = delete -> next;
  3.                 free(delete);
  4.         }else {
  5.                 delete = delete -> next;
  6.                
  7.                 while(delete != NULL){
  8.                         if(strcmp(delete -> parola, "giovanni")==0 && delete -> numero == 20){
  9.                                 free(delete1 -> next);
  10.  
  11.                         delete1 -> next = delete1 -> next -> next;
  12.                         }
  13.                         delete = delete -> next;
  14.                         delete1 = delete1 -> next;
  15.                 }
  16.         }


PM Quote
Avatar
Premoli (Normal User)
Pro


Messaggi: 108
Iscritto: 25/06/2009

Segnala al moderatore
Postato alle 15:32
Sabato, 12/06/2010
e se un utente inserisse per due volte giovanni 20?

inoltre, se posso, vorrei darti un altro consiglio, evita di scrivere tutto nel main piuttosto crea una funzione per l'inserimento e una per la cancellazione...

Ultima modifica effettuata da Premoli il 12/06/2010 alle 15:34
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 11:23
Sabato, 19/06/2010
Ecco qui tutto il codice sistemato in funzioni, compilandolo funziona :) però lo voglio pubblicare per sapere da voi se è un buon codice cosi scritto!..

Codice sorgente - presumibilmente C++

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. struct list_t {
  5.  
  6.         char parola[10];
  7.         int numero;
  8.         struct list_t *next;
  9. };
  10.  
  11. typedef struct list_t list_t;
  12.  
  13. list_t *
  14. create_list_n (list_t *head, int n);
  15.  
  16. void
  17. print_list(list_t *head_list);
  18.  
  19. list_t*
  20. delete_list(list_t *head);
  21.  
  22. int main (int argc, char **argv){
  23.  
  24.         list_t *head;  
  25.         int num;
  26.  
  27.         if(argc == 2){
  28.  
  29.                 num = atoi(argv[1]);
  30.        
  31.                 head = create_list_n(head, num);
  32.  
  33.                 print_list(head);
  34.                 head = delete_list(head);
  35.                 print_list(head);
  36.         }
  37.         else{
  38.                 printf("inserisci il numero nella riga di comando\n");
  39.         }
  40. }
  41.  
  42. list_t *
  43. create_list_n (list_t *head, int n){
  44.         int i;
  45.         list_t *tail;
  46.        
  47.         if(head){
  48.                 head = (list_t *)malloc(sizeof(list_t));
  49.                 tail = head;
  50.                 printf("char int\n");
  51.                 scanf("%s", head -> parola);
  52.                 scanf("%d", &head -> numero);
  53.  
  54.                 for(i=0; i<n-1; i++){
  55.                         tail -> next = (list_t *)malloc(sizeof(list_t));
  56.                         tail = tail -> next;
  57.  
  58.                         printf("char int\n");
  59.                         scanf("%s", tail -> parola);
  60.                         scanf("%d", &tail -> numero);
  61.                        
  62.                 }      
  63.                         tail -> next = NULL;           
  64.         }
  65.                 return head;
  66. }
  67.  
  68. void
  69. print_list(list_t *head){
  70.        
  71.         while(head){
  72.                
  73.                 printf("char: %s, int: %d,\n", head -> parola, head -> numero);
  74.                 head = head -> next;
  75.         }
  76. }
  77.  
  78. list_t*
  79. delete_list(list_t *head){
  80.         list_t *prev, *nex;
  81.         int temp;
  82.         prev = head;
  83.         nex = head;
  84.  
  85.         printf("inserisci cosa cancellare dal numero\n");
  86.         scanf("%d", &temp);
  87.  
  88.         if(nex -> numero == temp){
  89.                 return nex = nex -> next;      
  90.                 free(nex);
  91.         }else{
  92.                 nex = nex -> next;
  93.                 while(nex){
  94.                         if(nex -> numero == temp){
  95.                                 free(prev -> next);
  96.                                 prev ->next = prev -> next -> next;
  97.                                 return head;
  98.                                 }
  99.                                 prev = prev -> next;
  100.                                 nex = nex -> next;                                             
  101.                 }
  102.         }
  103. }


PM Quote