Lista ordinata

di il
6 risposte

Lista ordinata

Perchè questo programma che ho fatto non mi stampa la lista ordinata. La push sembra fatta bene. Cioè se la lista è vuota inserisce in testa ovviamente, altrimenti scansiona la lista fino a trovare un elemento che è maggiore di quello inserito dopodichè crea il nuovo record il puntatore del precedente punta al nuovo record, e il puntatore succ del nuovo record si collega al successivo p->succ->succ. Il programma compila ma non esegue correttamente. Dov'è l'errore..?
File Lista.h

#ifndef LISTA_H
#define LISTA_H

struct Record
{
       int elem;
       Record *succ;
};

class Lista
{
      private:
               Record *testa;
      public:
               Lista() : testa(0) {}
               ~Lista();
               void push (const int& el);
               void pop();
               bool vuota() const { return (testa == 0); }
               void stampa() const;
};

#endif
FIle Lista.cpp

#include <iostream>
#include "Lista.h"

using namespace std;

Lista :: ~Lista()
{
      Record *temp;
      while (testa)
      {
            temp = testa;
            testa = testa->succ;
            delete temp;
      }
}

void Lista :: push (const int& el)
{
       if(vuota())
       {
       Record *re = new Record;
       re->elem = el;
       re->succ = testa;
       testa = re;
       }
       else
       {
           Record *p = testa;
           bool trovato = false;
           while ((p->succ) && (!trovato))
           {
                 if (p->succ->elem > el)
                 {
                                   Record *re = new Record;
                                   re->elem = el;
                                   p->succ = re;
                                   re->succ = p->succ->succ;
                                   trovato = true;
                 }
           }
       }
}

void Lista :: pop()
{
     if (vuota())
        cout << "Pop non possibile. Lista vuota!\n";
     else
     {
         Record *temp = testa;
         testa = testa->succ;
         delete temp;
     }
}

void Lista :: stampa() const
{
     if (vuota())
        cout << "Lista vuota\n";
     else
     {
         Record *temp = testa;
         while (temp);
         {
               cout << temp->elem << " ";
               temp = temp->succ;
         }
     }
}
FIle main.cpp

#include <iostream>
#include <cstdlib>
#include "Lista.h"

using namespace std;

int main ()
{
      Lista l;
      l.push(10);
      l.push(8);
      l.push(9);
      l.stampa();
      l.pop();
      l.pop();
      l.pop();
      l.pop();
      
      system ("pause");
      return 0;
}

6 Risposte

  • Re: Lista ordinata

    Guarda con in debugger l'inserimento del secondo. Non c'è un case in cui cade sto inserimento perche dopo l'inserimento del primo testa->succ = 0. e il ciclo while esce subito.
  • Re: Lista ordinata

    L'ho aggiustato ma continua a compilare ma non eseguire correttamente. Esce la finestra di esecuzione vuota, come se si bloccasse. Ma credo di non aver mancato nulla...Mah. Dacci una occhiata pure te...
    
    #include <iostream>
    #include "Lista.h"
    
    using namespace std;
    
    Lista :: ~Lista()
    {
          Record *temp;
          while (testa)
          {
                temp = testa;
                testa = testa->succ;
                delete temp;
          }
    }
    
    void Lista :: push (const int& el)
    {
           if(vuota() || testa->elem > el)
           {
                      Record *re = new Record;
                      re->elem = el;
                      re->succ = testa;
                      testa = re;
           }
           else if (testa->elem < el)
           {
                      Record *re = new Record;
                      re->elem = el;
                      re->succ = 0;
                      testa->succ = re;
           }
           else
           {
                      Record *p = testa;
                      bool trovato = false;
                      while ((p->succ) && (!trovato))
                      {
                            if (p->succ->elem > el)
                            {
                                       Record *re = new Record;
                                       re->elem = el;
                                       p->succ = re;
                                       re->succ = p->succ->succ;
                                       trovato = true;
                            }
                      }
           }
    }
    
    void Lista :: pop()
    {
         if (vuota())
            cout << "Pop non possibile. Lista vuota!\n";
         else
         {
             Record *temp = testa;
             testa = testa->succ;
             delete temp;
         }
    }
    
    void Lista :: stampa() const
    {
         if (vuota())
            cout << "Lista vuota\n";
         else
         {
             Record *temp = testa;
             while (temp);
             {
                   cout << temp->elem << " ";
                   temp = temp->succ;
             }
         }
    }
    
    Il main e l'altro file sono sempre quelli...
  • Re: Lista ordinata

    Non l'ho testato ma come logica dovremmo esserci
    
    void Lista :: push (const int& el)
    {
    	if(vuota())
    	{
    		Record *re = new Record;
    		re->elem = el;
    		re->succ = testa;
    		testa = re;
    	}
    	else
    	{
    		Record *p = testa;
    		if(!p->succ)
    		{
    			Record *re = new Record;
    			re->elem = el;
    			if(p->elem > el)
    			{
    				re->succ = p;
    				p = re;		
    			}
    			else
    			{
    				re->succ = p->succ; //= NULL
    				p->succ = re;
    			}
    		}
    		else
    		{
    			while ((p->succ) && (p->succ->elem < el))
    			{
            	                p = p->succ;
    			}
    			re->succ = p->succ;
    			p->succ = re;
    		}		
    	}
    }
    
  • Re: Lista ordinata

    Non funziona purtroppo neanche il tuo algoritmo. Compila ma non esegue...
  • Re: Lista ordinata

    Ecco la soluzione. Sempre il debug ti mostra dov'è lo sbaglio.
    
    void Lista :: push (const int& el)
    {
    	if(vuota())
    	{
    		Record *re = new Record;
    		re->elem = el;
    		re->succ = testa;
    		testa = re;
    	}
    	else
    	{
    		Record *p = testa;
    		Record *re = new Record;
    		re->elem = el;
    		if(!testa->succ)
    		{
    			if(testa->elem > el)
    			{
    				re->succ = testa;
    				testa = re;		
    			}
    			else
    			{
    				re->succ = p->succ; //= NULL
    				p->succ = re;
    			}
    		}
    		else
    		{
    			if(testa->elem > el)
    			{
    				re->succ = testa;
    				testa = re;
    			}
    			else
    			{
    				while ((p->succ) && (p->succ->elem < el))
    				{
    					p = p->succ;
    				}
    				re->succ = p->succ;
    				p->succ = re;
    			}
    		}		
    	}
    }
    
    Nel caso tuo lo sbaglio sta nella funzione stampa
    
    void Lista :: stampa() const
    {
    	if (vuota())
    		cout << "Lista vuota\n";
    	else
    	{
    		Record *temp = testa;
    		while (temp); //togliere il ;
    		{
    			cout << temp->elem << " ";
    			temp = temp->succ;
    		}
    	}
    }
    
  • Re: Lista ordinata

    Che puttanata! Grazie skynet
Devi accedere o registrarti per scrivere nel forum
6 risposte