2010-11-23 2 views
0

J'essaie d'utiliser la liste chaînée simple:modifier l'ordre des éléments dans la liste chaînée

struct index 
{ 
    struct index* next_element; 
    int data; 
    struct index* previous_element; 
} 

Quelle est la meilleure façon de changer l'ordre des éléments en termes de performance? Par exemple, j'ai 1 2 3 4 5 6 7 8 et j'ai besoin de 1 4 2 3 5 6 7 8.

+0

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. –

+0

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

+0

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

Répondre

1

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.

+0

bien, je l'ai eu. Je vous remercie! – qutron