Sono alle prese con le liste ed in particolare con una funzione che prende elemento in pozione
i (che è $>=1$) e lo sposto alla posizione immediatamente precedente, quindi se cerco l'elemento con posizione 4 lo sposto in posizione 3.
Mi è chiaro che devi aver traccia di almeno 3 puntatori, quello in posizione $i$ e dei due precedenti che sono nel mio caso $r$ e $q$.
La mia difficoltà è nella relazione tra r e q nel seguente codice dove non capisco come faccia ad essere r antecedente a q.
r = q; // r rimane due passi indietro a p
q = p; // q rimane un passo indietro a p
p = p->pun;
Comprendo che p è spostato di un elemento in avanti rispetto a q, ma non riesco a comprendere la relazione tra r e q.
Mi aiutate please?
void Calcolo::controlla(unsigned int i) {
// controllo validita' indice e caso lista vuota
if (i < 1 || _testa == NULL)
return;
// caso particolare: controllo del primo elemento
if (i == 1) {
_testa->controllato = true;
return;
}
unsigned int c = 1;
pezzo *p = _testa;
pezzo *q = p;
pezzo *r;
while (p != NULL && c < i) {
r = q; // r rimane due passi indietro a p
q = p; // q rimane un passo indietro a p
p = p->pun;
c++;
}
// ho raggiunto la fine della lista
// (non esiste l'i-esimo pezzo)
if (p == NULL)
return;
// caso particolare: sono sul secondo elemento e lo
// devo spostare in testa
if (r == q) {
_testa->pun = p->pun;
p->pun = _testa;
_testa = p;
} else {
q->pun = p->pun;
r->pun = p;
p->pun = q;
}
}