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| |" ); }

, ma C l'ho iniziato a studiare da un mese...
Rispondi quotando