Übergebener Wert von einer liste liefert nur eine Speicheradresse und einen Error ??



  • Ich habe eine Methode geschrieben, welche zwei Mengen vereinigt, und als Rückgabe soll die Menge die Vereinigungsmenge liefern.

    Und später im MAin soll die Ausgabe der Vereinigungsmenge aufgerufen werden.

    Wenn ich die Elemente der Vereinigungsliste in der Methode "Vereinigung" ausgebe, dann funktioniert es. Wenn ich die Ausgabe aber im MAin mache, dann wird als 1. Element eine Speicheradresse ausgegeben, und beim zweiten Element wird einen Fehler erzeugt.

    Habe den Tip bekommen, daß meine Vereinigungsmenge nach Ablauf der Methode zerstört wird, und dann im Main nichtmehr verfügbar ist.Und ich sollte noch eine Refernz mit übergeben, die auf meine Vereinigungmenge zeigt oder einen Kopykonstruktor implementieren.

    Hab aber leider keinen Plan wie ich das realisieren soll, wäre toll wen mir jemand helfen könnte.Ist wahrscheindlich nur ein kleiner Fehler, der mich aber sehr ärgert.

    mfg Thomas

    #include <iostream> 
    using namespace std;
    
    class PRFGNode
    {
    public:
    	unsigned int elem;
    	PRFGNode *next;
    	PRFGNode(int e=0, PRFGNode *n=0):elem(e),next(n){}
    
    };
    
    class Set
    {
    	public:
    		Set():root(0) {}
    		Set(int){Set *first; first=new Set();} //leere Menge
    		~Set();  //Destruktor, löscht alle Listenelemente
    		void insert_at_first(unsigned int x);  //einfügen in Liste
    		void Ausgabe();
    	    Set Vereinigung(Set &b); //UP für die Vereinigung
    		bool ist_in(unsigned int y);  //Funktion die true zurückliefert, wenn y in Liste
    	private:
    		PRFGNode *root;
    
    };
    
    void Set::insert_at_first(unsigned int x)  //Einfuegen am Listenbeginn
    {
    
    	root=new PRFGNode(x,root);		
    
    }
    
    Set Set::Vereinigung(Set &b)
    {
    	Set c;
    	PRFGNode *h1,*h2;
    	bool test=false;
    	h1=root; // Zeiger aufs 1 Element der Menge a, siehe Aufruf im void main  ( a.Vereinigung(b) )
    	h2=b.root; // Zeiger aufs 1 Element der Menge b, diese wird als Parameter übergeben 
    
    	while(h2!=0)   //zunächst werden in die neue Menge c alle Elemente von b hineinkopiert
    	{
    		c.insert_at_first((*h2).elem);
    		h2=(*h2).next;  //weiter in der Liste
    	}
    
    	while(h1!=0)       //hier werden die noch fehlenden Elemente aus a in c eingefügt
    	{
    		if(b.ist_in((*h1).elem)) // es wird mit der Funktion "ist_in" geschaut, welche noch fehlen
    			test=true;
    		else
    			test=false;
    
    		if(test==false) //wenn das Element "h1->elem" von Menge a noch nicht in der Menge b, dann in c einfügen
    
    			c.insert_at_first((*h1).elem);  //einfügen in c
    
    		h1=(*h1).next;    //mit next-Zeiger kommt man in der Liste weiter, (ähnlich i++)
    	}  
    
    	//danach beginnt while-Schleife erneut
    
    	c.Ausgabe();
    	return c;        //Ausgabe der Vereinigungsmenge, jedoch wird diese Menge nicht zurückgeliefert
    
    }
    
    bool Set::ist_in(unsigned int y) //überprüfen ob y in Liste
    {
    	PRFGNode *hilf;
    	bool test=false;  //bool-Variable test, hat Werte "true" oder "false"
    	hilf=root;
    
    	while (hilf!=NULL)
    	{
    		if(((*hilf).elem)==y)
    			test=true;
    
    		hilf=(*hilf).next;
    	}
    	return false;
    }
    
    void Set::Ausgabe() //Ausgabe der Liste
    {
    	int anz=0,i=0;
    	PRFGNode *aktuell;
    
    	aktuell = root;
    
        while (aktuell != 0)
        {
    		i++;
    		cout << "\n" << "Das " << i << ". Element hat den Wert " << (*aktuell).elem << "."<<endl;
    		aktuell = (*aktuell).next;
        }
    
    }
    
    Set::~Set()  //Destruktor
    {
    	PRFGNode *voriges;
    	PRFGNode *aktuell;
    
    	aktuell=new PRFGNode;
    	voriges=new PRFGNode;
    	voriges=NULL;
    
    	aktuell=root;
    
    	while(aktuell!=0)
    	{
    
    		voriges=aktuell;
    		aktuell=(*aktuell).next;
    		delete voriges;
    	}
    
    }
    
    void main()
    {
    	Set a, b, c;
    	int d=6;
    
    	a.insert_at_first(8);
    	a.insert_at_first(9);
    	a.insert_at_first(5);
    
    	b.insert_at_first(8);
    	b.insert_at_first(3);
    	b.insert_at_first(2);
    
    	a.Ausgabe();
    	if(a.ist_in(d))  //dh wenn true zurückgegeben wird, dann ist es in der Liste
    	cout<<"\n"<<"Das Element ist in der Liste";
    	else
    	cout<<"\n"<<"Das Element " <<d << " ist nicht enthalten."<<endl;  //wenn 6 nicht in Liste, dann Meldung... 
    
    	c = a.Vereinigung(b); //es wird die Vereinigungs-Menge ausgegeben, siehe UP: void Set::Vereinigung(Set b) 
    					 //ist nicht genau das, was in der Angabe gefordert wurde, da dort die Vereinigung zurückgeliefert werden sollte, mit return- funkt. aber irgendwie nicht!!!!
        c.Ausgabe();
    
    }
    


  • Danke für eure Hilfe, ich habe das Programm fertig, und es funktioniert so wie es soll.

    Ohne eure Hilfe wäre es mir schlecht ergangen.

    mfg Thomas

    PS: Es fehlte ein Kopykonstruktor, der die Wertübergabe sicherte.


Anmelden zum Antworten