C'est difficile à dire en général. Il semble que vous voulez déplacer l'élément 4 après l'élément 1. Avez-vous le index*
pour les deux? Ou savez-vous seulement que le quatrième élément doit se déplacer de deux endroits? Cela affecte évidemment la quantité de listwalking que vous avez à faire.
En général, pour une efficacité maximale, vous voulez une fonction
void list_remove_unsafe_(index* i) {
// These two have to change (minimum needed)
i->previous_element->next_element = i->next_element;
i->next_element->previous_element-> = i->previous_element;
// We leave i itself unchanged (dangling)
}
et un suivi
void list_insert_unsafe_(index* after, index* i) {
// These four have to change (minimum needed)
index* before = after->next_element;
i->previous_element = after;
i->next_element = before;
before->previous_element = i;
after->next_element = i;
}
Ces opérations ne sont pas sécuritaires parce qu'ils quittent temporairement la liste dans un état cassé et faire beaucoup d'hypothèses (par exemple, pas de vérification pour le début/fin des listes). Ceux-ci ont besoin d'une manipulation spéciale. Pour l'opération de base, ces 6 écritures sont le strict minimum.
Quel est votre critère pour le réapprovisionnement? Il est très difficile d'aider sans savoir de quel type de réorganisation vous êtes après. –
Cet '' index'' est un mauvais terme, car ce n'est pas un index, mais un noeud de liste. De même, en C++, vous n'avez pas besoin de précéder les noms de structure avec 'struct' (' index * next_element; 'et' index * previous_element' fera l'affaire). Oh, et pour répondre à votre question: vous échangez les pointeurs. Difficile d'être plus rapide que ça. – sbi
C'est un index, c'est juste un morceau de code simplifié. Les données derrière l'index sont un grand nombre de chaînes. – qutron