Es ist schwer zu sagen, im Allgemeinen. Es scheint, dass Sie Element 4 nach Element 1 verschieben möchten. Haben Sie die index*
für beide? Oder wissen Sie einfach, dass sich das vierte Element um zwei Stellen bewegen muss? Dies beeinflusst offensichtlich die Menge an Listwalking, die Sie tun müssen.
Im Allgemeinen für maximale Effizienz, eine Funktion wünschen würde
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)
}
und ein Follow-up
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;
}
Diese Operationen sind unsicher, weil sie vorübergehend die Liste in einem gebrochenen Zustand verlassen und viele Annahmen treffen (zB keine Überprüfung auf Beginn/Ende von Listen). Diese brauchen spezielle Handhabung. Für die Grundoperation sind diese 6 Zeigerschreibvorgänge das absolute Minimum.
Was ist Ihr Kriterium für die Nachbestellung? Es ist sehr schwierig zu helfen, ohne zu wissen, um welche Art Nachbestellung es sich handelt. –
Dieser 'Index' ist eine schlechte Fehlbezeichnung, da es kein Index, sondern ein Listenknoten ist. Außerdem müssen Sie in C++ Struct-Namen nicht mit 'struct' vorauseilen (' index * next_element; 'und' index * previous_element' genügt). Oh, und um deine Frage zu beantworten: Du vertauschst die Zeiger. Es ist schwer, schneller zu werden. – sbi
Es ist Index, es ist nur ein vereinfachtes Stück Code. Data hinter Index ist ein großes Array von Strings. – qutron