PDA

Visualizza la versione completa : [C++] Collegare elementi di una lista linkata


Nikita82
11-09-2009, 00:33
Salve! Ho implementato questa semplice lista linkata, in cui devo collegare tra loro due o pi box tramite l'utilizzo di puntatori, ma la funzione che ho utilizzato nel mio programma, point_at_next() non fa bene il suo compito. Qualcuno pu gentilmente suggerirmi dove sbaglio? E' da troppo tempo che ci provo ormai.. :dh: :bh:
Ecco qui il mio codice :



#include <iostream.h>
using namespace std;

class BOX {
private:
int a;
BOX *next;

public:
BOX(void) { a = 0; next = NULL; }
void set(int n) { a = n; }
void point_at_next(BOX *last, BOX *nuovo_scat) { last->next = nuovo_scat; last = nuovo_scat; }
int leggiDato(void) { return a; }
void stampa(BOX *start);
};

void BOX::stampa(BOX *start)
{
BOX *p;

p = start;

if (p == NULL)
cout << "Lista vuota!\n";
else {
cout << "Gli elementi della lista sono : " << p->a;
p = p->next;
}
}


main()
{
BOX *st = NULL;
BOX *ultimo, *nuovo;
int num = 0;
BOX *box;
int scelta = 0;

BOX();

do {
cout << "--------------------------------------------------------------------------------\n";
cout << " LISTA LINKATA \n";
cout << "--------------------------------------------------------------------------------\n\n";
cout << "Digita '0' per aggiungere un nuovo elemento alla lista; '1' per collegare \n";
cout << "l'ultimo elemento della lista col nuovo; '2' per stampare la lista; '99' per \n";
cout << "uscire dal programma.\n\n";
cout << "Effettua una scelta: ";

cin >> scelta;

switch (scelta) {
case 0 :
cout << "Inserisci il numero da aggiungere alla lista : ";
cin >> num;
box = new BOX;
box->set(num);
break;

case 1 :
box->point_at_next(ultimo, nuovo);
break;

case 2 :
box->stampa(st);
break;

case 99 :
cout << "Uscita dal programma!\n\n";
break;

default :
cout << "Sorry! Bad menu selection!\n\n";
break;
}
} while (scelta != 99);

system("pause");
return 0;
}

Stoicenko
11-09-2009, 10:27
ps: la stampa sbagliata.. dovrebbe esserci un while non un if..

cmq la funzione non fa il suo dovere perch la chiami in modo sbagliato.. tipo gli passi 2 puntatori che puntato al nulla.. ultimo e nuovo non sono usati nel main..

Nikita82
11-09-2009, 23:21
ultimo e nuovo non sono usati nel main..


Ciao, Stoicenko! Che cosa intendi con "non sono usati", non li devo usare? Perch sono gli argomenti attuali della funzione point_at_next()..

MacApp
12-09-2009, 01:49
Gi eliminare i seguenti potrebbe servire:


$ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp
In file included from /usr/include/c++/4.0.0/backward/iostream.h:31,
from main.cpp:1:
/usr/include/c++/4.0.0/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
main.cpp:32: error: ISO C++ forbids declaration of 'main' with no type

se il tuo compilatore non ti evidenzia i problemi sopra elencati, allora cambialo (il compilatore).

dato che ci sei elimina (non portabile e puoi ottenere lo stesso effetto senza alcuna istruzione, semplicemente cambiando il modo con cui esegui il tuo programma, ad esempio invocandolo direttamente da terminal, o settando opportunamente un breakpoint nel debugger):


system ("pause");


In ogni modo come ti ha gi detto Stoicenko, i puntatori "ultimo e "nuovo" hanno dei valori indefiniti quando chiami:


box->point_at_next(ultimo, nuovo);

il che significa che il tuo programma ha un comportamento indefinito

Nikita82
13-09-2009, 22:00
Ho praticamente riscritto tutto il programma, perch effettivamente non aveva molto senso. La funzione stampa(), per, presenta tuttora delle imprecisioni; dopo aver fatto l'apposito debug, come giustamente consigliato da MacApp, gli errori sono di sicuro nelle righe 48 e 51. Visualizzo in output dei numeri a caso, anzich i numeri da me inseriti.. :nillio:
Questo il codice ora:


#include <iostream.h>

class BOX {
public:
int a; // Numero inserito dall'utente nella lista
BOX *next; // Puntatore al prossimo elemento
BOX *start;
BOX *last;

BOX(void) { int a = 0; next = NULL; start = NULL; last = NULL; } // Costruttore
void setDato(int);
void stampa(void);
~BOX(void);
};

void BOX::setDato(int a)
{
BOX *temp;

if (start == NULL) {
temp = new BOX;
start = temp;
last = temp;
} else {
temp = new BOX;
last->next = temp;
last = temp;
}
}

void BOX::stampa(void)
{
BOX *temp = start;

if (temp == NULL)
cout << "La lista e' vuota!\n\n";
else {
cout << "Gli elementi della lista sono : \n";
while (temp->next != NULL) {
cout << temp << "\n";
temp = temp->next;
cout << temp->a << "\n";
}
}
}

BOX::~BOX(void)
{
cout << "BOX destructor speaking : \n\n";
start = NULL;
last = NULL;

if (start != NULL && next != NULL)
cerr << "Error: Trying to destroy a non-empty BOX!\n\n";
}

main()
{
int n = 0;
BOX box;
int choice = 0;

BOX();

do {
cout << "--------------------------------------------------------------------------\n";
cout << " LISTA LINKATA \n";
cout << "--------------------------------------------------------------------------\n\n";
cout << "Digita : 1) per inserire un elemento nella lista;\n";
cout << "2) Stampare la lista;\n";
cout << "0) Uscire dal programma.\n\n";
cout << "Effettua una scelta: ";
cin >> choice;

switch (choice) {
case 1 :
cout << "Inserisci un numero da aggiungere alla lista : ";
cin >> n;
cout << "\n\n";
box.setDato(n);
break;

case 2 :
box.stampa();
break;

case 0 :
cout << "Exiting program!\n\n";
break;

default :
cout << "Sorry! Bad menu selection!\n\n";
break;
}
} while (choice != 0);
return 0;
}

:ciauz:

fenics
14-09-2009, 02:33
esatto

Nikita82
14-09-2009, 14:58
Nessuno pu darmi qualche piccolo suggerimento??

Nikita82
17-09-2009, 17:54
:confused: :cry:

Stoicenko
17-09-2009, 18:19
che cos' quel BOX(); in mezzo al codice? :confused: :confused:

cmq la stampa sempre sbagliata.. parti stampando il primo ma quando arrivi alla fine non stampi di sicuro l'ultimo..

Loading