spk
29-10-2007, 19:30
Salve a tutti, gia ringrazio anticipatamente per le risposte.
Il mio problema riguarda questo codice:
#include <stdio.h>
struct disco
{
int id;
int sl;
struct disco *succ;
}x={0, 1000000, NULL};
struct disco *primo=&x;
float totale=0;
int n_dischi=1;
void inserisci(struct disco *uno, struct disco *due, struct disco *nuovo)
{
if(nuovo->sl < due->sl)
{
nuovo->succ=due;
uno->succ=nuovo;
}
else
{
if(due->succ == NULL)
{
due->succ=nuovo;
}
else
{
inserisci(due, due->succ, nuovo);
}
}
}
void inserisci_disco(struct disco *nuovo)
{
if(nuovo->sl < primo->sl)
{
nuovo->succ=primo;
primo=nuovo;
}
else
{
if(primo->succ == NULL)
{
primo->succ=nuovo;
}
else
{
inserisci(primo, primo->succ, nuovo);
}
}
}
void nuovo_file(int dfile)
{
if (primo->sl >= dfile)
{
primo->sl -= dfile;
totale += dfile;
}
else
{
struct disco nuovo={n_dischi, (1000000-dfile), NULL};
inserisci_disco(&nuovo);
n_dischi++;
totale += dfile;
// primo.succ=&nuovo;
}
}
void to_string(struct disco *d)
{
if(d->succ == NULL)
{
printf("file size sum\t= %1.6f GB\ntotal disk\t= %d\n",(totale/1000000),n_dischi);
printf("\t%d %d:\n",d->id,d->sl);
}
else
{
to_string(d->succ);
printf("\t%d %d:\n",d->id,d->sl);
}
}
int main()
{
nuovo_file(500000);
nuovo_file(300000);
nuovo_file(700000);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
//nuovo_file(710000);
to_string(primo);
return 0;
}
L'obiettivo era quello di creare una lista ordinata di dischi secondo "sl" (ovvero Spazio Libero). L'esercizio non presenta difficoltà fino a quando scopro che...non so nemmeno come definirlo...perdo dati.
Se notate nel main() eseguo 3 printf identiche tutte di seguito all'altra.
Ora quando mando in esecuzione invece di scrivermi 3 volte il valore esatto mi fa questo tipo di output:
./a.out
pippo 1
pippo -1079252524
pippo -1079252524
Segmentation fault (core dumped)
La stessa cosa succede ipotizzo anche al puntatore del "disco successivo" rendendomi perciò impossibile continuare il tutto.
Sapreste dirmi come risolvere il problema? Cosa sbaglio? :muro:
Il mio problema riguarda questo codice:
#include <stdio.h>
struct disco
{
int id;
int sl;
struct disco *succ;
}x={0, 1000000, NULL};
struct disco *primo=&x;
float totale=0;
int n_dischi=1;
void inserisci(struct disco *uno, struct disco *due, struct disco *nuovo)
{
if(nuovo->sl < due->sl)
{
nuovo->succ=due;
uno->succ=nuovo;
}
else
{
if(due->succ == NULL)
{
due->succ=nuovo;
}
else
{
inserisci(due, due->succ, nuovo);
}
}
}
void inserisci_disco(struct disco *nuovo)
{
if(nuovo->sl < primo->sl)
{
nuovo->succ=primo;
primo=nuovo;
}
else
{
if(primo->succ == NULL)
{
primo->succ=nuovo;
}
else
{
inserisci(primo, primo->succ, nuovo);
}
}
}
void nuovo_file(int dfile)
{
if (primo->sl >= dfile)
{
primo->sl -= dfile;
totale += dfile;
}
else
{
struct disco nuovo={n_dischi, (1000000-dfile), NULL};
inserisci_disco(&nuovo);
n_dischi++;
totale += dfile;
// primo.succ=&nuovo;
}
}
void to_string(struct disco *d)
{
if(d->succ == NULL)
{
printf("file size sum\t= %1.6f GB\ntotal disk\t= %d\n",(totale/1000000),n_dischi);
printf("\t%d %d:\n",d->id,d->sl);
}
else
{
to_string(d->succ);
printf("\t%d %d:\n",d->id,d->sl);
}
}
int main()
{
nuovo_file(500000);
nuovo_file(300000);
nuovo_file(700000);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
printf("pippo %i\n",primo->succ->id);
//nuovo_file(710000);
to_string(primo);
return 0;
}
L'obiettivo era quello di creare una lista ordinata di dischi secondo "sl" (ovvero Spazio Libero). L'esercizio non presenta difficoltà fino a quando scopro che...non so nemmeno come definirlo...perdo dati.
Se notate nel main() eseguo 3 printf identiche tutte di seguito all'altra.
Ora quando mando in esecuzione invece di scrivermi 3 volte il valore esatto mi fa questo tipo di output:
./a.out
pippo 1
pippo -1079252524
pippo -1079252524
Segmentation fault (core dumped)
La stessa cosa succede ipotizzo anche al puntatore del "disco successivo" rendendomi perciò impossibile continuare il tutto.
Sapreste dirmi come risolvere il problema? Cosa sbaglio? :muro: