Salve ragazzi, sono nuova nel forum. Lunedì ho un esame e non riesco a trovare l'errore nel seguente programma. Ad un certo punto mi dice errore di segmentazione.Potreste aiutarmi a trovare l'errore per favore??
typedef struct s_disco{
char nome[25];
int numero_canzoni;
float costo;
int anno_di_uscita;
struct s_disco* next;
}disco;
typedef disco* p_disco;
typedef struct s_lista{
int N;
p_disco testa;
} d_lista;
int menu();
d_lista creaLista();
d_lista inserimento(d_lista lista, p_disco p);
d_lista cancella(d_lista lista, char elem[]);
void ricerca (d_lista lista, char nome[]);
void stampaLista(d_lista lista);
int main (void)
{
p_disco n;
d_lista d;
int val,i,scelta;
char canc[25];
char ric[25];
d=creaLista();
do {
printf("\n Quanti dischi vuoi inserire nella lista? ");
scanf("%d", &val);
} while(val<=0);
do{
scelta=menu();
switch(scelta) {
case 0:
printf("\n Stai per uscire.Premi un tasto per terminare...\n");
getchar();
break;
case 1:
for(i=0; i<val; i++) {
printf("\n Inserisci il nome del disco: ");
scanf("%s", n->nome);
getchar();
printf("\n Inserisci il numero di canzoni: ");
scanf("%d", &n->numero_canzoni);
getchar();
printf("\n Inserisci il costo: ");
scanf("%f", &n->costo);
getchar();
printf("\n Inserisci l'anno di uscita: ");
scanf("%d", &n->anno_di_uscita);
getchar();
d=inserimento(d,n);
}
printf("\n Premi un tasto per continuare...");
getchar();
break;
case 2:
printf("\n Inserisci disco da eliminare :");
scanf("%s", canc);
cancella(d,canc);
printf("\n Premi un tasto per continuare...");
getchar();
break;
case 3:
printf("\n Inserisci disco da ricercare :");
scanf("%s", ric);
ricerca(d,ric);
printf("\n Premi un tasto per continuare...");
getchar();
break;
case 4:
stampaLista(d);
printf("\n Premi un tasto per continuare...");
getchar();
break;
default:
printf("\n ***ERRORE***.Premi un tasto per continuare...");
getchar();
break;
}
} while(scelta!=0);
}
int menu()
{
int scelta;
printf("\n Questo programma ti permette di\n");
printf("\n -0.Esci dal programma\n");
printf("\n -1.Inserisci un nuovo disco\n");
printf("\n -2.Elimina disco\n");
printf("\n -3.Ricerca disco\n");
printf("\n -4.Stampa la lista\n");
printf("\n Inserisci qui la tua scelta...\n");
scanf("%d", &scelta);
getchar();
return scelta;
}
d_lista creaLista()
{
d_lista ris;
ris.N=0;
ris.testa=NULL;
return ris;
}
d_lista inserimento(d_lista lista, p_disco p)
{
p_disco nuovodisco;
nuovodisco=malloc(sizeof(disco));
if(nuovodisco==NULL) {
printf("\n Errore di allocazione: memoria esaurita!!\n");
}
nuovodisco->nome==p->nome;
nuovodisco->numero_canzoni==p->numero_canzoni;
nuovodisco->costo==p->costo;
nuovodisco->anno_di_uscita==p->anno_di_uscita;
(nuovodisco->next)=(lista.testa);
lista.testa=nuovodisco;
lista.N++;
return lista;
}
d_lista cancella(d_lista lista, char elem[])
{
p_disco corrente;
p_disco precedente;
int trovato=0;
corrente=lista.testa;
char canc[25];
while(corrente!=NULL && trovato==0) {
if(strcmp(corrente->nome,canc)==0) {
printf("\n Disco eliminato\n");
trovato=1;
}
else {
precedente=corrente;
corrente=corrente->next;
}
}
if(trovato!=1) {
printf("\n Disco non trovato\n");
}
if(precedente==NULL) {
lista.testa=corrente->next;
}
else {
(precedente->next)=corrente->next;
}
free(corrente);
lista.N--;
return lista;
}
void ricerca (d_lista lista, char nome[])
{
p_disco corrente;
p_disco precedente;
int trovato=0;
corrente=lista.testa;
char ric[25];
while(corrente!=NULL && trovato==0) {
if(strcmp(corrente->nome,ric)==0) {
trovato=1;
printf("\n Disco trovato!\n");
}
else {
precedente=corrente;
corrente=corrente->next;
}
}
if(trovato!=1) {
printf("\n Disco non trovato!\n");
}
}
void stampaLista(d_lista lista)
{
p_disco p1;
p1=lista.testa;
while(p1!=NULL) {
printf("%s\n", p1->nome);
printf("%d\n", p1->numero_canzoni);
printf("%f\n", p1->costo);
printf("%d\n", p1->anno_di_uscita);
p1=p1->next;
}
return;
}