PDA

Visualizza la versione completa : [C++] errore Windows durante esecuzione


Salvatore_91
29-01-2009, 19:11
Ciao.
Questo mio programma, fa caricare due LISTE con campo informativo intero.
Gli elementi devono essere inseriti in ordine CRESCENTE in tutte e due le liste.
Io dovrei crearne un'altra , ordinata in ordine decrescente.
Adesso questo mio programma dovrebbe funzionare se le 2 liste hanno lo stesso numero di NODI.
Questo e' il codice, compilandolo non mi da nessun errore, ma eseguendolo, dopo aver caricato le due liste, mi segnala di fare la segnalazione a Windows, perche' si e' verificato un errore.


#include <iostream>
using namespace std;

struct lista
{
int num;
lista *punt;
};


int main()
{
lista **x,*y,*T1,*T2;
char ins;
cout <<"Inserisci gli elementi nelle 2 LISTE in ordine crescente."<<endl;
cout <<"Verra' creata una contenente i nuemri in ordine DECRESCENTE!.\n"<<endl;

//Caricamento 1° LISTA
lista p; //P TESTA DELLA LISTA 1
cout <<"LISTA 1 - Inserisci il numero = ";
cin >> p.num;
x=&p.punt; //conservo il campo puntatore
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins!='s' || ins!='S') // nel caso in cui viene inserito
p.punt=NULL; // solo un nodo

while (ins=='s' || ins=='S')
{
lista *pp = new lista;
cout <<"LISTA 1 - Inserisci il numero = ";
cin >> pp->num;
*x=pp;
x=&pp->punt; //inserimenti in coda alla LISTA
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins=='n' || ins=='N')
pp->punt=NULL;
}
// FINE caricamento 1° LISTA

//Caricamento 2° LISTA
lista q; //Q TESTA DELLA LISTA 2
cout <<"LISTA 2 - Inserisci il numero = ";
cin >> q.num;
x=&q.punt; //conservo il campo puntatore
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins!='s' || ins!='S') // nel caso in cui viene inserito
q.punt=NULL; // un solo nodo

while (ins=='s' || ins=='S')
{
lista *qq = new lista;
cout <<"LISTA 2 - Inserisci il numero = ";
cin >> qq->num;
*x=qq;
x=&qq->punt; //inserimenti in coda alla LISTA
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins=='n' || ins=='N')
qq->punt=NULL;
}
T1=&q; //Assegno T1 come indice al posto di 'q' (T1 = puntatore a LISTA)
T2=&p;
if (p.num >= q.num)
{
lista *coda = new lista; //crea coda della LISTA
coda->num=q.num;
coda->punt=NULL;
T1=T1->punt;
y=coda;
}
else
{
lista *coda = new lista; //crea coda della LISTA
coda->num=p.num;
coda->punt=NULL;
T2=T2->punt;
y=coda;
}
while (T1->punt || T2->punt != NULL)
{
if (T1->num >= T2->num)
{
lista *t = new lista;
t->num = T2->num;
T2=T2->punt;
t->punt=y;
y=t;
}
else
{
lista *t = new lista;
t->num = T1->num;
T1=T1->punt;
t->punt=y;
y=t;
}
}
//STAMPA
lista *TESTA=y;
while(TESTA)
{
cout<<TESTA->num<<endl;;
TESTA=TESTA->punt;
}


system("PAUSE");
}

Pacio88
29-01-2009, 19:41
Sinceramente trovo un po' caotico il tuo codice(non me ne volere :D), infatti ho difficoltà a capire quali sono le tue intenzioni in alcuni passaggi. Perchè se utilizzi più volte il caricamento di una lista non crei una funzione apposita e la richiami ogni volta che ne hai bisogno, così oltre risparmiare tempo miglioreresti anche la leggibilità del codice.

Poi non capisco molto perchè dici che conservi il campo puntatore...

Io la funzione per caricare la lista l'avrei fatta così:

lista* initLista(){
bool condition = true;
char c;
lista* li = NULL;
while(condition)
{
lista* p = new lista;
cout << "Inserisci un valore: ";
cin >> p->num;
p->punt = li;
li = p;
cout << "Vuoi inserire un nuovo valore?(s/n)";
cin >> c;
if(c=='n' || c=='N')
condition = false;
}
return li;
}

Salvatore_91
29-01-2009, 19:45
Il commento che dico conservo il campo puntatore ho dimenticato di cancellarlo.

oregon
29-01-2009, 19:52
Il problema avviene nella linea



while (T1->punt || T2->punt != NULL)


in conseguenza di un'assegnazione non corretta di T1 o T2 ...

Ma non so cosa dirti perche' prima vorrei capire a cosa serve questa parte di codice ...



T1=&q; //Assegno T1 come indice al posto di 'q' (T1 = puntatore a LISTA)
T2=&p;
if (p.num >= q.num)
{
lista *coda = new lista; //crea coda della LISTA
coda->num=q.num;
coda->punt=NULL;
T1=T1->punt;
y=coda;
}
else
{
lista *coda = new lista; //crea coda della LISTA
coda->num=p.num;
coda->punt=NULL;
T2=T2->punt;
y=coda;
}


Dire che il codice e' abbastanza confuso, e' un eufemismo ...

Pacio88
29-01-2009, 20:02
Originariamente inviato da oregon
Ma non so cosa dirti perche' prima vorrei capire a cosa serve questa parte di codice ...



