Salve a tutti, sono nuovo qui e ho qualche domanda da farvi sulle liste astratte in C++.
Allora, vorrei sapere come è possibile spostare un indirizzo di una lista, per metterlo in coda o in testa:
Nell'header file ho creato una struct, fatta in questo modo:
struct Foto{
Foto * pun;//puntatore della struct
char * file; //nome file della foto da salvare nella lista
int priorita; //priorità di inserimento (1, in testa; 0, in coda)
};
La priorità serve solo per indicare quale file deve essere inserito in testa o in coda e per evidenziarlo con (*) nell'output della classe.
Io, in un esercizio di esame ho provato a fare una funzione void mettiInEvidenza(const char* foto), in questa maniera, da una sola classe, chiamata Timeline(la cui definizione nell'header file):
void Timeline::mettiInEvidenza(const char * foto) {
if (foto == NULL || strlen(foto) < 1)
return;
// scorrimento della lista fino a che non si trova l'elemento, se esiste
Foto * p = testa; //testa è nel private della classe mettiInEvidenza ed è stata già inizializzata e ha fatto tutti gli inserimenti correttamente.
Foto * q = p;
while (p != NULL)
{
if (strcmp(p->file, foto) == 0)
{
if (p->priorita) // se gia' in evidenza, non si deve far niente
return;
// se e' gia' il primo della lista, basta impostare priorità = 1
if (p == testa)
{
p->priorita = 1;
return;
}
// creazione di una copia dell'elemento
Foto * r = new Foto;
r->file = new char[strlen(p->file)+1];
strcpy(r->file, p->file);
r->priorita = 1;
// inserimento in testa
r->pun = testa;
testa = r;
// eliminazione vecchia copia dell'elemento
q->pun = p->pun;
delete[] p->file;
delete p;
}
else
{
q = p;
p = p->pun;
}
}
}
[code/]
Quello che succede, secondo il debugger, è che i puntatori delle liste iniziano ad essere infinite.
L'idea sarebbe quella di scambiare di posto un certo file che deve avere priorità 0, per essere messo in testa e convertire la priorità da 0 a 1. Se è presente, ma già in testa con priorità 0, di mettere 1, oppure lasciarlo invariato, se ha priorità 1 ed è in testa.
Essendo che questo esercizio è fuori dallo standard, cioè richiede strumenti che ho imparato nel corso di programmazione di 1° livello di c++, ma la cui risoluzione richiede di essere improvvisata e trovata. Quindi mi stavo chiedendo come ovviare al problema della memoria della lista e fare quello richiesto, mentre non posso usare librerie per le liste.