PDA

Visualizza la versione completa : [C++] Cancellazione elemento da una lista


DarkTiger
13-12-2016, 19:51
Per favore, avrei bisogno di capire come cancellare un elemento da una lista in C++, in pratica questo il programma:
Si deve creare una lista di pazienti formata da nome, cognome e et.
Poi inseriti i dati, si possono fare 5 cose:
1)aggiungere un nuovo paziente in coda alla lista
2)cancellare un paziente dalla lista (che non sono riuscito a fare)
3)stampare a video la lista
4)svuotare la lista
5)termina il programma

Per favore aiutatemi, ci ho provato diverse volte, non so cosa ci sia di sbagliato!

Questo l'intero codice:



#include <iostream>
using namespace std;


struct lista
{
string paz; //nome
string paz2; //cognome
int paz3; //et
lista *punt;
};


int main()
{
lista *nodo, *nodo_iniziale;
string nome;
string cogn;
int eta;
short int num; //scelta dello switch case
nodo_iniziale=NULL;
cout<<"Inserire nome paziente: "<<endl;
cin>>nome;
cout<<"Inserire cognome paziente: "<<endl;
cin>>cogn;
cout<<"Inserire eta' del paziente: (tra 1 e 110)"<<endl;
do
cin>>eta;
while(eta<1 || eta>110);

while(nome!="stop") //creazione della lista e inserimento dei vari pazienti
{
nodo=new lista;
nodo->paz=nome;
nodo->paz2=cogn;
nodo->paz3=eta;
nodo->punt=nodo_iniziale;
nodo_iniziale=nodo;
cout<<"Inserire nome paziente; inserire stop per terminare"<<endl;
cin>>nome;
if(nome=="stop")
goto fine;
cout<<"Inserire cognome paziente: "<<endl;
cin>>cogn;
cout<<"Inserire eta' del paziente: (tra 1 e 110)"<<endl;
do
cin>>eta;
while(eta<1 || eta>110);
}


fine:


do{
cout<<"Inserisci 1 per accodare un nuovo paziente in coda alla lista."<<endl; //men
cout<<"Inserisci 2 per cancellare un paziente dalla lista."<<endl;
cout<<"Inserisci 3 per visualizzare l'elenco dei pazienti."<<endl;
cout<<"Inserisci 4 per svuotare la lista."<<endl;
cout<<"Inserisci 5 per far terminare il programma."<<endl;
do cin>>num;
while(num<1 || num >5);


cout<<endl;


switch(num)
{
case 1:
lista *nodo_finale; //accodamento nuovo paziente
cout<<"Inserisci nome nuovo paziente: "<<endl;
cin>>nome;
cout<<"Inserisci cognome paziente: "<<endl;
cin>>cogn;
cout<<"Inserisci eta' del paziente: "<<endl;
do
cin>>eta;
while(eta<1 || eta>110);
nodo->paz=nome;
nodo->paz2=cogn;
nodo->paz3=eta;
nodo->punt=nodo_iniziale;
nodo_iniziale=nodo;
nodo_finale=nodo;
break;
case 2:
lista *pos;
bool trovato; //cancellazione di un paziente
cout<<"Inserisci nome paziente da cancellare: "<<endl;
cin>>nome;
cout<<"Inserisci cognome paziente: "<<endl;
cin>>cogn;
cout<<"Inserisci eta' del paziente: "<<endl;
do
cin>>eta;
while(eta<1 || eta>110);
pos=nodo_iniziale;
trovato=false;
while((pos!=NULL)&&(!trovato))
{
if(pos->paz==nome && pos->paz2==cogn && pos->paz3==eta)
{
trovato=true;
pos=NULL;
delete pos;
}
else
{
pos=pos->punt;
}
}


break;
case 3: //visualizzazione della lista
while(nodo!=NULL)
{
cout<<nodo->paz<<endl;
cout<<nodo->paz2<<endl;
cout<<nodo->paz3<<endl;
nodo=nodo->punt;
}
break;
case 4: //svuotamento della lista
nodo=NULL;
delete nodo;
break;
}
}while(num!=5);
}

torn24
15-12-2016, 10:44
Darei alcuni consigli, secondo me il programma da rivedere e riscrivere.
Hai queste cose da implementare

1)aggiungere un nuovo paziente in coda alla lista
2)cancellare un paziente dalla lista (che non sono riuscito a fare)
3)stampare a video la lista
4)svuotare la lista
5)termina il programma

1) Il programma propone un menu con queste opzioni, in un do while()
2) Per ogni punto devi implementare una funzione che lo svolga, eccetto il punto 5, che puoi limitarti
a terminare

3) il punto uno dice di inserire il nuovo nodo in coda alla lista, quindi scorrerla se diversa da NULL, e inserire alla fine il nuovo nodo, utilizzare un puntatore temporaneo per poter scorrere,
*tmp= lista, e poi scorri tmp fino a NULL.

4) Per cancellare un nodo, trovare il nodo da cancellare, salvarlo in un puntatore temporaneo, collegare il nodo che lo precede al nodo successivo, e poi liberare memoria.




lista* EliminaNodo(lista *p){




lista *pos=p;
lista *tmp=NULL;
bool trovato;//cancellazione di un paziente
cout<<"Inserisci nome paziente da cancellare: "<<endl;
cin>>nome;
cout<<"Inserisci cognome paziente: "<<endl;
cin>>cogn;
cout<<"Inserisci eta' del paziente: "<<endl;
do
cin>>eta;
while(eta<1|| eta>110);
trovato=false;
// Se il primo nodo da eliminare
if(pos->paz==nome && pos->paz2==cogn && pos->paz3==eta){


tmp=pos; //salvo il riferimento al nodo da canellare
pos=pos->punt; // salto il nodo e passo al sucessivo
delete tmp; // elimino
return pos ;// esco dalla funzione
}
// Se un nodo diverso dal primo
while((pos->punt!=NULL)&&(!trovato)){

if(pos->punt->paz==nome && pos->punt->paz2==cogn && pos->punt->paz3==eta)
{
trovato=true;
tmp=pos->punt; //salvo il riferimento al nodo da canellare
pos->punt=pos->punt->punt; // salto il nodo e passo al sucessivo
delete tmp; // elimino
return p ;// esco dalla funzione
}

pos=pos->punt;
}//end while

}// end function

DarkTiger
18-12-2016, 15:24
Grazie mille, finalmente ho risolto questo problema!

Loading