Salve,
Come da titolo, dovrei fare (a scopo didattico) un template di una lista doppiamente linkata evitando la presenza di duplicati... (in particolare mi servirà poi inserire nella lista degli oggetti)
Il fatto è che sinceramente non ho le idee chiare su come fare e quindi volevo chiedervi qualche dritta
Il mio metodo add della lista aggiunge un nuovo nodo in testa inserendo nel campo che contiene il dato una copia dell'oggetto passato come parametro.
Questo lo realizzo così:
codice:
void add(T *obj) {
Node *n = new Node;
T *copy = new T(*obj);
n->info = copy;
[...]
e il mio nodo è definito con una struct:
codice:
struct Node {
T* data;
Node *next;
Node *prev;
};
Node *head;
la domanda è, come faccio a vedere se la lista già contiene l'oggetto?
Il fatto è che è una lista template, quindi l'unica cosa su cui mi posso basare (o che almeno mi è venuta in mente) è guardare l'indirizzo di memoria dell'oggetto, nel metodo add quando gli arriva l'oggetto se lo copia e lo inserisce, la copia però ha un indirizzo diverso dall'originale, quindi se riaggiungo lo stesso oggetto, anche se mi scorro la lista guardando se l'indirizzo di memoria di quell'oggetto è già puntato il controllo sarà sempre false, poichè ogni volta creo copie con indirizzi diversi..
L'unica soluzione (piuttosto bruttina) che mi è venuta in mente è aggiungere un altro campo al nodo che mi memorizzi l'indirizzo di memoria dell'oggetto originale da cui ho fatto la copia e poi quando richiamo l'add andare a cercare l'indirizzo dell'oggetto in quel campo aggiuntivo
boh, qualcosa mi sfugge, forse c'è un metodo migliore, mi potreste dare qualche consiglio? (Considerando che non posso usare le liste/set/mappe delle librerie standard e che non posso dire che il generico oggetto T deve avere necessariamente metodi tipo equals in modo tale da sfruttare tale metodo per verificare l'esistenza di duplicati)
p.s. L'istruzione T *copy = new T(*obj); considerando che l'oggetto *obj non ha un costruttore copia mi fa una shallow copy?
Grazie in anticipo