[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è?