Bitte um Hilfe.



  • struct listenelement
    {
        string daten;
        listenelement* next;
        listenelement* prev;
    };
    

    So ist ein Listenelement einer doppelt verketteten Liste aufgebaut. Falls ihr so eine Aufgabe bekommt, solltet ihr im Unterricht doch irgendwann mal den Unterschied zwischen einfach und doppelt verketteten Listen durchgesprochen haben, oder?



  • Patrick,

    der lätzte satz ist. "Das erstellen einer doppelt verkettete Liste wartet auf euch als Hausaufgabe" Im Buch, bzw im Hand-ot gibt's nix, kein Wort, nada!
    Und das ist mein Problem.
    Jetzt habe ich deine Hilfe angenommen, es eingebaut, es geht jetzt ohne fehlermeldung, aber ob es jetzt eine doppelt verkettete liste ist, das weiß ich nicht, und es geht ja auch nicht rückwärts.

    #include <iostream>
    using namespace std;
    struct listenelement
    {
        string daten;
        listenelement* next;
        listenelement* prev;
        listenelement* last;
    };
    void anhaengen(string datenneu, listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    while(hilfszeiger->next != NULL)
    hilfszeiger = hilfszeiger->next;
    hilfszeiger->next =  new (listenelement);
    hilfszeiger = hilfszeiger->next;
    hilfszeiger->daten = datenneu;
    hilfszeiger->next = NULL;
    }
    void ausgeben(listenelement *listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    cout << hilfszeiger->daten << '\n';
    while (hilfszeiger->next != NULL)
    {
    hilfszeiger = hilfszeiger->next;
    cout << hilfszeiger->daten << '\n';
    }
    }
    void ende(listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    while (listenanfang !=NULL)
    {
        hilfszeiger = listenanfang;
    listenanfang = listenanfang->next;
    delete (hilfszeiger);
    }
    }
    
    int main ()
    {
    listenelement* listenanfang;
    listenanfang = new (listenelement);
    listenanfang->next = NULL;
    listenanfang->prev = NULL;
    listenanfang->last = NULL;
    listenanfang->daten = "Element 1",
    anhaengen("Element 2", listenanfang);
    anhaengen("Element 3", listenanfang);
    anhaengen("Element 4", listenanfang);
    ausgeben (listenanfang);
    ende (listenanfang);
    
    return 0;
    }
    


  • jetzt hast du das Originalprogramm um genau 2 variablen erweitert - und jetzt?

    google spuckt bei "doppelt verkettete liste" c/c++ direkt als erstes
    diese Seite aus: http://perlgeek.de/de/artikel/doppelt-verkettete-listen

    in C, mit Beispielen



  • troika,

    danke, aber hat mich nicht veitergebracht. Ich verstehe diese Zeiger, Hilfszeiger, wo was hingehören soll nicht, hab schon Zeichnungen erstellt, aber komm nicht dahinter, ich sehe die zwei neuen Variablen, aber das "wie weiter", ist mein Problem!



  • Das ist so trivial, wenn du das nicht verstehst, dann hör mit dem Programmieren auf. Das ist einfach nichts für dich, alles andere wird viel schwieriger.



  • Mechanics,

    ist eine HAUSAUFGABE, ich WERDE und MÖCHTE NICHT Programmierer werden, ich muss das hier als HAUSAUFGABE einreichen, nix weiter. Wenn es für dich so trivial ist, dann sende mir die lösung zu, dass ich gehen kann, oder lass mich in ruhe, brauche keine solchen Komments. Wahrscheinlich gibt es Sachen die ich besser kann als du, trotzdem.
    Habe um Hilfe gebeten, nicht um solche Aussagen.

    Danke!



  • Aber am Ende nimmste mit dem durch Betrug erlangten besseren Abschluss vielleicht jemandem den Job weg, der ihn eher verdient hätte.



  • Volkard,

    was für einen Job??? Im IT Bereich??? Ich möchte da nie arbeiten. Aber wie oft muss ich das noch hier schreiben. HAUSAUFGABE NIX WEITER. Mein Abschluss ist bzw wird im Sozialen Bereich, hat außer Office nix am Hut mit IT!

    Danke an alle die es versucht haben mir zu helfen.



  • Programmieraufgabe in der Schule? Ich halte überhaupt nichts von Informatik als Pflichtfach, für alle, die es nicht interessiert, ist es wohl in der Tat eine Qual.



  • Ja, ist es, aber ich möchte es machen, wenn ich es schon als Aufgabe habe, aber es ist echt keine Hilfe, wenn ich nur negative Komments bekomme. Informatik als Pflichtfach ist schon ok, aber das ist schon ein anderes Level, ich möchte es nicht, eigentlich die ganze Klasse nicht, uns quelt der Lehrer mit sowas, manches ist noch machbar gewesen, aber mit sowas kann keine von uns was anfangen. Deshalb habe ich hier um Hilfe ersucht.



  • Mechanics schrieb:

    Programmieraufgabe in der Schule? Ich halte überhaupt nichts von Informatik als Pflichtfach, für alle, die es nicht interessiert, ist es wohl in der Tat eine Qual.

    Das würde ich noch erweitern auf Duetschunterricht.
    Auch Mathe ist eine sinnlose Qual, wer muss an der Arbeit schon rechnen können?



  • Volkard,

    lass es, was hat eine doppelt verkettet Liste als Haushaufgabe mit allgemeinbildung zu tun??? Nix, also, bitte, geh weiter, danke!



  • So Jungchen jetzt nimm mal tief Luft und setze dich mal wirklich mit dem Thema auseinander. Immer nur zu sagen kann ich nicht will ich nicht bringt dich hier nicht weiter. Ich schätze mal du musst die Aufgabe morgen abgeben also hast du heute Abend noch Zeit dir das Wissen anzueignen, was eine doppelt verkettete Liste ist. Diese Thematik ist wirklich trivial und kann auch bestimmt von dir verstanden werden. Ich sehe bei dir das gleiche Problem wie es viele mit Mathe haben. Sagen immer ich kann das nicht ich kann das nicht aber wenn man sie dann einmal dazu zwingt sich mit dem Thema zu beschäftigen ist plötzlich doch alles ganz einfach und logisch.
    Und ist es nicht schöner abends mit dem Gefühl ins Bett zu gehen selber was geschafft zu haben? 🙂



  • volkard schrieb:

    Das würde ich noch erweitern auf Duetschunterricht.
    Auch Mathe ist eine sinnlose Qual, wer muss an der Arbeit schon rechnen können?

    Ich glaub, das Thema hatten wir schon paar mal 😉 Kann gut sein, dass ich da einfach etwas "traditionsbewußt" denke, aber ich finde eigentlich alle Fächer in der Schule soweit ok für die Allgemeinbildung. Informatik würde mir aber zu weit gehen. Mag schon sein, dass für viele Mathe genauso eine Quälerei ist, aber jetzt noch zusätzlich etwas einzuführen, das wirklich nur für einen kleinen Bruchteil der Menschen später eine Rolle spielen wird, halte ich für einen Fehler. Und ich sehe Mathe viel eher als Grundlagenfach für alles mögliche. Bei Informatik sehe ich das erstmal nicht. Natürlich kann man vieles etwas anders sehen/angehen, wenn man da etwas Ahnung hat und die Probleme durch die Informatikerbrille betrachtet. Aber das bisschen, das man in der Schule dann machen würde, würde nicht reichen, damit man so abstrakt denken kann. Und so wie ich das sehe, was anscheinend unterrichtet wird, geht es nicht mal in die Richtung. Programmieren bringt da nichts, dadurch entwickelt man anfangs kein abstraktes Denken, das hilft als Grundlage überhaupt nicht weiter, es ist nur kompliziert und funktioniert nicht. Nee, ich werd mich sicher nie davon überzeugen lassen, dass Informatik ein sinnvolles Schulfach wäre 😉

    @tom830211: ich weiß nicht, wie man dir sonst helfen könnte. Meine Worte waren etwas harsch, ich dachte, du wärst ein Informatikstudent. Mein Tipp wär auch gewesen, das mit Papier und Stift durchzuspielen, aber wenn du das schon probiert hast, dann weiß ich auch nicht... Vielleicht denkst du auch einfach zu kompliziert. Es ist wirklich trivial und liegt einfach auf der Hand. Mal dir einfach paar Kästchen auf und zeichne Verbindungslinien dazwischen ein. Wie musst du die Linien nun ändern, wenn du ein Kästchen aus der Mitte entfernen willst?


  • Mod

    tom830211 schrieb:

    lass es, was hat eine doppelt verkettet Liste als Haushaufgabe mit allgemeinbildung zu tun?

    Sie ist das programmiertechnische Sinnbild einer Kette.



  • @Mechanics
    Imperative Programmierung erfordert etwas, was viele Leute nicht können: Schritt für Schritt klare Anweisungen geben, deren Ausführung dann im Endeffekt das bewirkt was man erreichen wollte.
    Das in der Schule zu unterrichten halte ich schon für Vorteilhaft, weil ich der Meinung bin dass es allgemein das logische Denken und die Fähigkeit sich klar auszudrücken fördert. Wobei man es dann natürlich so unterrichten müsste dass dabei auch was ankommt.
    Rumhantieren mit Zeigern halte ich dabei z.B. nicht füt notwendig.



  • Hört mal. Wir haben mit Office alles durch. Auch Mi MYSQL ein bißchen gearbeitet, jetzt c++ bzw das Programm QT. Wir haben schon Taschenrechner gemacht, Rechenaufgaben, usw. War echt ok. Aber sowas sehe ich zum ersten Mal. Egal ob ich zeichne, wenn es mich nicht weiterbringt, weil ich nicht richtig weiß, wo was reingehört.
    Ich wollte hier Hilfe bekommen, Weil ich damit nichts zu tun habe, oder ab September hoffentlich nix mehr zu tun haben werde.
    Es ist für mich einfach sinnlos sowas zu lernen. Ich muss es machen. Leider. Hilfe brauche ich.



  • In einer doppelt verketteten Liste hat jedes Element einen Zeiger auf das nächste Element sowie auf das vorige Element.
    Wenn also e ein Zeiger auf ein Element ist, dann muss e->Next immer der Zeiger auf das nächste Element sein, und e->Prev der Zeiger auf das vorige.
    D.h. es muss dann z.B. auch (für alle Elemente bis auf das letzte) gelten e == e->Next->Prev. Und für alle Elemente bis auf das erste muss gelten e == e->Prev->Next.

    Um ein Element e irgendwo einzufügen musst du also 4 Zeiger richtig setzen:
    `e->Next

    e->Prev

    e->Next->Prevunde->Prev->Next`



  • Danke an hustbaer,

    jetzt ist es rückwärts, aber es fahlt 1-2-3. Aber ist schon mal was, ich bekomme auch Fehlermeldungen, das Programm macht den build fertig. 😃
    Ist schon mal was!

    [code"cpp"]
    #include <iostream>
    using namespace std;
    struct listenelement
    {
    string daten;
    listenelement* next;
    listenelement* prev;
    listenelement* last;
    };
    void anhaengen(string datenneu, listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    hilfszeiger = listenanfang;
    while(hilfszeiger->next != NULL)
    hilfszeiger = hilfszeiger->next;
    hilfszeiger == hilfszeiger->prev->next;
    hilfszeiger == hilfszeiger->next->prev;
    hilfszeiger->daten = datenneu;
    hilfszeiger = hilfszeiger->prev = NULL;
    }
    void ausgeben(listenelement listenanfang)
    {
    listenelement
    hilfszeiger;
    hilfszeiger = listenanfang;
    cout << hilfszeiger->daten << '\n';
    while (hilfszeiger->next != NULL)
    {
    hilfszeiger = hilfszeiger->next;
    cout << hilfszeiger->daten << '\n';
    }
    }
    void ende(listenelement* listenanfang)
    {
    listenelement* hilfszeiger;
    while (listenanfang !=NULL)
    {
    hilfszeiger = listenanfang;
    listenanfang = listenanfang->next;
    delete (hilfszeiger);
    }
    }

    int main ()
    {
    listenelement* listenanfang;
    listenanfang = new (listenelement);
    listenanfang->next = NULL;
    listenanfang->daten = "Element 1",
    anhaengen("Element 2", listenanfang);
    anhaengen("Element 3", listenanfang);
    anhaengen("Element 4", listenanfang);
    ausgeben (listenanfang);
    ende (listenanfang);

    return 0;
    }
    [/code]



  • tom830211 schrieb:

    ... das Programm macht den build fertig.

    Das hat nicht viel zu sagen:
    Zeile 16 und 17 haben keinen Effekt (das ist ein Vergleich)
    Aber da sollte der Compiler eine Warnung geben.

    Es hilft auch nichts, dem Hilfszeiger immer neue Werte zuzuweisen.
    Du musst diese Werte auch mal wieder schreiben.

    Am einfachsten ist es erstmal drei (3) Hilfszeiger zu nehmen.
    Einen für das neue Element,
    einen für den Vorgänger und
    einen für den Nachfolger.

    Damit kannst du dann die Werte neu zuweisen.

    Vorgänger->next     = neues Element
    Nachfolger->prev    = neues Element
    neues Element->prev = Vorgänger
    neues Element->next =
    

    Denke aber auch daran, dass die Zeiger mal NULL sein können (Anfang und Ende).
    Einen NULL-Zieger darf man nicht dereferenzieren.

    Mach dich mal über http://de.wikipedia.org/wiki/Einrückungsstil schlau.


Anmelden zum Antworten