Doppelt Verlinkte Liste {Elemente Gehen Verloren}



  • die liste funzt mit genau einem element, aber wenn ich mehrere hinzufüge klappt das schon nicht mehr 😕
    hab auch fehlersuche betrieben und hier mein resultat:

    main.cpp

    #include <iostream>
    #include <fstream>
    #include "log.h"
    #include "list.h"
    
    #define MAIN_VERSION 0
    #define APP_TITLE "ListTest"
    
    using namespace std;
    
    int main(int argc, char* argv[]){
        std::cout << APP_TITLE"\n";
    
        Log logObj("logFile.txt", "errFile.txt");
    
        logObj.pLn("test1");
        logObj.logLn("test2");
        logObj.logLn("test3");
        logObj.logLn("test4");
    
        List xl;
        Element elem("value1");
        xl.pushFront(&elem);
        elem.setValue("value2");
        xl.pushFront(&elem);
        elem.setValue("value3");
        xl.pushFront(&elem);
        elem.setValue("value4");
        xl.pushFront(&elem);
        std::cout << (*(xl.popBack())).getValue() << "\n";
        std::cout << (*(xl.popBack())).getValue() << "\n";
        std::cout << (*(xl.popBack())).getValue() << "\n";
        std::cout << (*(xl.popBack())).getValue() << "\n";
        //block until user types something
        fgetc(stdin);
        return 0;
    }
    

    list.cpp

    #include <iostream>
    #include <fstream>
    #include "list.h"
    
    using namespace std;
    
    // constructor
    List::List(){
        first= NULL;
        last= NULL;
        size= 0;
    }
    
    // destructor
    List::~List(){
        first= NULL;
        last= NULL;
        size= 0;
    }
    
    void List::pushFront(Element *elem){
        Element newElem((*elem).getValue());
        std::cout << "new element pos: " << &newElem << "\n";
        Element *tmp= &newElem;
        size++;
        if(first==NULL){
            first= tmp;
            last= tmp;
            (*tmp).setNext(NULL);
            (*tmp).setPrev(NULL);
            return;
        }
        (*tmp).setNext(first);
        (*first).setPrev(tmp);
        (*tmp).setPrev(NULL);
        first= tmp;
    }
    
    void List::pushBack(Element *elem){
        size++;
        if(first==NULL){
            first= elem;
            last= elem;
            (*elem).setNext(NULL);
            (*elem).setPrev(NULL);
            return;
        }
        (*first).setNext(elem);
        (*elem).setPrev(first);
        (*elem).setNext(NULL);
        last= elem;
    }
    
    Element* List::popFront(){
        if(size==0)
            return NULL;
        Element *result= first;
        if(size==1){
            first= NULL;
            last= NULL;
        }else{
            first= (*first).getNext();
            (*first).setPrev(NULL);
        }
        (*result).setNext(NULL);
        (*result).setPrev(NULL);
        size--;
        return result;
    }
    
    Element* List::popBack(){
        if(size==0)
            return NULL;
        Element *result= last;
        if(size==1){
            first= NULL;
            last= NULL;
        }else{
            last= (*last).getPrev();
            (*last).setNext(NULL);
        }
        (*result).setNext(NULL);
        (*result).setPrev(NULL);
        size--;
        return result;
    }
    

    element.cpp

    #include <iostream>
    #include "element.h"
    
    using namespace std;
    
    Element::Element(){
    }
    
    Element::Element(std::string value){
        setValue(value);
        setNext(NULL);
        setPrev(NULL);
    }
    
    void Element::setPrev(Element *p){
        prev= p;
    }
    
    Element* Element::getPrev(){
        return prev;
    }
    
    void Element::setNext(Element *n){
        next= n;
    }
    
    Element* Element::getNext(){
        return next;
    }
    
    void Element::setValue(std::string val){
        value= val;
    }
    
    std::string Element::getValue(){
        return value;
    }
    
    int Element::compareTo(std::string value2) {
        return value>value2;
    }
    
    void Element::swapElems(Element *e1, Element *e2){
        std::string tmp((*e1).getValue());
        (*e1).setValue((*e2).getValue());
        (*e2).setValue(tmp);
    }
    

    das Problem:
    bei der pushFront methode wird dem neuen Element immer wieder der alte platz zugewiesen,

    D:\workspace\ListC>main
    ListTest
    test1
    new element pos: 0x22fdf0
    new element pos: 0x22fdf0
    new element pos: 0x22fdf0
    new element pos: 0x22fdf0
    

    dann gibt es eine exception bei
    (*last).setNext(NULL);
    in der popBack methode, da last in der Zeile auf NULL zeigt

    es werden also irgendwie keine kopien von den elementen angelegt 😕

    hoffe mal das ihr mir da wieder helfen könnt 👏 😉


Anmelden zum Antworten