|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Oct 2006
Messaggi: 112
|
[C++] Eliminare elemento da lista
Salve. Anticipo che da circa un mese tento disperatamente di trovare l'errore in questo programma:
Codice:
/* Costruire una lista di caratteri, stampare i valori, eliminare
tutti i caratteri che sono vocali, stampare la nuova lista.*/
#include <iostream>
using namespace std;
class lista {
private:
char num;
lista *prox;
public:
lista(void);
void set (int new_num) {num = new_num;};
char get_num() {return num;};
void collega (lista *new_lista) {prox = new_lista;};
lista *get_prox () {return prox;};
};
void inserisci (char nuovo);
void visualizza (void);
void elimina (lista *elem);
void elimina_vocali(void);
int is_vocal(char lettera);
lista *primo = NULL;
lista *ultimo = NULL;
lista *nuovalista;
int main() {
int menu;
char val;
int risp=40;
cout << "Cosa vuoi fare?" << endl;
cout << "1) Inserimento" << endl;
cout << "2) Visualizza lista" << endl;
cout << "3) Esci ";
cin >> menu;
switch (menu)
case 1:
{
while (risp != 0) {
cout << "\nInserisci il nuovo carattere: ";
cin >> val;
inserisci(val);
cout << "Inserisci 0 per uscire" <<endl;
cin >> risp;
};
break;
case 2:
visualizza();
elimina_vocali();
visualizza();
break;
case 3:
return 0;
}
system("cls");
main ();
return 0;
}
lista::lista() {
num = 1;
prox = NULL;
}
void inserisci (char nuovo)
{
nuovalista = new (lista);
nuovalista -> set (nuovo);
if (primo == NULL)
{
primo = nuovalista;
ultimo = nuovalista;
}
else
{
ultimo -> collega (nuovalista);
ultimo = nuovalista;
}
};
int is_vocal(char lettera)
{
switch (lettera) {
case 'a':
return 1;
case 'e':
return 1;
case 'i':
return 1;
case 'o':
return 1;
case 'u':
return 1;
case 'A':
return 1;
case 'E':
return 1;
case 'I':
return 1;
case 'O':
return 1;
case 'U':
return 1;
default:
return 0;
}
};
void elimina_vocali(void)
{
lista *app, *punt_prec;
app = primo;
punt_prec = primo;
if (is_vocal(app -> get_num()) == 1)
{
primo = app -> get_prox();
delete (app);
}
else
{
while (app != NULL)
{
if (is_vocal (app -> get_num()) == 1)
elimina(punt_prec);
punt_prec = app;
// cout << app -> get_num();
app = app -> get_prox();
};
}
};
void elimina (lista *prec)
{
// cout << "precedente VALORE: " << prec -> get_num() << endl;
lista *prossimo, *curr;
curr = prec -> get_prox();
// cout << "current: " << curr << endl << curr -> get_num() << endl;
prossimo = curr -> get_prox();
// cout << "prossimo: " << prossimo << endl << prossimo -> get_num() << endl;
delete (curr);
prec -> collega (prossimo);
// cout << "preced: " << prec << endl << prec -> get_num() << endl;
// cout << (prec -> get_prox()) -> get_num();
system("PAUSE");
};
void visualizza (void) {
lista *app;
app = new(lista);
app = primo;
if (app == NULL)
cout << "\n\n\n\n La lista risulta essere vacante!" << endl << " ";
else
{
while (app != NULL) {
cout << app -> get_num() << "\n";
app = app -> get_prox();
}
}
system("PAUSE");
};
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Non hai detto che tipo di errore da' il codice
Ci ho preso?
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN |
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2006
Messaggi: 112
|
Allora mi spiego meglio: l'errore è un loop a runtime. Succede solo quando la vocale non è la prima e sta in mezzo alla lista. Tra l'altro, ho identificato il problema nella funzione "elimina", perchè se non la richiamo, il programma gira bene... Ora non so se è un problema di passaggio di parametri... Magari, dato che sei l'unica anima pia che ha scelto di aiutarmi, puoi eseguirlo e vedi direttamente a runtime cosa fa???In ogno caso, ricontrollerò il tutto seguendo i tuoi consigli...
Per il punto 1 hai ragione, ma mi son bloccato nell'implementazione del codice in quanto non funge l'eliminazione in mezzo... perciò me lo son lasciato come problema da risolvere dopo... Ultima modifica di Markycap : 18-08-2011 alle 15:21. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2002
Città: Trento
Messaggi: 962
|
Prova con questo metodo "elimina_vocali":
Codice:
void elimina_vocali() {
lista* curr, prec;
curr = primo;
prec = NULL;
while(curr != NULL) {
if (is_vocal(curr -> get_num()) == 1) {
if (prec == NULL) {
// Elimina il primo elemento
primo = primo -> get_prox();
delete(curr);
curr = primo;
} else {
// Elimina l'ennesimo elemento
prec -> collega(curr -> get_prox());
delete(curr);
curr = prec -> get_prox();
}
} else {
prec = curr;
curr = curr -> get_prox();
}
}
// Per aggiornare il puntatore all'ultimo elemento
ultimo = prec;
}
Mi sono reso conto, tra l'altro, che non aggiorni il puntatore all'ultimo elemento della lista, così ho aggiunto l'istruzione in fondo alla routine. Fammi sapere se così va bene.
__________________
"Et Eärallo Endorenna utúlien. Sinome maruvan ar Hildinyar tenn' Ambar-metta!" -- Aragorn Elessar, Heir of Isildur Mixmar -- OpenSuSE 11.1 on AMD 64 3000+ on DFI LanParty nF4-D | GeForce 6600 GT + Thermaltake Schooner on Samsung 710N Storage -- ( 2 x Hitachi Deskstar 80 Gb + 1 x Hitachi 250 Gb ) = 1 RAID 5 + 1 Storage space LaCie Ethernet Disk Mini 250 Gb | HP - DV2150 EL MILAN CLAN Ultima modifica di Mixmar : 19-08-2011 alle 10:06. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Oct 2006
Messaggi: 112
|
FUNZIONAAAAAA!
Sei stato un gran signore |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:31.



















