2010-11-23 15 views
0

Ich versuche einfach verkettete Liste zu verwenden:Änderung der Reihenfolge der Elemente in verknüpften Liste

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

Was ist der beste Weg, um Elemente in Bezug auf die Leistung zu ändern? Zum Beispiel habe ich 1 2 3 4 5 6 7 8 und ich brauche 1 4 2 3 5 6 7 8.

+0

Was ist Ihr Kriterium für die Nachbestellung? Es ist sehr schwierig zu helfen, ohne zu wissen, um welche Art Nachbestellung es sich handelt. –

+0

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

+0

Es ist Index, es ist nur ein vereinfachtes Stück Code. Data hinter Index ist ein großes Array von Strings. – qutron

Antwort

1

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.

+0

Nun, ich habe es. Vielen Dank! – qutron

Verwandte Themen