codice:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct magazzino{
char ricambio[50];
int pezzi;
struct magazzino *next;
};
typedef struct magazzino nodo;
int menu();
void stampa_inventario(nodo *);
int conta_elementi(nodo *);
int conta_pezzi_totali(nodo *);
nodo *aggiungi_ricambio(nodo *);
nodo *trova_elemento(char *, nodo *);
void stampa_lista(nodo*);
void ricerca_ricambio(nodo*);
nodo *cancella_elemento(nodo *);
int prelievo_pezzi(nodo*);
int deposito_pezzi(nodo*);
nodo *cancella_lista(nodo *);
nodo *crea_lista_da_file(nodo *);
void salva_lista_su_file(nodo *);
int main(){
nodo *start=NULL;
printf("\n");
stampa_inventario(start);
printf("\n\n");
printf("Benvenuto\n");
while(1){
switch(menu()){
case 1: start=aggiungi_ricambio(start);
stampa_inventario(start);
break;
case 2: start=cancella_elemento(start);
stampa_inventario(start);
break;
case 3: stampa_lista(start);
stampa_inventario(start);
break;
case 4: ricerca_ricambio(start);
stampa_inventario(start);
break;
case 5: prelievo_pezzi(start);
stampa_inventario(start);
break;
case 6: deposito_pezzi(start);
stampa_inventario(start);
break;
case 7: start=cancella_lista(start);
stampa_inventario(start);
break;
case 8: start=crea_lista_da_file(start);
stampa_inventario(start);
break;
case 9: salva_lista_su_file(start);
stampa_inventario(start);
break;
case 0: cancella_lista(start);
printf("Arrivederci!\n");
exit(0);
default: printf("Errore\n");
}
}
}
void salva_lista_su_file(nodo *start){
nodo *head=start;
int a=0;
FILE *fp=fopen("inventario.txt", "o"); //Memorizza l'inventario nel file di testo.
while(head!=NULL){ //Scelta 9)save.
fprintf(fp, "%s %d\n", head->ricambio, head->pezzi);
head=head->next;
a++;
}
if(a>0){
printf("Salvataggio effettuato.\n");
}else{
printf("Salvataggio non riuscito.\n");
}
fclose(fp);
}
nodo *crea_lista_da_file(nodo *start){
FILE *fp;
nodo *nuovo;
nodo *temp;
char nome_prodotto[64];
int quantita;
char z='a';
fp=fopen("inventario.txt", "r"); //Crea la lista mentre legge i file, aggiungendo gli elementi in coda.
if(!fp){ //Scelta 8)load.
printf("Caricamento non effettuato.\n\n");
return NULL;
}
if(start!=NULL){
while((z!='s')&&(z!='n')){
printf("Vuoi sovrascrivere? Si o No? "); //Qui avviene doppia stampa.???
scanf("%c", &z);
}
}
while(feof(fp)==0){
nuovo=(nodo *)malloc(sizeof(nodo));
fscanf(fp, "%s %d\n", nome_prodotto, &quantita);
nuovo->pezzi=quantita;
strcpy(nuovo->ricambio, nome_prodotto);
temp=start;
nuovo->next=temp;
start=nuovo;
}
if(feof(fp)!=0){
printf("Caricamento effettuato.\n\n");
}
fclose(fp);
return start;
}
nodo *cancella_lista(nodo *start){
if(start!=NULL){
cancella_lista(start->next); //Cancella la lista quando chiudi il programma o quando devi rimuovere tutto.
free(start); //Scelta 7)rimuovi tutto e 0)esci.
}
return NULL;
}
int deposito_pezzi(nodo *start){
char nome[64];
nodo *temp;
int pr; //Per effettuare il deposito di pezzi.
//Scelta 6)deposito.
printf("Di quale pezzo vuoi fare il deposito?\n");
scanf("%s", nome);
temp=trova_elemento(nome, start);
if(temp==NULL){
printf("Ricambio non trovato.\n\n");
return 0;
}
printf("Quanti pezzi depositi?\n ");
scanf("%d", &pr);
temp->pezzi=temp->pezzi+pr;
printf("Operazione effettuata.\n\n");
return 0;
}
int prelievo_pezzi(nodo* start){
char nome[50];
nodo *temp;
int pr;
printf("Di quale pezzo vuoi fare il prelievo?\n");
scanf("%s", nome); //Per effettuare il prelievo di pezzi.
temp=trova_elemento(nome, start); //Scelta 5)prelievo.
if(temp==NULL){
printf("Ricambio non trovato.\n\n");
return 0;
}
printf("Quanti pezzi? \n");
scanf("%d", &pr);
while(pr>temp->pezzi){
printf("N. pezzi da prelevare maggiore del n. pezzi in magazzino. Inserire numero corretto: \n");
scanf("%d", &pr);
}
temp->pezzi=temp->pezzi-pr;
printf("Operazione effettuata.\n\n");
}
void ricerca_ricambio(nodo *start){
char nome[50];
nodo *temp;
printf("Quale ricambio cerchi?\n "); //Cerca un ricambio e se lo trova stampa il numero di pezzi.
scanf("%s", nome); //Scelta 4)trova.
temp=trova_elemento(nome, start);
if(temp==NULL){
printf("Il ricambio %s non è in inventario\n\n", nome);
}else{
printf("%s: n. pezzi disponibili: %d\n", temp->ricambio, temp->pezzi);
}
}
void stampa_lista(nodo *start){
if(start==NULL){
printf("Fine\n\n"); //Stampa la lista ricorsivamente.
}else{ //Scelta 3)mostra.
printf("%s: %d pezzi\n", start->ricambio, start->pezzi);
stampa_lista(start->next);
}
}
nodo *cancella_elemento(nodo *start){
char nome[50];
nodo *temp;
nodo *head;
printf("Quale pezzo di ricambio vuoi cancellare?\n ");
scanf("%s", nome); //Scaneffizzando il nome del ricambio ti fa trovare e cancellare il nodo che contiene il ric.
temp=trova_elemento(nome, start); //Scelta 2)cancella.
if(temp==NULL){
printf("Ricambio non trovato.\n\n");
return start;
}
head=start;
if(head==temp){
head=temp->next;
free(temp);
printf("Ricambio eliminato.\n\n");
}
while(head->next!=temp){
head=head->next;
}
if(head->next==temp){
head->next=temp->next;
free(temp);
printf("Ricambio eliminato.\n\n");
}else{
printf("Ricambio non trovato.\n\n");
}
return head;
}
nodo *aggiungi_ricambio(nodo *start){
nodo* head;
char nome_pezzo[50];
int quantita;
nodo *temp=start;
printf("Che tipo di ricambio verrà aggiunto?\n");
scanf("%s", nome_pezzo);
if(trova_elemento(nome_pezzo, start)!=NULL){
temp=trova_elemento(nome_pezzo, start);
printf("L'elemento esiste già, quanti pezzi vuoi aggiungere? ");
scanf("%d", &quantita);
while(quantita<0){
printf("I numeri negativi non sono validi, quanti pezzi vuoi aggiungere? ");
scanf("%d", &quantita);
}
temp->pezzi=temp->pezzi+quantita;
return start;
}
printf("Quanti pezzi? "); //Aggiunge un nodo per inserire un elemento in magazzino.
scanf("%d", &quantita); //Scelta 1)aggiungi.
while(quantita<0){
printf("I numeri negativi non sono validi, quanti pezzi vuoi aggiungere? "); //Qui non avviene doppia stampa.
scanf("%d", &quantita);
}
head=(nodo *)malloc(sizeof(nodo));
if(head){
strcpy(head->ricambio, nome_pezzo);
head->pezzi=quantita;
head->next=start;
}
return head;
}
nodo *trova_elemento(char nome[50], nodo *start){
nodo *temp;
temp=start;
while(temp!=NULL){ //Fornendo il nome del ricambio ti fa trovare il nodo che contiene quel ricambio.
if(strcmp(temp->ricambio, nome)==0){ //Si trova in cancella_elemento, prelievo_pezzi, deposito_pezzi e ricerca_ricambio.
return temp;
}else{
temp=temp->next;
}
}
return temp;
}
void stampa_inventario(nodo *start){
printf("Tipi di ricambi: %d. Numero totale di pezzi di ricambio: %d.\n", conta_elementi(start), conta_pezzi_totali(start));
}
int menu(){
int sc;
printf("Menu: \n1)aggiungi\n2)cancella\n3)mostra\n4)trova\n5)prelievo\n6)deposito\n7)rimuovi tutto\n8)load\n9)save\n0)esci\n");
scanf("%d", &sc);
return sc;
}
int conta_elementi(nodo *start){
if(start==NULL){
return 0; //Conta ricors. gli elementi. Usato in stampa_inventario.
}else{
return (1 + conta_elementi(start->next));
}
}
int conta_pezzi_totali(nodo *start){
int pezzi_totali;
if(start==NULL){ //Conta il numero di pezzi in magazzino. Usato in stampa_inventario.
pezzi_totali=0;
return pezzi_totali;
}else{
pezzi_totali=start->pezzi;
return(pezzi_totali + conta_pezzi_totali(start->next));
}
}
Vi prego mi potete aiutare nella compilazione giusta ?