Verkettete Listen - In gleichem Programmteil immer neue Elemente hinzufügen



  • Hi,

    Ich empfange Daten, genauergesagt Kommandos via TCP/IP. Diese Kommandos möchte ich nun in eine verkettete Liste packen, damit sie der Hauptteil des Programms abarbeiten kann. Jetzt habe ich das Problem dass zum empfangen der Kommandos und speichern in der Liste immer der gleiche Programmteil aufgerufen wird, wie sag ich in diesem Teil also dass er immer einen _neues_ Element zur Liste hinzufügt? Wenn ich einfach sage

    Pseudo-code:

    warte auf Daten
    
    Wenn Daten kommen speichere sie in Variable (bzw. Listenknoten)
    
    Hänge Knoten an Liste an
    

    wird er ja bei jedem aufruf dieses Programmteils die Daten immer in die selbe Variable speichern, also den Knoten überschreiben. Wie schaff ich es dass er immer einen neuen Knoten hinzufügt?

    MfG,
    Luke



  • Schreib Code, der einen neuen Knoten hinzufügt 🙄

    Was bezweckst du mit dieser Frage?



  • Ich hab folgendes Problem: Ich schreibe gerade einen kleinen Server der Kommandos von einem Client über TCP/IP empfängt. Immer wenn er ein Kommando empfängt soll er dieses an das Ende einer verketteten Liste packen:

    (Achtung, Pseudo-code):

    listenKnoten neuerKnoten;
    
    for(;;)
    {
    	recv(socket, command, command_länge, 0)  // Auf Kommando warten, empfangen, und in variable 'command' speichern
    
    	neuerKnoten.command = command;
    	neuerKnoten.nächsterKnoten = letzterKnotenInDerListe;
    }
    

    So würde das natürlich nicht gehen da er ja immer wieder den selben Knoten bearbeiten würde. So

    (Achtung, wieder unvollständiger, pseudo-beispiel-code):

    void anListeAnhängen(char command) {
    	listenKnoten neuerKnoten;
    
    	neuerKnoten.command = command;
    	neuerKnoten.nächsterKnoten = letzterKnotenInDerListe;
    }
    
    for(;;)
    {
    	recv(socket, command, command_länge, 0)  // Auf Kommando warten, empfangen, und in variable 'command' speichern
    
    	anListeAnhängen(command);
    }
    

    Hätte das Problem dass neuerKnoten jedes mal nach beenden der Funktion verfallen würde (oder?). Und weiter bin ich einfach noch nicht. Häng da denktechnisch.
    Wie mach ich es, dass ich obwohl ich immer den gleichen Code aufrufe (nämlich zum/beim empfangen eines Commands), jedes mal einen neuen Knoten erstelle (nicht immer den gleichen bearbeite).



  • Ich glaub, du hast da was grundlegendes nicht verstanden.

    list<string> commands;
    for(;;)
    {
        string command;
        recv irgendwas, dass nachher was in command steht
        commands.push_back(command);
    }
    


  • Willst du mir damit sagen dass Listen in C++ schon inplementiert sind? Etwa auch in C (nicht++)?



  • Ja Listen sind in C++, allerdings nicht in C bereits implementiert....

    Kannst mal nach "STL list" suchen, da findest Du jede Menge Informationen



  • Ja, gut. C++ ist super aber ich kann es nicht nutzen da ich in meiner Entwicklungsumgebung (ich programmiere für die PSP) nichts C++iges kompiliert bekommen habe und ich mich jetzt auch nicht darum kümmern will. Hat denn niemand eine Idee wie man das in normalem C machen könnte?



  • Da wird dir nichts anderes übrig bleiben, als die Listen von Hand zu schreiben.
    Es gibt zwar hier und da fertige Listen, die durch Präprozessoranweisungen realisiert sind, aber davon würde ich die Finger lassen....

    Such mal im Netz nach einfach verkettete Liste, bzw. doppelt verkettete Liste, da wirst Du schon ein Tutorial finden.

    Gruß Paddy



  • Ne verkettete Liste schreiben wird nicht das Problem sein. Das Problem ist das, was ich im ersten und 3ten Post geschrieben hab



  • malloc 🤡



  • Heißt das mit malloc im stile von

    listItem* newListItem;
    listItem* lastItemInTheList = 0;
    listItem* listStart = 0;
    
    for(;;)
    {
        recv(socket, command, command_length, 0)  // Wait for a command, recieve it, and save it in 'command'
    
        newListItem = malloc(sizeof(listItem));
        newListItem->command = command;
        newListItem->nextListItem = 0;
        if (lastItemInTheList!=0)
           lastItemInTheList->nextListItem = newListItem;
        else
           listStart = newListItem;
        lastItemInTheList = newListItem;
    }
    

    würde er immer neuen Speicher reservieren und nicht immer an die selbe stelle schreiben?



  • Folge doch dem Ratschlag, Dir ein entsprechendes Tutorial anzusehen.

    Vielleicht reicht Dir auch der Hinweis, dass man einen Root-Node hat, von dem ausgehend alle Operationen durchgeführt werden, dann kannst Du Dir die Hilfszeiger sparen.


Anmelden zum Antworten