Ciao,

dovrei creare una rubrica telefonica utilizzando le liste dinamiche...

il problema è che la parte relativa alla cancellazione di un elemento della lista non mi vuole assolutamente funzionare...

scusatemi se è già stato postato da qualche parte, ma mi son letto tutti i post sulle liste senza trovare niente di utile...

teoricamente mi sembra corretto, ma in pratica non funziona


Vi posto il codice che fino ad ora ho scritto, provate a cancellare un elemento selezionandolo per nome, perchè a me proprio non va...

le funzioni interessate sono

struct node * delete_node ( struct node * current_node );
void delete_element ( struct node * current_node );

grazie!

e scusatemi se sono proprio un , ma C l'ho iniziato a studiare da un mese...

codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/* Define boolean Type */

typedef enum { false, true } boolean;

/* Definisco i campi che dovrà memorizzare la mia rubrica per ogni contatto */

typedef struct {
    
    int id;
    char nome[50];
    char cognome[50];
    char telefono[14];
    char citta[20];
    char email[50];
    char indirizzo[20];
   

} contatto;

/* Definisco il singolo elemento della rubrica */

struct node {
    
     contatto content;
     struct node * next_node;
    
};

/* Creo la rubrica e la inizializzo */

struct node * rubrica = NULL;


/* Prototipi funzioni */

struct node * add_contact( struct node * current_node );

struct node * delete_node ( struct node * current_node );
void delete_element ( struct node * current_node );

void show_contact( struct node * current_node );


contatto get_data( void );

/* Prototipi Procedures // GUI */

void gui_table_line () ;
void gui_table_space () ;
void print_element ( contatto contatto_temp );
void print_delete_menu ();

/* Prototipi funzioni // STRINGHE */
boolean string_compare( char * s1, char * s2 );




/* Variabili globali */

int contact_counter = 0;
    


/* Rubrica */

int main() {
   
 int i; 


 /* Inserisco 3 valori per vedere se mi funziona la cancellazione in seguito... */
 for ( i=0; i<2; i++ ) {
     
      rubrica = add_contact( rubrica );    

 } 
 

 show_contact( rubrica );
 

 delete_element( rubrica ); 
 
 show_contact( rubrica );

 getch();
 
 return 0;

}






/* Raccogli dati per inserimento/modifica */

contatto get_data () {
    
    contatto contatto_temp;
    
    contatto_temp.id = contact_counter;
    
    contact_counter++;
    
    printf ( "\n\nSTEP 1: Inserire il nome del contatto\n>>");
    gets ( contatto_temp.nome );
    
    printf ( "\nSTEP 2: Inserire il cognome\n>>");
    gets ( contatto_temp.cognome );
    
    printf ( "\nSTEP 3: Inserire il numero telefonico\n>>");
    gets ( contatto_temp.telefono );
    
    printf ( "\nSTEP 4: Inserire l'indirizzo\n>>");
    gets ( contatto_temp.indirizzo );
    
    printf ( "\nSTEP 5: Inserire la citta'\n>>");
    gets ( contatto_temp.citta );
    
    printf ( "\nSTEP 6: Inserire l'indirizzo email\n>>");
    gets ( contatto_temp.email );
    
    return contatto_temp;
    
}    

/* Aggiungi node alla rubrica. L'elemento è aggiunto in testa. */

struct node * add_contact( struct node * current_node ) {
       
    struct node *temp_node;   
       
    contatto contatto_temp;
    
    
    
    /* Acquisisco i dati da tastiera e li salvo in una struttura temporanea */
        
    contatto_temp = get_data();
    
    /* Alloco la memoria per il nuovo node da inserire in rubrica */
    
    temp_node = malloc( sizeof ( struct node ) );
        
    temp_node->content = contatto_temp;
        
    
    /* Aggiungo i riferimenti all'elemeno successivo */
    
    temp_node->next_node = current_node;

    return temp_node;   
    
}   


/* Visualizza elementi presenti in rubrica */

void show_contact( struct node *current_node ) { 
    
    
     while ( current_node != NULL ) {
         
         print_element ( current_node->content );

         current_node = current_node->next_node;
         
         
     }    
         
}   

/* Cancella un node */

