[C++] Problema con liste

Oo.Stud.ssa.oO
Volevo fare un programma che inserisce in testa alla lista gli interi passati da tastiera e li stampa, ma dopo la stampa crasha, non capisco perchè!!

#include <cstdlib>
#include <iostream>

using namespace std;

typedef struct dati{
        int d; };

typedef struct nodo{
        dati dato;
        nodo* next;
        };
        
nodo * InsertFirst (nodo* s, dati CurrD);
void stampa(nodo* s);

int main(int argc, char *argv[])
{
    nodo* s;
    dati d;
    int dim,i=0;
    cout<<"Quanti num vuoi inserire?"<<endl;
    scanf("%d",&dim);
    
    while (i<dim){
          cout<<"Inserire dato:"<<endl;
          scanf("%d",&d);
          s = InsertFirst(s, d);
          i++;}
    
    stampa(s);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

//FUNZIONI IMPLEMENTATE

 nodo * InsertFirst (nodo* s, dati CurrD) {
      nodo* p;
      nodo* q = new nodo;
      q->dato=CurrD;
      q->next=s;
      p=q;
      return p;}
      
     
void stampa(nodo* s){
     while (s != NULL){
           cout <<s->dato.d<<"-";
           s=s->next;
           }
}



Risposte
Oo.Stud.ssa.oO
secondo me il problema è quel scanf dentro il ciclo while, ma se metto
cin>>d;
mi da questo errore: no match for 'operator >>' in 'std::cin>>d'
chi mi sa spiegare perchè?

vict85
Perché mischi iostream e cstdio sullo stesso ambito? Non è generalmente una cosa consigliata.

L'errore comunque è che per il compilatore dati non è un int ma una struttura. Per correggere l'errore ti basta NON includere un singolo int in una struttura. È insensato.

Oo.Stud.ssa.oO
Li ho mischiati perchè mi dava errore su
 cin>>d;


Comunque lo so che è insensato, l' ho fatto solo per abituarmi a lavorare con gli struct!
In ogni caso se voglio mantenere la struct dovrei mettere
cin>>d.d;
giusto?

Ma crasha lo stesso......ma perchè?

apatriarca
Semplicemente perché non hai inizializzato s per cui alla fine della lista non ci sarà NULL, ma un valore casuale che quando viene deferenziato manda in crash il tuo programma.

apatriarca
Non è comunque così che si dichiara un struttura in C++ (o C):
typedef struct dati{
        int d; };

In C++ il typedef non è affatto necessario, per cui andrebbe scritto:
struct dati {
    int d;
};

ma anche in C è sbagliato perché un typedef richiede che dopo il tipo venga inserito il nuovo nome da dare al tipo (e tu non ce lo hai messo). Per cui la versione corretta sarebbe piuttosto stata una delle seguenti:
// 1
typedef struct dati { int d; } dati;
// 2
typedef struct { int d; } dati;
// 3
typedef struct dati dati;
struct dati { int d; };

Oo.Stud.ssa.oO
Grazie 100000 :-):-)

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