Programma con liste,estrazioni dalla testa e inserimento

di Anonimizzato7811 il
24 risposte

24 Risposte - Pagina 2

  • Cosa vuoi fare con sta funzione? una possibile soluzione sarebbe quella di estrappolare un dato dalla lista.
    persona è un tipo di dato (come se fosse un int x intenderci) e quindi non puoi usarlo nel modo che lo stai usando tu. Puoi fare invece una cosa del genere.
    
    bool estTesta (lista& inizio, lista & dataCheRiceve)
    {lista p = inizio;
    if (p == 0) return false;
    dataCheRiceve.nome = p->nome;
    dataCheRiceve.eta = p->eta;
    
    inizio = p->successiva;
    delete p;
    return true;
    }
    
    e usarlo così nel main:
    
    lista datoCheRiceve;
    estTesta(inizio,datoCheRiceve);
    
    così non ti da errore e funziona. Ma bisogna vedere se effettivamente e ciò che a te serve. Sinceramente però stai capendo cosa la funzione estTesta sta faccendo?
  • #include <cstdlib>
    #include <iostream>
    using namespace std;

    struct persona
    { char nome[20];
    int eta;
    persona* successiva;
    };

    typedef persona* lista;

    lista creaLista (int n)
    {
    lista p, p0 = 0;

    for (int i = 1; i <= n; i++)
    {
    p = new persona;
    cin >> p->nome >> p->eta;
    p->successiva = p0;
    p0 = p;
    }
    return p0;
    }
    bool estTesta (lista& inizio, lista & dataCheRiceve)
    {lista p = inizio;
    if (p == 0) return false;
    dataCheRiceve.nome = p->nome;
    dataCheRiceve.eta = p->eta;

    inizio = p->successiva;
    delete p;
    return true;
    }
    void insTesta (lista& inizio, int nome, int eta)
    {
    lista p = new persona;
    p->nome = persona.nome;
    p->successiva = inizio;
    inizio = p;
    }

    int main()
    {
    const int numero_persone = 10;
    creaLista(numero_persone);
    lista dataCheRiceve;
    estTesta (inizio, dataChericeve);
    insTesta (numero_persone);
    return 0;
    }
    così? a parte che devo sistemare voidi instesta,ma comunque a me dà errore datachericeve.nome
  • Ti hanno insegnato come fare la copia di stringhe?
    
    strcpy(datoCheRiceve.nome,p->nome);
    
    è inutile che ti scrivo codice che non sai cosa significa.
  • Ma a che mi serve copiare la stringa?non si puo' sistemare così?
  • Mi potresti scrivere come correggeresti il programma?perchè io sinceramente meglio di così non saprei correggere,grazie!!
  • 
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    
    struct persona
    { 
    	char nome[20];
    	int eta;
    	persona* successiva;
    };
    
    typedef persona* lista;
    
    lista creaLista (int n)
    {
    	lista p, p0 = 0;
    
    	for (int i = 1; i <= n; i++)
    	{
    		p = new persona;
    		cin >> p->nome >> p->eta;
    		p->successiva = p0;
    		p0 = p;
    	}
    	return p0;
    }
    
    bool estTesta (lista& inizio, lista & datoCheRiceve)
    {
    	lista p = inizio;
    	if (p == 0) return false;
    	strcpy(datoCheRiceve->nome,p->nome);
    	datoCheRiceve->eta = p->eta;
    
    	inizio = p->successiva;
    	delete p;
    	return true;
    }
    
    int main()
    {
    	const int numero_persone = 10;
    	lista testa = creaLista(numero_persone);
    	lista datoCheRiceve = new persona;
    	estTesta(testa,datoCheRiceve);
    	cout << datoCheRiceve->nome << datoCheRiceve->eta << endl;
    	delete datoCheRiceve;
    	system ("pause");
    	return 0;
    }
    
    ho già fatto troppo. A te il resto. Una domanda? Sai cosa sono i puntatori?
  • Il programma parte ma il mio dovrebbe estrarre l'elemento in testa, invece questo mi riscrive l'elemento in coda
  • Comunque per l'estrazione si deve usare lo schema che avevo scritto all'inizio, è solo che sarà sbagliata qualche parola
  • Ok ci rinuncio. Mi dispiace ma non hai ancora le basi per capire neanche il codice scritto da te. CreaLista torna un puntatore alla testa della lista che viene usato poi nella funzione estTesta. A questa funzione li viene passata la testa della lista + il dato che riceve che essendo definito come lista datoCheRiceve (quindi come: persona * datoCheRiceve) non è nient'altro che un puntatore che punta a nulla. Con new si chiede un po di memoria all'sistema faccendo in modo che sta variabile abbia i campi definti e che non puntino a null. poi la funzione estTesta prima di eliminare l'elemento alla testa (con delete p) copia questa cella nella varibile datoCheRiceve la cui all'uscita della funzione contiene il dato che la funzione ha appena elimanto. Per verificare se è giusto così ti ho messo il cout (operatore di scrittura su file, in questo caso stdout) che ti fa vedere i dati appena elimanti quindi non INSERITI ma ELIMINATI dalla lista. Poi elimino anche la varibile datoCheRiceve una volta che ho verificato che i dati sono stati estratti. Se tu non sei in grado di darmi questa spiegazione ti invito a rilegerti di nuovo tutto il libro dove stai studiando partendo dalla copertina perche così non ci siamo. Quando darai l'esame non ci sarà qualcuno del forum a fare il compito per te.
  • 
    bool estTesta (lista& inizio)
    {
       lista p = inzio;
       if (p == 0) return false;
       inizio = p->successiva;
       delete p;
       return true;
    }
    
    nel main:
    
    lista testa = creaLista(numero_persone);
    estTesta(testa);
    
Devi accedere o registrarti per scrivere nel forum
24 risposte