|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
[c++]Eliminazione elementi doppi da lista ordinata
salve nn riesco a capire dove sbaglio....
ho bisogno di variare questa parte di programma in modo che la funzione mi cancelli gli elementi nel caso in cui ce ne siano 2 dello stesso nome: Codice:
void eliminazione() { string nome; persona *p; persona *prec = NULL; cout <<"inserire nome da cancellare: "; cin >> nomec; if ( pt == null) { cout <<"lista vuota!"; return; } for (p=pt;p!=NULL && p -> nome !=nomec) { prec = pi; } if (p==NULL) { cout <<"nome non trovato!"; return; } if (prec == NULL) { pt == p -> succ; delete p; } else { prec -> succ= p -> succ; delete p; } } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Se la lista è ordinata in base al contenuto degli elementi è sufficiente confrontare un elemento col successivo e se sono uguali chiamare una funzione che elimina un elemento e ripristina la catena dei puntatori.
Codice:
struct elem { int cont; elem* next; } void elimina(elem*, elem*); int main(void) { elem* testa; elem* temp; [...] inizializzazioni varie for(temp = testa; temp->next == NULL; temp = temp->next) if(temp->cont == temp->next->cont) elimina(testa, temp->next); return 1; } void elimina(elem* t, elem* e) { elem* temp; for(temp = t; temp->next == NULL; temp = temp->next) if(temp->next == e) { temp->next = temp->next->next; delete temp->next; } } |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
si ma io vorrei modificare la funzione che ho postato nn me ne serve un'altra
![]() io cerco di partire da quella |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Leggi bene quella che ti ho postato io e incorpora quanto ci trovi di buono allora...
|
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
era proprio quello il problema
![]() |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
![]() ![]() ![]() Non ci trovi nulla di buono? Purtroppo il codice da te postato ha parecchi errori di forma e concettuali, non saprei proprio come modificarlo in maniera ortodossa... Per imparare non c'è niente di meglio che guardare del buon codice, capirne i concetti e farli propri. Una domanda, ma usi C o C++? Perchè se usi C++ è sconsigliato usare NULL per motivi di consistenza dei tipi. Inoltre in una funzione void è meglio evitare l'uso di return vuote, è un purismo ma in grossi software complessi garantisce solidità. es. Codice:
if(a!=0) { ... return 1; } ... qualcos'altro alternativo all'if return 5; Codice:
if(a!=0) { ... } else { ... alternativo } return x; |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
uso il dev c++!
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Ok, quello è l'ambiente ma sviluppi con C o C++?
Per un semplice programma procedurale come la gestione di liste è meglio usare C. Se usi C puoi usare NULL ma devi usare printf e scanf per l'I/O che fanno parte delle librerie C standard. Se usi C++ devi usare 0 al posto di NULL o un valore specifico che indica il valore neutro per il tipo, e devi usare cout e cin per leggere e scrivere stream dalle periferiche I/O attraverso le librerie standard C++. |
![]() |
![]() |
![]() |
#9 |
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
ah te dici il linguaggio
no no è c++! |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Allora evita l'uso di NULL, è ovvio che al livello di questo programma non cambia niente, ma è una pratica che prima si perde meglio è.
Soprattutto quando poi si sviluppano programmi con una tipizzazione più complessa. uno può essere tentato di fare questo errore es. Codice:
string x; int y; x = NULL; y = NULL; if(x == y) ??? Codice:
string x; int y; x = ""; y = 0; if(che ci scrivo?) non mi viene nemmeno |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Ma anche no... NULL se usato solo per i puntatori va benissimo, poi ovvio che se uno inizia a usarlo invece dello 0 è sbagliato.
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
Per quanto riguarda i puntatori dedica un paragrafo apposta e un suggerimento alla fine del capitolo 5 del "C++, linguaggio, libreria standard, principi di programmazione": "la costante zero è un int. Grazie alle conversioni standard, 0 può essere utilizzato come costante di qualsiasi tipo intero, di un tipo virgola mobile, di un tipo puntatore o di un tipo puntatore a membro. Il tipo della costante 0 viene determinato dal contesto (io aggiungerei: a differenza di NULL che è una macro del preprocessore e non ha intrinsecamente legato un tipo particolare in fase di esecuzione, mentre 0 si porta dietro il suo "contesto"). Lo zero viene rappresentato da una serie di bit nulli della misura appropriata. Nessun oggetto viene allocato con l'indirizzo 0. Perciò 0 può essere usato anche come una costante puntatore, a indicare il fatto che il puntatore non si riferisce ad alcun oggetto (io aggiungo: ma a differenza di NULL ne viene determinato il tipo in fase di parsing, evitando errori subdoli). A causa del controllo stringente del C++ sui tipi, l'uso di zero puro può comportare meno problemi." Ultima modifica di _Claudio : 21-04-2009 alle 18:43. |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
La differenza fondamentale è che 0 non è una macro del preprocessore. Inoltre cosa è NULL varia da macchina a macchina, normalmente equivale (coattivamente per standard) a 0 (o (void*)0)) ma non è detto. Poi se si usa con la testa NULL allora tutto è possibile, anche la giustizia nel mondo ![]() Poi se lo dice chi ha inventato il C++... nel caso ancora non vogliate credermi... fare un atto di fede come tributo non sarebbe male... ![]() |
|
![]() |
![]() |
![]() |
#17 | |||
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
![]() Quote:
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|||
![]() |
![]() |
![]() |
#18 | |||
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
Quote:
Quote:
Quote:
|
|||
![]() |
![]() |
![]() |
#19 | ||
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Espliciti che fai riferimento ad un puntatore.
![]() Quote:
Codice:
/* Define NULL pointer value */ #ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif #endif ![]() Quote:
![]() ciao ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
![]() |
![]() |
![]() |
#20 | ||
Senior Member
Iscritto dal: Aug 2005
Messaggi: 579
|
A livello di scrittura del codice... ma se uno scrive codice sapientemente si ricorda che quella variabile è un puntatore.
E personalmente do maggior priorità alla correttezza del codice scritto rispetto la sua chiarezza... mi sembra sacrosanto. Quote:
Quote:
Il problema è che se uso C++ personalmente cerco di essere il più aderente possibile al linguaggio e alla sua filosofia (che comprende il non usare il più possibile le direttive del preprocessore) e cerco di scrivere programmi il più corretti possibili mettendo in secondo piano la leggibilità. Poi è un mio punto di vista... spero sia condiviso... ma se non lo è amen, spero di non trovarmi mai a lavorare in futuro con del codice leggibilissimo ma che ha errori subdoli come quello riguardante il NULL su compilatori diversi. |
||
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:25.