T1=&q; //Assegno T1 come indice al posto di 'q' (T1 = puntatore a LISTA)
T2=&p;
if (p.num >= q.num)
{
lista *coda = new lista; //crea coda della LISTA
coda->num=q.num;
coda->punt=NULL;
T1=T1->punt;
y=coda;
}
else
{
lista *coda = new lista; //crea coda della LISTA
coda->num=p.num;
coda->punt=NULL;
T2=T2->punt;
y=coda;
}


Dire che il codice e' abbastanza confuso, e' un eufemismo ...

Concordo pienamente. Per quanto riguarda il commento, nonostante sia stata una tua dimenticanza, non comprendo lo stesso quale sia l'utilità di salvare il "campo puntatore" che tu fai..

Salvatore_91
30-01-2009, 15:30
Allora, ragazzi, vi rispiego il funzionamento del programma.
Inserite due Liste in ordine crescente, ne viene creata un altra ordinata in DECRESCENTE.
Quindi questo mio pezzo di programma, dovrebbe se sono inserite i seguenti numeri, stampare almeno '1' e '2'.
Numeri da inserire: 1 LISTA = 1 , 2 , 3
Numeri da inserire: 2 LISTA = 4 , 5 , 6


#include <iostream>
using namespace std;

struct lista
{
int num;
lista *punt;
};


int main()
{
lista *x,*y,*T1,*T2;
char ins;
cout <<"Inserisci gli elementi nelle 2 LISTE in ordine crescente."<<endl;
cout <<"Verra' creata una contenente i numeri in ordine DECRESCENTE!.\n"<<endl;

//Caricamento 1° LISTA
lista p; //P TESTA DELLA LISTA 1
cout <<"LISTA 1 - Inserisci il numero = ";
cin >> p.num;
x=&p;
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins!='s' || ins!='S') // nel caso in cui viene inserito
p.punt=NULL; // solo un nodo

while (ins=='s' || ins=='S')
{
lista *pp = new lista;
cout <<"LISTA 1 - Inserisci il numero = ";
cin >> pp->num;
pp->punt = NULL;;
x->punt = pp;
x = pp; //inserimenti in coda alla LISTA
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
}
// FINE caricamento 1° LISTA

//Caricamento 2° LISTA
lista q; //Q TESTA DELLA LISTA 2
cout <<"LISTA 2 - Inserisci il numero = ";
cin >> q.num;
x=&q;
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
if (ins!='s' || ins!='S') // nel caso in cui viene inserito
q.punt=NULL; // un solo nodo

while (ins=='s' || ins=='S')
{
lista *qq = new lista;
cout <<"LISTA 2 - Inserisci il numero = ";
cin >> qq->num;
qq->punt = NULL;
x->punt = qq;
x = qq; //inserimenti in coda alla LISTA
cout <<"Devi inserire ? (s/n) = ";
cin >>ins;
}
T1=&p; //Assegno T1 = 'p' (T1 = puntatore a LISTA)
T2=&q;
if (T1->num >= T2->num)
{
lista *coda = new lista; //crea coda della LISTA
coda->num = T2->num;
coda->punt = NULL;
T2 = T2->punt;
y = coda;
}
else
{
lista *coda = new lista; //crea coda della LISTA
coda->num = T1->num;
coda->punt = NULL;
T1 = T1->punt;
y = coda;
}
while (T1->punt || T2->punt != NULL)
{
if (T1->num >= T2->num)
{
lista *t = new lista;
t->num = T2->num;
T2=T2->punt;
t->punt=y;
y=t;
}
else
{
lista *t = new lista;
t->num = T1->num;
T1=T1->punt;
t->punt=y;
y=t;
}
}
lista *TESTA=y;
while(TESTA)
{
cout<<TESTA->num<<endl;;
TESTA=TESTA->punt;
}


system("PAUSE");
}


Vi trovate secondo il mio ragionamento??.
Invece durante l'esecizione mi segnala di fare la segnalazione errori a Windows.

oregon
30-01-2009, 15:35
Scusa ma questo tuo post e' inutile ...

Non hai detto nulla di quanto ti ho chiesto e nulla di piu' di quanto non si sapesse ...

Quello che ti avevo chiesto era di spiegare a cosa servisse il pezzo di codice che ti ho mostrato, ma non lo hai fatto ...

Fra l'altro, e' inutile mostrare nuovamente TUTTO il codice che hai gia' mostrato ... mostra il pezzo di cui ti ho chiesto e indica, linea per linea, cosa intendi fare ...

Salvatore_91
30-01-2009, 15:44
eeeeh, infatti quel pezzo di codice che mi hai mostrato, l'ho cambiato un po' nell'ultimo mio post.!


T1=&p; //Assegno T1 = 'p' (T1 = puntatore a LISTA)
T2=&q;
if (T1->num >= T2->num)
{
lista *coda = new lista; //crea coda della LISTA
coda->num = T2->num;
coda->punt = NULL;
T2 = T2->punt;
y = coda;
}
else
{
lista *coda = new lista; //crea coda della LISTA
coda->num = T1->num;
coda->punt = NULL;
T1 = T1->punt;
y = coda;
}

oregon
30-01-2009, 15:52
Salvatore ... certe volte penso che tu non legga i post ...

A COSA SERVE quel codice???

Salvatore_91
30-01-2009, 15:59
Poiche' le due LISTE sono date in INPUT in ordine crescente, quel codice esegue il controllo tra il primo elemento della 1° lista e il primo elemento della 2° lista, dopodiche' trovato il piu' piccolo lo mette in uno nodo chiamato CODA che viene collegato a NULL.

T1=T1->punt : fa avanzare il puntatore al nodo successivo (anche T2=T2->punt).
coda->num = T2->num; : mette in coda->num, il valore presente in T2->num.

Loading