Verkettete Liste mit getrennten Nutzdaten...?



  • Hallo folgendes Problem:

    Klasse der Liste:

    #ifndef LISTE_H
    #define LISTE_H
    #include <iomanip>
    #include <string>
    #include "StdAfx.h"
    #include "Eie.h"
    #include "Control.h"
    
    // Klasse der Listenelemente
    class Clistelement
    {
    	friend class Cliste;
    
    private:
    
    	void *daten; // Nutzdaten
    
    	Clistelement *next;
    	Clistelement *vor;
    	Clistelement(); //Konstruktor für Listenelemente
    
    	~Clistelement(); //Destruktor
    };
    // ENDE Klasse Listelement
    
    // Klasse der Liste
    class Cliste
    {
    
    private:
    	Clistelement *anfangliste; //Pointer auf erstes Element der Liste 
    	Clistelement *endliste; // Pointer auf letztes Element der Liste
    	int anzahl; // Anzahl Elemente der Liste
    
    public:
    
    	Cliste():anzahl(0), anfangliste(NULL) {};
    	~Cliste();
    
    	//Listenmethoden für CEie-Listen
    	void add_beginn(); //Element am Anfang anhängen
    	void add_end(); // Element am Schluss anhängt			
    	void del_liste();
    	int get_anzahl() {return anzahl;}; //holt die Anzahl Einträge
    	void sort(); //Element sortiert einfügen nach Stelle in File
    };
    #endif
    

    Nun habe ich folgende Methode (welche nicht funktioniert...):

    void Cliste::sort()[cpp]
    {
    	Clistelement *neu;
    	neu	= new Clistelement();
    	Clistelement *hilfs=anfangliste;
    	Clistelement *vor=anfangliste;
    
    	if(anfangliste==NULL)
    	{
    		add_beginn();
    		hilfs=NULL; //damit if() unten nicht mehr abgearbeitet wird!
    	}
    	else
    	{
    	};
    
    	if(hilfs->daten->lektion > neu->daten->lektion && vor==hilfs) //&& vor==hilfs damit wenn if() oben gemacht unten nicht nocheinmal
    		{
    			add_beginn();
    			hilfs=NULL;
    		}
    	else
    	{
    	};
    
    	while(hilfs)
    		{
    			if(hilfs->daten->lektion > neu->daten->lektion)
    			{
    				vor->next=neu;
    				neu->next=hilfs;
    				hilfs=NULL;
    				anzahl++;
    
    			}
    			else
    			{
    				vor=hilfs;
    				hilfs=hilfs->next;
    				if(hilfs==NULL)
    				{
    					vor->next=neu;
    					anzahl++;
    					endliste=neu;
    				};
    			};
    
    		};
    }
    

    Folgende Fehler Meldung:

    Kompilierung läuft...
    Liste_methoden.cpp
    h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(146) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen
    h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(146) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen
    h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(158) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen
    h:\berweger\eie\eie_015_weitermachen\liste_methoden.cpp(158) : error C2227: Der linke Teil von '->lektion' muss auf Klasse/Struktur/Union zeigen
    Fehler beim Ausführen von cl.exe.
    

    Was mach ich falsch? - Gruss sb



  • daten ist ein void-Pointer, also kannst du nicht ->lektion darauf anwenden. Woher soll der Compiler denn wissen, dass das in Wirklichkeit eine Struktur ist, die zufällig so ein Feld hat?

    Bevor ich jetzt irgendwelche Lösungsvorschläge ausbreite: Wieso soll das denn ein void-Pointer sein? Weil du dann "allgemeine" Daten in der Liste unterbringen kannst? Naja, warum geht dann die sortier-Methode davon aus, ein struct mit einem Member namens lektion vorzufinden? Also: Entweder richtig generisch, oder gar nicht.



  • richtig getippt! ich möchte eine datenunabhängige liste, damit ich diese überall verwenden kann. habe zwei Klassen, welche ich verwenden möchte:

    Cnutzdaten
    Ccontroldaten
    

    die methode

    sort()
    

    , welche du kritisiert hast, brauche ich nur, wenn die liste objekte der klasse

    Cnutzdaten
    

    enthält

    kannst du mir sagen, wie ich das machen kann?



  • void pointer ist immer falsch. statt dessen template oder polymorphie. hier siehts eher nach template aus. und wenn du es unbedingt so java maessig lassen willst, kannst du dem sort eine comparator klasse uebergeben, die int compare(void*, void*) implementiert. genau wie in java eben. machst du das eigentlich als uebung, oder kennst du std::list nur nicht?



  • also1: hab noch nie was mit java zu tun gehabt (C++ und MFC - mein tümpel)

    also2: kenne std::list nicht

    also3: kenne auch template nicht

    also4:
    dies ist meine erste (merkt man wohl...) liste mit unabhängigen daten.
    versuche erfolglos diese zu erzeugen.

    also5: nein ich mach das nicht zum spass - die ist eine semesterarbeit

    frage:
    kann ich dem sort() irgendwie mitteilen, auf welche struktur (klasse)es
    gerade zeigt?

    nicht nur sort(), sonder auch allgemein. wie löst man dieses problem mit unabhängigen daten in C++?

    ich habe eine billige vorlage - dort drin steht void *pnutzdaten...scheint aber deiner ansicht nach falsch zu sein 🙄



  • chaos.sb schrieb:

    ich habe eine billige vorlage - dort drin steht void *pnutzdaten...scheint aber deiner ansicht nach falsch zu sein

    Nicht unbedingt falsch, aber sehr, sehr umständlich. Und in C++ auch noch häßlich (kopieren usw). Templates sind die beste Lösung.



  • wie genau ist die semesterarbeit formuliert? sollst du einen container implementieren oder brauchst du den nur als kleines raedchen? dann nimm einfach std::list oder std::vector. oder kuck sie dir an und nimm sie als grundlage fuer deine implementation. die void pointer idee ist sehr schlecht. wenn du wissen willst, wie du dem trotz void* beibringst, wie er vergleichen soll, kuck dir an wie funktoren oder wenigstens funktionspointer funktionieren.



  • Heißer Tip fürne Semesterarbeit.

    Es gibt etwas das nennt man Bücher,
    das sind viele Blätter Papier an einer Seite mitenander verbunden
    Auf den einzelnen Seiten stehen meist so schwarze Flecke die nennt man Buchstaben.
    Wenn man die Buchstaben zu Wörtern zusammsetzt kann man das lesen
    Und wenn auf der ersten Seite nicht Josephine Mutzenbacher sondern

    C++ entpackt
    von Herbert Schildt
    mitp
    ISBN 3 8266 0731 7

    steht ist es das richtige und es gibt dort vieles interessantes zu

    Templates
    std:list

    😃 Tschuldigung bin etwas herb drauf 😃

    Aber das Buch kann dir wirklich weiterhelfen.



  • ich hasse dieses verschissene neue forum. jetzt musste ich mich ausloggen, um posten zu koennen, weil er mich sonst nicht laesst weil er der meinung ist, ich haette keinen benutzernamen angegeben. (kann man ja nicht, wenn man eingeloggt ist.)



  • chaos.sb schrieb:

    C++ und MFC - mein tümpel

    alles irgendwie typisch. und der rest passt auch dazu :(.
    tipp: statt zu schlafen, les in den vorlesungen lieber ein buch 😃



  • 😃 Kinders seit doch nicht so bös, er ist dochn Student
    und die lernen sowas im Schlaf 😃


Anmelden zum Antworten