Salve ragazzi, è il mio post su questo forum, sto lavorando ad un esercizio che richiede l'implementazione di un albero di liste, ma credo che ci sia qualcosa di sbagliato nell'inserimento. Ad ogni nuovo inserimento da tastiera sovrascrive il nodo precedentemente inserito, qualcuno sa dirmi perché?
Grazie in anticipo!
p.s.: Ci sono alcuni punti non ancora sviluppati, ma vorrei risolvere questo problema prima di andare avanti.
#define _CRT_SECURE_NO_WARNINGS
#define SUCCES_FILE " SALVATAGGIO SU FILE EFFETTUATO CON SUCCESSO!\n\n"
#define ERROR_FILE " ERRORE: IMPOSSIBILE APRIRE IL FILE!\n\n"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct s_tributi{
int data_scadenza;
float valore;
char descrizione[35];
char pagato[3];
}t_tributi;
typedef struct s_nodo_lista_tributi{
t_tributi inf;
struct s_lista_tributi *next;
}t_nodo_lista_tributi;
//Funzioni lista
typedef t_nodo_lista_tributi * t_lista_tributi;
void inserimento_tributi(t_lista_tributi *pl, t_tributi p);
void stampa_tributi(t_lista_tributi l);
typedef struct s_contribuenti{
char cognome[35];
char nome[35];
char cod_fis[17];
int data_nascita;
}t_contribuenti;
typedef struct s_nodo_albero_contribuenti{
t_contribuenti inf;
t_lista_tributi inf2;
struct s_nodo_albero_contribuenti *alb_sin;
struct s_nodo_albero_contribuenti *alb_des;
}t_nodo_albero_contribuenti;
//Funzioni albero
typedef t_nodo_albero_contribuenti * t_albero_contribuenti;
void inserimento_albero(t_albero_contribuenti *pl, t_contribuenti p);
void stampa_contribuenti(t_albero_contribuenti a);
void salva_contribuenti(t_albero_contribuenti a, FILE *file);
void salva_tributi(t_albero_contribuenti l, FILE *file);
t_nodo_albero_contribuenti * cerca_contribuenti(t_albero_contribuenti a, t_contribuenti p);
void carica_contribuenti(t_albero_contribuenti *pl, FILE *file);
int main(void){
t_lista_tributi lista_tributi = NULL;
t_tributi tributi;
t_albero_contribuenti albero_contribuenti = NULL;
albero_contribuenti = NULL;
t_contribuenti contribuenti;
FILE *file = NULL;
int scelta;
char pausa;
do{
system("cls");
printf(" >> MENU\n\n");
printf(" 1. Stampa struttura dati.\n");//
printf(" 2. Carica da file.\n");
printf(" 3. Inserisci nuovo contribuente.\n");//
printf(" 4. Inserisci nuovo tributo.\n");//
printf(" 5. Stampa elenco tributi scaduti.\n");
printf(" 6. Salvataggio su file.\n");
printf(" 7. Cancellazione di tutti i tributi pagati.\n");
printf(" 0. Per uscire.\n\n");
printf(" >> ");
scanf("%d", &scelta);
switch (scelta)
{
default:
break;
case 1:
system("cls");
printf(" >> STRUTTURA DATI.\n\n");
stampa_contribuenti(albero_contribuenti);
printf(" >> Premere un tasto per continuare . . . ");
scanf("%c%c", &pausa, &pausa);
break;
case 2:
file = fopen("Contribuenti.txt", "r");
if (file == NULL){
printf(ERROR_FILE);
break;
}
else{
carica_contribuenti(&albero_contribuenti, file);
fclose(file);
printf(SUCCES_FILE);
}
break;
case 3:
system("cls");
printf(" >> INSERIMENTO CONTRIBUENTE.\n\n");
printf(" Cognome: ");
scanf("%s", contribuenti.cognome);
printf(" Nome: ");
scanf("%s", contribuenti.nome);
printf(" Codice fiscale: ");
scanf("%s", contribuenti.cod_fis);
printf(" Data di nascita: ");
scanf("%d", &contribuenti.data_nascita);
inserimento_albero(&albero_contribuenti, contribuenti);
printf("\n\n >> INSERIMENTO AVVENUTO CON SUCCESSO.\n\n");
printf(" >> Premere un tasto per continuare . . . ");
scanf("%c%c", &pausa, &pausa);
break;
case 4:
system("cls");
printf(" >> INSERIMENTO TRIBUTO.\n\n");
printf(" Codice fiscale dell'utente a cui assegnare il tributo: ");
scanf("%s", contribuenti.cod_fis);
printf(" Data scadenza: ");
scanf("%d", &tributi.data_scadenza);
printf(" Valore: ");
scanf("%f", &tributi.valore);
printf(" Descrizione: ");
scanf("%s", tributi.descrizione);
printf(" Pagato (Si/No): ");
scanf("%s", tributi.pagato);
albero_contribuenti = cerca_contribuenti(albero_contribuenti, contribuenti);
inserimento_tributi(&(albero_contribuenti->inf2), tributi);
printf("\n\n >> INSERIMENTO AVVENUTO CON SUCCESSO.\n\n");
printf(" >> Premere un tasto per continuare . . . ");
scanf("%c%c", &pausa, &pausa);
break;
case 6:
file = fopen("Contribuenti.txt", "w");
if (file == NULL){
printf(ERROR_FILE);
break;
}
else{
salva_contribuenti(albero_contribuenti, file);
fclose(file);
printf(SUCCES_FILE);
}
file = fopen("Tributi.txt", "w");
if (file == NULL){
printf(ERROR_FILE);
break;
}
else{
salva_tributi(albero_contribuenti, file);
fclose(file);
printf(SUCCES_FILE);
}
printf(" >> Premere un tasto per continuare . . . ");
scanf("%c%c", &pausa, &pausa);
break;
}
} while (scelta != 0);
}
//Funzioni Lista
void inserimento_tributi(t_lista_tributi *pl, t_tributi p){
t_nodo_lista_tributi * aux = NULL;
aux = (t_nodo_lista_tributi *)malloc(sizeof(t_nodo_lista_tributi));
aux->inf = p;
aux->next = *pl;
*pl = aux;
}
void stampa_tributi(t_lista_tributi l){
t_nodo_lista_tributi *aux = l;
while (aux != NULL){
printf(" ->%d\n", aux->inf.data_scadenza);
printf(" %f\n", aux->inf.valore);
printf(" %s\n", aux->inf.descrizione);
printf(" %s\n", aux->inf.pagato);
aux = aux->next;
}
if (aux == NULL)
printf("--------------------\n\n");
}
void salva_tributi(t_albero_contribuenti a, FILE *file){
t_nodo_albero_contribuenti *aux = a;
fprintf(file, "%f\n", aux->inf.cod_fis);
while (aux->inf2->next != NULL){
fprintf(file, "%s\n", aux->inf2->inf.descrizione);
fprintf(file, "%f\n", aux->inf2->inf.valore);
fprintf(file, "%d\n", aux->inf2->inf.data_scadenza);
fprintf(file, "%s\n", aux->inf2->inf.pagato);
}
}
//Funzioni albero
void inserimento_albero(t_albero_contribuenti *pl, t_contribuenti p){
t_nodo_albero_contribuenti *aux;
aux = (*pl);
if (pl == NULL){
printf("Sei scemo");
system("pause");
}
/*if (aux == NULL){
aux = (t_nodo_albero_contribuenti *)malloc(sizeof(t_nodo_albero_contribuenti));
aux->inf = p;
aux->inf2 = NULL;
aux->alb_des = NULL;
aux->alb_sin = NULL;
*pl = aux;
}
else
{
if (strcmp(aux->inf.cod_fis, p.cod_fis) > 0){
inserimento_albero(aux->alb_sin, p);
}
if (strcmp(aux->inf.cod_fis, p.cod_fis) < 0){
inserimento_albero(aux->alb_des, p);
}
}*/
}
t_nodo_albero_contribuenti * cerca_contribuenti(t_albero_contribuenti a, t_contribuenti p){
t_nodo_albero_contribuenti *aux = a;
if (strcmp(aux->inf.cod_fis, p.cod_fis) == 0){
return aux;
}
else{
if (strcmp(aux->inf.cod_fis, p.cod_fis) > 0){
aux = aux->alb_sin;
cerca_contribuenti(aux, p);
}
if (strcmp(aux->inf.cod_fis, p.cod_fis) < 0){
aux = aux->alb_des;
cerca_contribuenti(aux, p);
}
}
}
void stampa_contribuenti(t_albero_contribuenti a){
t_nodo_albero_contribuenti *aux = a;
if (aux != NULL){
printf("%s\n", aux->inf.cognome);
printf("%s\n", aux->inf.nome);
printf("%s\n", aux->inf.cod_fis);
printf("%d\n", aux->inf.data_nascita);
stampa_tributi(aux->inf2);
stampa_contribuenti(aux->alb_sin);
stampa_contribuenti(aux->alb_des);
}
}
void salva_contribuenti(t_albero_contribuenti a, FILE *file){
t_nodo_albero_contribuenti *aux = a;
if (aux != NULL){
fprintf(file, "%s\n", aux->inf.cognome);
fprintf(file, "%s\n", aux->inf.nome);
fprintf(file, "%s\n", aux->inf.cod_fis);
fprintf(file, "%d\n\n", aux->inf.data_nascita);
salva_contribuenti(aux->alb_sin, file);
salva_contribuenti(aux->alb_des, file);
}
}
void carica_contribuenti(t_albero_contribuenti *pl, FILE *file){
t_contribuenti contribuenti;
while (fscanf(file, "%s%s%s%d", contribuenti.cognome, contribuenti.nome, contribuenti.cod_fis, &contribuenti.data_nascita) == 4){
inserimento_albero(pl, contribuenti);
}
}