Domanda Problema con gestione lista concatenata

Stato
Discussione chiusa ad ulteriori risposte.

andrer0nda

Utente Bronze
18 Aprile 2015
6
2
0
35
Buonasera a tutti, la creazione di un programma funzionante sulle liste concatenate mi sta creando numerosi problemi….:(
Vi posto il codice in C++ sperando che mi possiate aiutare :)
gli errori si trovano nella funzione add_nodo_posizione e delete_nodo_posizione
VI ringrazio.


PHP:
---------------------------------------------classe Nodo-------------------------------------
class Nodo
{
    private:
        double dato;
        Nodo* successivo;

    public:
        Nodo();
        Nodo(double, Nodo*);
        void set_successivo(Nodo*);
        void set_nodo(Nodo*, double);
        void set_dato(double);
        double get_dato();
        Nodo* get_successivo();

};

--------------------------------------------funzioni nodo-----------------
#include <stdio.h>
#include "Nodo.h"

Nodo::Nodo()
{
    dato=0;
    successivo=NULL;
}

Nodo::Nodo(double a, Nodo* b)
{
    dato=a;
    successivo=b;
}
void Nodo::set_dato(double info)
{
    dato=info;
}

void Nodo::set_successivo(Nodo* pippo)
{
    successivo=pippo;
}

double Nodo::get_dato()
{
    return dato;
}

Nodo* Nodo::get_successivo()
{
    return successivo;
}

void Nodo::set_nodo(Nodo* pippo, double info)
{
    successivo=pippo;
    dato=info;
}
------------classe lista--------------------------#include "Nodo.h"

class Lista
{
    private:
        Nodo* primo;

    public:
        Lista();
        void add_nodo(double);
        void print_lista(int);
        void add_nodo_posizione(int ,double);
        void delete_nodo_posizione(int);
};

-------------funzioni lista----------
#include "Lista.h"
#include <stdio.h>
#include <iostream>
using namespace std;
 
Lista::Lista()
{ 
    primo= NULL;

} 
 
void Lista::add_nodo(double info)
{ 
    Nodo* temp;
 
    if(primo==NULL)
    {
        primo = new Nodo;
        primo->set_dato(info);
    }

 

    else
    {
        temp=primo;
        while(temp->get_successivo()!=NULL)
        { 
            temp=temp->get_successivo();
        }
        temp->set_nodo(new Nodo, info);
    }
} 

void Lista::print_lista(int contatore)
{ 
    int i=0;
    Nodo* temp;
    temp=primo;
    i++;
        while(i<=contatore)
        { 
            cout<<"\n"<<(temp->get_dato());
            temp=(temp->get_successivo());
            i++;
        }

}



void Lista::add_nodo_posizione(int posizione, double info)
{
    Nodo* temp;
    Nodo* tempdue;
    Nodo* temp3;
    temp=primo;
    int i=1;
    do
        { 
            temp=temp->get_successivo();
            ++i;
        } while(i!=(posizione));

            if(i==posizione)
            {
                tempdue= temp ;
                temp->set_nodo(new Nodo, info);
                temp3=temp->get_successivo();
                temp3->set_successivo(tempdue);
            }
}


void Lista::delete_nodo_posizione(int posizione)
{
    int i=1;
    Nodo* temp;
    Nodo* temp2;
    temp=primo;
    do
        {
            temp=temp->get_successivo();
            i++;
        }while(i!=(posizione-1));

    temp2=primo;
 
    do
        {
            temp2=temp2->get_successivo();
            i++;
        }while(i!=(posizione+1));

    temp->set_successivo(temp2);
}
 
Ci sono diversi errori, questi sono i primi che mi sono saltati all'occhio:
  • La funzione print_lista non ha senso che prenda come parametro un intero.
  • La funzione add_nodo utilizza set_nodo, che modifica il valore del dato attuale e crea un nuovo nodo con dato=0.
  • Come hai notato tu, la funzione add_nodo_posizione non è corretta, hai sbagliato ad usare i puntatori (anche qui usi set_nodo in modo sbagliato, probabilmente è proprio quella funzione che non fa quello che pensi).
  • In delete_nodo_posizione (come in add_nodo_posizione) crei un loop, ma qui penso che sia più che altro un errore di distrazione
    Codice:
    void Lista::delete_nodo_posizione(int posizione)
    {
      int i=1;
      Nodo* temp;
      Nodo* temp2;
      temp=primo;
      do
      {
      temp=temp->get_successivo();
      i++;
      }while(i!=(posizione-1));
    
      temp2=temp;
      do
      {
      temp2=temp2->get_successivo();
      i++;
      }while(i!=(posizione+1));
    
      temp->set_successivo(temp2);
    }
    (questo è giusto per fixxare alla buona l'errore che hai fatto, ma non è ancora proprio a posto)
Cerca di capire bene cosa fa set_nodo e guarda come lo usi, già così dovresti risolvere qualche problema. Se poi non ne esci fammi sapere che ti faccio un esempio su come fare una lista di questo tipo.
 
  • Mi piace
Reazioni: andrer0nda
Se ti può interessare in rilievo c'è materiale sulla gestione delle liste, con codice commentato, dai un occhiata se vuoi

Sent from my LG-D802 using Tapatalk
 
Il programma è quasi corretto :evvai: nel senso che ho modificato tutte le funzioni
Quella per aggiungere un nodo alla lista funziona , quella per inserirlo in una posizione definita dall'utente anche (solo il primo non si può modificare)…..
l'unica che problematica è il delete_nodo nel senso che cancella l'elemento successivo a quello che ho imposto io e alla fine dopo aver stampato ricevo sempre l'errore segmentation faul 11
spero che tu mi possa nuovamente illuminare

ps posto il codice delle precedenti magari hai altri suggerimenti
PHP:
void Lista::add_nodo(double info)
{  
    Nodo* temp;
    Nodo* pn;
  
    if(primo==NULL)
    {
        primo = new Nodo(info, NULL);
    }

  

    else
    {
        temp=primo;
        while(temp->get_successivo()!=NULL)
        {  
            temp=temp->get_successivo();
          
        }
        pn=new Nodo(info, NULL);
        temp->set_successivo(pn);
    }
}  




void Lista::add_nodo_posizione(int posizione, double info)
{
    Nodo* temp;
    Nodo* tempdue;
    Nodo* pn;
    temp=primo;
    int i=1;
    /*do
        {  
            temp=temp->get_successivo();
            ++i;
        } while(i!=(posizione-1));*/
        for (i=1; i<(posizione-1); i++)
            {  
            temp=temp->get_successivo();
            ++i;
            }

            if(i==(posizione-1))
            {
                tempdue=temp->get_successivo();
                pn=new Nodo(info, tempdue);
                temp->set_successivo(pn);
            }
}
 
quella per inserirlo in una posizione definita dall'utente anche (solo il primo non si può modificare)…..
Puoi inserirlo anche in testa: salvi primo in una variabile, crei un nuovo nodo e lo metti come primo, cambi il valore del successivo di primo in modo che punti al vecchio primo.


dopo aver stampato ricevo sempre l'errore segmentation fault
Nella stampa non hai bisogno di prendere un parametro, sai che la lista è finita quando il prossimo elemento è NULL
Codice:
void Lista::print_lista()
{
    Nodo *it = primo;

    while (it != NULL)
    {
        cout << "\n" << it->get_dato();
        it = it->get_successivo();
    }
}


PHP:
        for (i=1; i<(posizione-1); i++)
            {
            temp=temp->get_successivo();
            ++i;
            }
Sicuro che sia giusto?
 
Stato
Discussione chiusa ad ulteriori risposte.