void delete_element ( struct node * current_node ) {
   
   /* Cursore ricerca */ 
   struct node * temp_node;
   
   
   /* Variabile contenente codice operazione */
   char action;       
   
   /* Variabile di conferma operazioni -> Contiene Y (true) o N (false) */
   char confirm;     
   
   /* Contatore cancellazioni eseguite */
   int counter = 0;  
   
   /* Variabile temporanee per confrontare stringhe */
   char stringa_temp[50];
   char stringa_temp_current_node[50];
   
   
   
   
   /* Menu di selezione */
   print_delete_menu ();
    
    
    
   /* Acquisisci operazione da effettuare */
   printf ( "\n\n>" );
   scanf ( "%c%*c" , &action );
   
   switch ( action ) {
       
          /* CANCELLA PER NOME */
       
          case '1' :
              
              /* Acquisisci il nome da ricercare e cancellare */
              printf ( "\n\n NOME >" );
              gets( stringa_temp );
              
              
              /* Conferma cancellazione */
              printf ( "\n\nSei sicuro di cancellare dalla rubrica tutti gli elementi contenenti %s nel campo nome? [Y/N] >" , stringa_temp);
              scanf ( "%c%*c" , &confirm );
              
              confirm = tolower( confirm );
              
              if ( confirm != 'y' )   break;
              
              
              /* Scorri current_node e cancella elementi corrispondenti */  
              
              while ( current_node != NULL ) {
                   
                   /* Assegna il campo da confrontare nella current_node alla stringa temporanea */
                   strcpy( stringa_temp_current_node , current_node->content.nome );     
                   
                   
                   /* Confronta e cancella se positivo */
                   if ( string_compare( stringa_temp , stringa_temp_current_node ) ) {
                      
                          
                      current_node = delete_node ( current_node );
                                             
                       
                      
                   } else {
                      
                       current_node = current_node->next_node;    
                     
                   }    
                   
                
                  
              }    
               
              printf ( "\n Eseguite %d cancellazioni...Premere un tasto per continuare" , counter );
              
              
          break;    
           
       
   }   
   

}

/* Cancella un node, riassegna gli indirizzi e libera la memoria allocata non più utilizzata */

struct node * delete_node ( struct node * current_node ) {
       
   struct node * temp_node;
       
   temp_node = current_node->next_node;
   
   free ( current_node );
   
   return temp_node;

}

/* STRING FUNCTIONS */


boolean string_compare( char * s1, char * s2 ) {

    if ( strcasecmp( s1, s2 ) )

        return false;

    else

        return true;
    

}


/* GUI ELEMENTS */


/* Stampa il menu per cancellare elementi  */

void print_delete_menu () {
    
    
    gui_table_line ();
    
    gui_table_space ();
    
    printf ( "\n|          SELEZIONA ELEMENTO DA CANCELLARE PER:            |" );
    
    gui_table_space ();
    
    gui_table_line ();
    
    gui_table_space ();
    
    printf ( "\n|  1. NOME                                                  |" );
    printf ( "\n|  2. COGNOME                                               |" );
    printf ( "\n|  3. ID                                                    |" );
    printf ( "\n|  4. NUMERO TELEFONO                                       |" );
    
    gui_table_space ();
    
    gui_table_line ();
    
    
}

/* Stampa un contatto a schermo */

void print_element ( contatto contatto_temp ) {
    
    gui_table_line ();
    
    gui_table_space ();
    printf ( "\n|                  CONTATTO %d                               " , contatto_temp.id);
    gui_table_space ();
    
    gui_table_line ();
    
    gui_table_space ();
    printf ( "\n                  |" );
    printf ( "\n Cognome:         |    %s  " , contatto_temp.cognome);
    printf ( "\n Nome:            |    %s  " , contatto_temp.nome);
    printf ( "\n Telefono:        |    %s  " , contatto_temp.telefono);
    printf ( "\n Indirizzo:       |    %s  " , contatto_temp.indirizzo);
    printf ( "\n Città:           |    %s  " , contatto_temp.citta);
    printf ( "\n Email:           |    %s  " , contatto_temp.email);
    printf ( "\n                  |" );
    gui_table_space ();
    
    gui_table_line ();   

} 


/* Stampa una linea per le tabelle */

void gui_table_line () {
    
     printf ( "\n+-----------------------------------------------------------+" );   

}

/* Stampa una linea vuota con bordi per le tabelle */

void gui_table_space () {
    
     printf ( "\n|                                                           |" );   

}