[c++] semplici funzioni per liste

Oo.Stud.ssa.oO
Io veramente non capisco qual è il problema:
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
Vitalluni
senza stare ad indagare nel tuo codice
 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.

Oo.Stud.ssa.oO
Ok, il codice giusto è
if(s==NULL){
               s=n;

Ma non funziona lo stesso....

Vitalluni
perchè c'è un altro problema. Tu hai creato "s" senza inizializarlo. Quando crei un puntatore devi sempre metterlo a null
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è?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.