Verkettete Liste - Elemente vertauschen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verkettete Liste - Elemente vertauschen

    Hallo,

    kann mir vielleicht jmd helfen und erklären wie man in einer Liste zwei Elemente vertauscht? Ich meine durch tauschen der Pointer. Ich schaffe es einfach nicht. Egal was ich mache ich kriege immer fehler oder es passiert gar nicht :(. Es geht im eine einfach verkette liste die einfach nur strings speichern soll mehr nicht. Ich will einfach aus a -> b -> c -> NULL eine b-> a -> c -> NULL liste machen :oops:

    Danke schon mal!!
  • Nimm eine temporäre Zeigervariable, lass die auf c zeigen. Nimm den zeiger von b und lass ihn auf a zeigen. Nimm den Zeiger von a und setz ihn gleich der temp. Variable. Je nach Inhalt von verketteten Listen ist das schneller, als den Inhalt zu tauschen.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Ich glaub ich stell mich irgendwie an :oops:

    Hier mal mein source schnippsel

    stringbuffer = stringbuffer->next; // ich springt auf der erste element 'a'
    element1 = stringbuffer; // ich speichere den zeiger
    stringbuffer = stringbuffer->next; // ich gehe aufs nächste elemen 'b'
    element2 = stringbuffer; // wieder speichern
    stringbuffer = stringbuffer->next; // drittes element 'c'
    element3 = stringbuffer; // speichern

    //tauschen
    element2->next = element1;
    element1->next = element3;
    Jetzt verschluckt er b und bei der ausgabe steht ac :(
    Hab ich was missverstanden??? :(
  • Ich glaube du haste s richtig verstanden, steigst aber durch deinen eigenen zeigersalat nicht durch. Also als erstes würde ich mir eine Funktion bauen um einen Zeiger für das Element an der Stelle i zu bekommen. Bei dreien scheint das zwar unnötig, aber ich nehme an es ist ja nur ein Beispiel:

    /* Liefert das Element an der Stelle i*/
    <typ> ElementAt(int i) {
    ...
    }

    dann nimmste ne Variable tmp und weißt ihr ElementAt(3) zu. Dann nimmste ElementAt(2) (also b) und biegst den Zeiger um: ElementAt(2).next = string.next (sollte der zeiger auf a sein). Dann nimmst du de Zeiger von a und biegst den auch um: ElementAt(1).next = tmp; Dann sollte es eigentlich klappen.

    Wie du siehst in dem beispiel rufst du 4 mal ElementAt auf (lässt sich mit geschickten Optimierungen vlt auf 2 oder drei Aufrufe drücken), da du durch die Liste wandern musst hast du bei vielen Listeneinträgen und langen Listen eine schlechte Laufzeit. Dann kann es performanter sein, die Daten in der Liste auszustauschen. Aber Optimierungen würde ich erst machen wenn du eine funktionierende Variante hast. Verkettete Listen sind im übrigen für die meisten Operationen ziemlich langsam.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • ich habs jetz mal gaaaaaaaaaanz einfach auf ZWEI elemente reduziert d.h. a -> b -> NULL wenn ich die vertausche muss ich b auf a zeigen lassen und a auf NULL korrekt?!?! nicht mal das klappt!!!!! :cry:

    stringbuffer = stringbuffer->next; // ich springt auf der erste element 'a'
    element1 = stringbuffer; // ich speichere den zeiger
    stringbuffer = stringbuffer->next; // ich gehe aufs nächste elemen 'b'
    element2 = stringbuffer; // wieder speichern

    element2->next = element1;
    element1->next = NULL;

    :oops: