skynet ha scritto:
Puoi fare un programma togliendo le parti commentate. Così non si capisce niente. Se puoi metti un programma completo e non solo pezzi.
Ok.
Questo è il codice del programma che ho utilizzato fin'ora, di cui ho 3 preblemi:
1) non so come si fa ad inserire un nome\stringa in un'allocazione di memoria;
2) non riesco a far leggere da file;
3) quando stampo, mi stampa sempre lo zero alla fine.
#include <stdio.h>
#include <stdlib.h>
struct articolo{ int num;
struct articolo *next; };
typedef struct articolo nodo;
nodo *cons(nodo *start, nodo *p);
char menu();
void stampa(nodo *start, nodo *p);
nodo *delete(nodo *start, nodo *p);
nodo *leggi(nodo *start, nodo *p);
void scrivi(nodo *start, nodo *p);
main(int argc, char **argv)
{
char sc;
nodo *start, *p;
start=(nodo *)malloc(sizeof(nodo));
p=start;
start->num=0;
p->next=NULL;
while(sc!='q'){
sc=menu();
switch(sc){
case 'a': start=cons(start, p); break;
case 'd': start=delete(start, p); break;
case 'l': start=leggi(start, p); break;
case 'w': scrivi(start, p); break;
case 's': stampa(start, p); break;
case 'q': exit (0); }
}
}
void stampa(nodo *start, nodo *p){
while(start!=NULL)
{printf("%d--> ", start->num);
start=start->next;
}
printf("\n");
}
nodo *cons(nodo *start, nodo *p)
{ nodo *start2; int numero;
start2=(nodo *)malloc(sizeof(nodo));
printf("Inserisci numero: "); scanf("%d", &numero);
p=start2;
p->num=numero;
p->next=start ;
return (start2);
}
char menu()
{char sc; printf("A)dd, D)elete, S)tampa, L)oad, W)rite, Q)uit\n");
scanf("%c", &sc); return (sc); }
nodo *delete(nodo *start, nodo *p)
{int num_del; nodo *p2;
printf("Inserisci il numero che vuoi eliminare:");
scanf("%d", &num_del);
p2=start;
while(p2->next->num!=num_del)
{p2=p2->next;}
p2->next=p2->next->next;
return (start);
}
nodo *leggi(nodo *start, nodo *p)
{nodo *start3;
start3=(nodo *)malloc(sizeof(nodo));
p=start3;
FILE *pf;
pf=fopen("numeri.txt", "r");
if(pf)
{while(!feof(pf))
{fscanf(pf, "%d\t", &p->num); p->next=start; }
fclose(pf);
}else{printf("Errore nella lettura del file\n");}
/* p->next=start; */
return(start3); }
void scrivi(nodo *start, nodo *p)
{FILE *pf;
pf=fopen("numeri.txt", "w");
if(pf)
{while(start!=NULL)
{fprintf(pf, "%d\t", start->num); start=start->next;}
fclose(pf);
}else{printf("Non è stato possibile scrivere il file\n");}
}
Dato che il programma precedentemente citato è un pò incasinato, ho avuto la brillante idea di crearne un'altro, che ha gli stessi identici problemi, anche se è un pò meno incasinato:
#include <stdio.h>
#include <stdlib.h>
struct articolo{ char nome[20];
int q;
struct articolo *next;};
typedef struct articolo nodo;
char menu();
nodo *cons(nodo *start);
void stampa(nodo *start);
main(int argc, char **argv)
{char sc;
nodo *start; /*
start=(nodo *)malloc(sizeof(nodo));
start->next=NULL;
*/
while(sc!='q')
{sc=menu();
switch(sc){
case 'a': start=cons(start); break;
case 'd': break;
case 's': stampa(start); break;
case 't': break;
case 'p': break;
case 'i': break;
case 'l': break;
case 'w': break;
case 'q': exit (0); break;
}}
}
char menu()
{char sc;
printf("A)dd, D)elete, S)tampa, T)rova, P)relievo, I)nserisci, L)oad, W)rite, Q)uit.\n"); scanf("%c", &sc); return (sc);
}
nodo *cons(nodo *start)
{char *nom_prod; int quant; nodo *start2;
start2=(nodo *)malloc(sizeof(nodo));
start2->next=start;
/* printf("Inserisci Nome prodotto: ");
scanf("%s", nom_prod); */
printf("Inserisci la quantità: ");
scanf("%d", &quant);
start2->q=quant;
/* strcpy(start2->nome, nom_prod); */
return (start2);
}
void stampa(nodo *start)
{while(start!=NULL)
{/* printf("%s", start->nome); */
printf("%d\n", start->q); start=start->next;}
}
PS: Le parti inserite tra /* */ sono le parti che secondo il mio raggionamento sono esatte, ma purtroppo mi creano errori e non funzionano.
Grazie