[c++] semplici funzioni per liste
Io veramente non capisco qual è il problema:
vi posto il codice:
struttura dati:
Funzione CREA PRATICA:
FUNZIONE INSERISCI IN TESTA:
Allora problema n1:
Se nel main scrivo questo:
Oltre a p1 stampa anche una pratica con ID, PRIORITA come numero qualsiasi non inizializzato (es 2345443) Permanenza =1 e Richiesta vuoto.
Problema 2:
Se nel main aggiungo un'altra pratica p2
va in crash appena legge il comando di InsertFirst, mentre funziona bene se non c'è InsertFirst, ma perchè??
vi posto il codice:
struttura dati:
typedef struct TipoPratica{ int IDPratica; int Priorita; int Permanenza; char Richieste[MAXLUN]; TipoPratica(){ IDPratica = 0; Priorita = 0; Permanenza = 0; Richieste [0]='\0'; } TipoPratica(int _IDPratica, int _Priorita, int _Permanenza){ IDPratica=_IDPratica; Priorita=_Priorita; Permanenza=_Permanenza; cout<<"Richieste:"; gets(Richieste); } void Print(){ cout<<"ID:"<<IDPratica<<"- Priorita:"<<Priorita<<"- Permanenza:"<<Permanenza<<" - Richiesta:"<<Richieste<<endl; } }; typedef struct TipoLista{ TipoPratica Pratica; struct TipoLista *next; TipoLista(){ TipoPratica p; Pratica=p; next=NULL; } TipoLista(TipoPratica _p, TipoLista *_next){ Pratica=_p; next=_next; } void Print(){ if(Pratica.IDPratica!=0){ Pratica.Print(); } } }; typedef struct TipoUfficio{ TipoLista *ElencoPratiche; unsigned int NumeroPraticheEvase; int TempoTotaleGiacenza; TipoUfficio(){ ElencoPratiche=NULL; NumeroPraticheEvase=0; TempoTotaleGiacenza=0; } TipoUfficio(int _NumeroPraticheEvase, int _TempoTotaleGiacenza, TipoLista *_ElencoPratiche){ NumeroPraticheEvase=_NumeroPraticheEvase; TempoTotaleGiacenza=_TempoTotaleGiacenza; ElencoPratiche=_ElencoPratiche; } void Print(){ ElencoPratiche->Print(); } };
Funzione CREA PRATICA:
int ID=1; TipoPratica CreaPratica(){ TipoPratica p(ID++,random(0,2),1); return p; }
FUNZIONE INSERISCI IN TESTA:
TipoLista *InsertFirst(TipoLista *s, TipoPratica p){ TipoLista *n = new TipoLista(p,NULL); if(s==NULL){ s->next=n; return s; }else{ n->next=s->next; s->next=n; return s; } }
Allora problema n1:
Se nel main scrivo questo:
TipoPratica p1; TipoLista *s; p1=CreaPratica(); s=InsertFirst(s,p1); while(s!=NULL){ s->Print(); s=s->next;}
Oltre a p1 stampa anche una pratica con ID, PRIORITA come numero qualsiasi non inizializzato (es 2345443) Permanenza =1 e Richiesta vuoto.
Problema 2:
Se nel main aggiungo un'altra pratica p2
TipoUfficio Ufficio[LUN]; TipoPratica p1,p2; TipoLista *s; p1=CreaPratica(); p2=CreaPratica(); s=InsertFirst(s,p1);
va in crash appena legge il comando di InsertFirst, mentre funziona bene se non c'è InsertFirst, ma perchè??

Risposte
senza stare ad indagare nel tuo codice
è ovviamente sbagliato. se "s" è NULL, non puoi usarlo proprio perchè è null!. Quindi non puoi andare a fare "s->next" perchè "s" non c'è. E ti va bene perchè ti si pianta il programma. Se non sei fortunata il programma potrebbe non piantarsi nemmeno e dovresti indagare errori misteriosi.
if(s==NULL){ s->next=n;
è ovviamente sbagliato. se "s" è NULL, non puoi usarlo proprio perchè è null!. Quindi non puoi andare a fare "s->next" perchè "s" non c'è. E ti va bene perchè ti si pianta il programma. Se non sei fortunata il programma potrebbe non piantarsi nemmeno e dovresti indagare errori misteriosi.
Ok, il codice giusto è
Ma non funziona lo stesso....
if(s==NULL){ s=n;
Ma non funziona lo stesso....
perchè c'è un altro problema. Tu hai creato "s" senza inizializarlo. Quando crei un puntatore devi sempre metterlo a null
se non fai così la funzione che aggiunge in testa controlla "if(NULL == s)".. ma s non è uguale a NULL perchè non l'hai inizializzato!
inoltre anche il seguente credo sia sbagliato:
perchè?
TipoLista *s = NULL;
se non fai così la funzione che aggiunge in testa controlla "if(NULL == s)".. ma s non è uguale a NULL perchè non l'hai inizializzato!
inoltre anche il seguente credo sia sbagliato:
s->next=n;
perchè?