es geht um die Verkettete listen



  • Hallo alle zusammen 
    Ich habe eines kleines Probelem :
    und zwar dass ich zwei Funktionen schreiben sollte eine FKT die so 
    void entfernen_vorn()// die FKT soll von der Liste das erste Element löschen 
    void entfernen_Hintern()// die FKT soll die letzte element löschen 
    #include<iostream.h>
    
    struct listenelement
    {
    	int Element;
    	listenelement *weiter;
    };
    
    struct liste
    {
    private:
    	listenelement *kopf,*Fuss;
    public:
    	void init();
    	void einfuegen_hinten(int);
    	int anzahl();
    	void entfernen_vorn();
    	void entfernen_hinten();
        int letztes();
    	void ausgabe_vorw();
    //	void ausgabe_rueckw();
    };
    void liste::init()
    {
    kopf=NULL; Fuss=NULL;
    };
    
    void liste::einfuegen_hinten(int a)
    { 
    	listenelement *k= new listenelement;
    	k->Element=a;
    	k->weiter=NULL;
    	if(kopf==NULL)
    	{
    		kopf=k;kopf->weiter=Fuss;
    	}
    	else if(Fuss==NULL)
    	{
    	   kopf->weiter=k;
    	   Fuss=k;
    
    	}
    
        else {
            Fuss->weiter=k;
    		Fuss=k;
    	}
    };
    
    int liste::anzahl()
    {
    	int a=1;
    
    	if (kopf==NULL){
    
    	cout << " Liste leer " << endl;
    	    return 0;
        }
    
    	else{
    	    listenelement *k=kopf;
    		while(k->weiter!=NULL)
    	{
    		a++;
    		k=k->weiter;
    
    	}
    
    		return a;
    
    	}
    };
    
    void liste::entfernen_vorn()
    {
    	if (kopf==Fuss){
    		cout << "Liste leer,entfernung unmoeglich ! " << endl;
    	}
    
    	else{
    
            cout << kopf<<" ist entfernt " << endl;
            kopf=kopf->weiter;
    	}
    }
    
    void liste::entfernen_hinten()
    {
    	if(kopf==Fuss){
    
    		cout << "Liste leer,entfernung unmoeglich ! " << endl;
    	}
    	else {while(kopf->weiter!=Fuss){
    		kopf=kopf->weiter;
    	}
    	Fuss=kopf;
    	}
    };
    int liste::letztes()
    {
    	if (Fuss!=NULL)
    
    		return kopf->Element;
    		else 
    			return 0;
    };
    
    void liste::ausgabe_vorw()
    {
    	if (kopf!=NULL)
    	{
    		cout << kopf->Element << endl;
    		kopf=kopf->weiter;
    		ausgabe_vorw();
    	}
    	else 
    		cout << "liste ist leer" << endl;
    };
    

    In dieses Programm denke ich dass der Fehler ist bei der beiden Entfernen ?
    aber wie weiss es nicht 😡



  • sorry, aber ich kann beim besten willen nicht verstehen, was du uns sagen willst 😢



  • Er hat eine verkettete Liste implementiert und sollte nun Funktionen zum Löschen des ersten oder des letzten Elements dieser Liste entwickeln. Das funktioniert aber (warum auch immer) nicht.



  • geh mit dem debugger durch, dann findest du den fehler sicher...

    mir sind da einige Sachen suspekt - aber was konkretes sehe ich beim überfliegen nicht...



  • also da is nich nur ein Fehler drin..

    der gröbste der mir beim Entfernen auffällt ist, daß du beim entfernen_hinten den Kopfzeiger durch die Liste bewegst(was natürlich nich sein darf)->nimm ne Kopie davon



  • Shady schrieb:

    also da is nich nur ein Fehler drin..

    der gröbste der mir beim Entfernen auffällt ist, daß du beim entfernen_hinten den Kopfzeiger durch die Liste bewegst(was natürlich nich sein darf)->nimm ne Kopie davon

    wie meinst du dass ich eine Kopie davon nehme
    danke



  • nach entferne_hinten() ist Fuss == kopf
    Dieses Problem hast du in mehreren Methoden

    btw: du weisst aber schon, dass du nie ein Element löscht -> du also massenweise Speicherlecks produzierst, oder?

    btw: da es ja eine einfach verkettete Liste ist, warum brauchst du dann einen Zeiger auf das letzte Element? So wie ich das sehe, versuchst du einen Ring zu bauen... Lass es doch lieber bei ner simplen einfach verketteten Liste.

    Da kann man das Ende schön mit eleml->next==NULL kennzeichnen...



  • wie meinst du dass ich eine Kopie davon nehme

    listenelement*travel= kopf;

    und damit die liste durchlaufen

    wobei ich so eine ineffiziente Funktion, die erstmal die ganze liste aufmischt nur um das vorletzte Element zu finden, in der form gar nicht einbauen würd, aber das is ne andere Geschichte


Anmelden zum Antworten