<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen]]></title><description><![CDATA[<p>Hallo,<br />
zuerst entschuldige ich mich für den schlecht getroffenen Titel. Mir ist einfach nichts besseres eingefallen..</p>
<p>Nun zu meinem Problem:<br />
Ich mache momentan eine Ausbildung (FI-AE) und habe vor kurzem die Aufgabe bekommen, verschiedene Listen zu programmieren (zuerst in C und nun objektorientiert). Das ist soweit auch kein Problem. Jetzt soll ich jedoch den &quot;next-Pointer&quot; aus meiner Klasse &quot;ListNode&quot; in die jeweiligen Klassen der Listen versetzen. Ist das möglich?</p>
<p>Header (stark gekürzt um es übersichtlich zu halten):</p>
<pre><code>class ListNode
{
public:
    ListNode();
    ~ListNode();
    void setFirstname(string);
    void setLastname(string);
    void setNext(ListNode*);
    void setPrev(ListNode*);
    string getFirstname(void) const;
    string getLastname(void) const;
    ListNode* getNext(void) const;
    ListNode* getPrev() const;

private:
    ListNode *next;    //Dieser Pointer soll in die jeweiligen Klassen der
                       //Listen und da verwaltet werden
    ListNode *prev;    //Und der hier auch
    string firstname;
    string lastname;
};

class Stack
{
public:
    Stack();
    ~Stack();
    void push(ListNode*);
    void pop(void);
    ListNode* top(void) const;
    bool isEmpty(void) const;
    void clear(void);

private:
    ListNode *firstElement;
    ListNode *lastElement;
};

class doubleLinkedList
{
public:
    doubleLinkedList();
    ~doubleLinkedList();
    void add(ListNode*);
    void clear(void);
    void inserAfter(ListNode*, ListNode*);
    bool isEmpty(void) const;
    void remove(ListNode*);

private:
    ListNode *topElement;
    ListNode *lastElement;
};
</code></pre>
<p>Stack.cpp:</p>
<pre><code>Stack::Stack()
{
    firstElement = NULL;
    lastElement = NULL;
}

Stack::~Stack()
{
    firstElement = NULL;
    lastElement = NULL;
}

void Stack::push(ListNode *node)
{
    if(node == NULL)
        return;

    if(isEmpty())
        firstElement = node;

    else
        lastElement-&gt;setNext(node);

    lastElement = node;
}

ListNode* Stack::top(void) const
{
    return lastElement;
}

bool Stack::isEmpty(void) const
{
    if(firstElement == NULL)
        return true;

    return false;
}

void Stack::pop(void)
{
    ListNode* tmpNode = new ListNode();
    tmpNode = firstElement;

    while(tmpNode-&gt;getNext() != lastElement)
        tmpNode = tmpNode-&gt;getNext();

    tmpNode-&gt;setNext(NULL);
    delete lastElement;
    lastElement = tmpNode;
}

void Stack::clear(void)
{
    ListNode* node = firstElement;

    while(NULL != node)
    {
        ListNode* nextNode = node-&gt;getNext();
        delete node;
        node = nextNode;
    }
    firstElement = NULL;
    lastElement = NULL;
}
</code></pre>
<p>doublelinkedlist.cpp:</p>
<pre><code>doubleLinkedList::doubleLinkedList()
{
    topElement = NULL;
    lastElement = NULL;
}

doubleLinkedList::~doubleLinkedList()
{
    topElement = NULL;
    lastElement = NULL;
}

void doubleLinkedList::add(ListNode *node)
{
    if(node == NULL)
        return;

    if(isEmpty())
        topElement = node;

    else
    {
        lastElement-&gt;setNext(node);
        node-&gt;setPrev(lastElement);
    }

    lastElement = node;
}

void doubleLinkedList::clear(void)
{
    ListNode* node = topElement;

    while(NULL != node)
    {
        ListNode* nextNode = node-&gt;getNext();
        delete node;
        node = nextNode;
    }
    topElement = NULL;
    lastElement = NULL;
}

bool doubleLinkedList::isEmpty(void) const
{
    if(topElement == NULL)
        return true;

    return false;
}

void doubleLinkedList::inserAfter(ListNode *after, ListNode *node)
{
    if(NULL == after || NULL == node || isEmpty())
        return;

    ListNode* listNode = new ListNode();
    *listNode = *node;

    ListNode* tmpNode = after-&gt;getNext();
    after-&gt;setNext(listNode);
    listNode-&gt;setPrev(after);
    listNode-&gt;setNext(tmpNode);
    tmpNode-&gt;setPrev(listNode);
}

void doubleLinkedList::remove(ListNode *node)
{
    if(isEmpty())
        return;

    ListNode* tmpNode = new ListNode();
    tmpNode = topElement;

    if(topElement == node)
    {
        ListNode* tmpNode = topElement;
        topElement = topElement-&gt;getNext();
        delete tmpNode;
        tmpNode = NULL;
        if(NULL == topElement)
            return;
    }

    while(tmpNode != NULL)
    {
        if(tmpNode-&gt;getNext() == node)
        {
            tmpNode-&gt;setNext(tmpNode-&gt;getNext()-&gt;getNext());
            tmpNode-&gt;setPrev(tmpNode-&gt;getPrev()-&gt;getPrev());
        }
        tmpNode = tmpNode-&gt;getNext();
    }
    delete node;
    delete tmpNode;
}
</code></pre>
<p>Danke im Voraus.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/323744/pointer-quot-auslagern-quot-bei-verketteten-listen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 19:44:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/323744.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 13 Feb 2014 17:00:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen on Thu, 13 Feb 2014 17:25:54 GMT]]></title><description><![CDATA[<p>Hallo,<br />
zuerst entschuldige ich mich für den schlecht getroffenen Titel. Mir ist einfach nichts besseres eingefallen..</p>
<p>Nun zu meinem Problem:<br />
Ich mache momentan eine Ausbildung (FI-AE) und habe vor kurzem die Aufgabe bekommen, verschiedene Listen zu programmieren (zuerst in C und nun objektorientiert). Das ist soweit auch kein Problem. Jetzt soll ich jedoch den &quot;next-Pointer&quot; aus meiner Klasse &quot;ListNode&quot; in die jeweiligen Klassen der Listen versetzen. Ist das möglich?</p>
<p>Header (stark gekürzt um es übersichtlich zu halten):</p>
<pre><code>class ListNode
{
public:
    ListNode();
    ~ListNode();
    void setFirstname(string);
    void setLastname(string);
    void setNext(ListNode*);
    void setPrev(ListNode*);
    string getFirstname(void) const;
    string getLastname(void) const;
    ListNode* getNext(void) const;
    ListNode* getPrev() const;

private:
    ListNode *next;    //Dieser Pointer soll in die jeweiligen Klassen der
                       //Listen und da verwaltet werden
    ListNode *prev;    //Und der hier auch
    string firstname;
    string lastname;
};

class Stack
{
public:
    Stack();
    ~Stack();
    void push(ListNode*);
    void pop(void);
    ListNode* top(void) const;
    bool isEmpty(void) const;
    void clear(void);

private:
    ListNode *firstElement;
    ListNode *lastElement;
};

class doubleLinkedList
{
public:
    doubleLinkedList();
    ~doubleLinkedList();
    void add(ListNode*);
    void clear(void);
    void inserAfter(ListNode*, ListNode*);
    bool isEmpty(void) const;
    void remove(ListNode*);

private:
    ListNode *topElement;
    ListNode *lastElement;
};
</code></pre>
<p>Stack.cpp:</p>
<pre><code>Stack::Stack()
{
    firstElement = NULL;
    lastElement = NULL;
}

Stack::~Stack()
{
    firstElement = NULL;
    lastElement = NULL;
}

void Stack::push(ListNode *node)
{
    if(node == NULL)
        return;

    if(isEmpty())
        firstElement = node;

    else
        lastElement-&gt;setNext(node);

    lastElement = node;
}

ListNode* Stack::top(void) const
{
    return lastElement;
}

bool Stack::isEmpty(void) const
{
    if(firstElement == NULL)
        return true;

    return false;
}

void Stack::pop(void)
{
    ListNode* tmpNode = new ListNode();
    tmpNode = firstElement;

    while(tmpNode-&gt;getNext() != lastElement)
        tmpNode = tmpNode-&gt;getNext();

    tmpNode-&gt;setNext(NULL);
    delete lastElement;
    lastElement = tmpNode;
}

void Stack::clear(void)
{
    ListNode* node = firstElement;

    while(NULL != node)
    {
        ListNode* nextNode = node-&gt;getNext();
        delete node;
        node = nextNode;
    }
    firstElement = NULL;
    lastElement = NULL;
}
</code></pre>
<p>doublelinkedlist.cpp:</p>
<pre><code>doubleLinkedList::doubleLinkedList()
{
    topElement = NULL;
    lastElement = NULL;
}

doubleLinkedList::~doubleLinkedList()
{
    topElement = NULL;
    lastElement = NULL;
}

void doubleLinkedList::add(ListNode *node)
{
    if(node == NULL)
        return;

    if(isEmpty())
        topElement = node;

    else
    {
        lastElement-&gt;setNext(node);
        node-&gt;setPrev(lastElement);
    }

    lastElement = node;
}

void doubleLinkedList::clear(void)
{
    ListNode* node = topElement;

    while(NULL != node)
    {
        ListNode* nextNode = node-&gt;getNext();
        delete node;
        node = nextNode;
    }
    topElement = NULL;
    lastElement = NULL;
}

bool doubleLinkedList::isEmpty(void) const
{
    if(topElement == NULL)
        return true;

    return false;
}

void doubleLinkedList::inserAfter(ListNode *after, ListNode *node)
{
    if(NULL == after || NULL == node || isEmpty())
        return;

    ListNode* listNode = new ListNode();
    *listNode = *node;

    ListNode* tmpNode = after-&gt;getNext();
    after-&gt;setNext(listNode);
    listNode-&gt;setPrev(after);
    listNode-&gt;setNext(tmpNode);
    tmpNode-&gt;setPrev(listNode);
}

void doubleLinkedList::remove(ListNode *node)
{
    if(isEmpty())
        return;

    ListNode* tmpNode = new ListNode();
    tmpNode = topElement;

    if(topElement == node)
    {
        ListNode* tmpNode = topElement;
        topElement = topElement-&gt;getNext();
        delete tmpNode;
        tmpNode = NULL;
        if(NULL == topElement)
            return;
    }

    while(tmpNode != NULL)
    {
        if(tmpNode-&gt;getNext() == node)
        {
            tmpNode-&gt;setNext(tmpNode-&gt;getNext()-&gt;getNext());
            tmpNode-&gt;setPrev(tmpNode-&gt;getPrev()-&gt;getPrev());
        }
        tmpNode = tmpNode-&gt;getNext();
    }
    delete node;
    delete tmpNode;
}
</code></pre>
<p>Danke im Voraus.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383046</guid><dc:creator><![CDATA[OraMortis]]></dc:creator><pubDate>Thu, 13 Feb 2014 17:25:54 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen on Thu, 13 Feb 2014 17:13:02 GMT]]></title><description><![CDATA[<p>Das macht herzlich wenig Sinn und ist daher auch nicht möglich<sup>*</sup> (oder du beschreibst dein Problem so schlecht, dass ich es falsch verstehe). Was möchtest du damit erreichen?</p>
<p><sup>*</sup>: Streng genommen, ist es natürlich schon möglich, aber es erfordert ungeheure Verrenkungen, bei denen alles verloren geht, was eine Liste ausmacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383048</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 13 Feb 2014 17:13:02 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen on Thu, 13 Feb 2014 17:23:15 GMT]]></title><description><![CDATA[<p>So etwas dachte ich mir schon und ich sehe den Sinn darin selber nicht wirklich.<br />
Mein Ausbilder meinte, dass es Sinn macht, weil ich den Pointer für das vorherige Element auch darin habe (prev) aber ihn nur bei der doppelt verketteten Liste brauche und es dementsprechend für die anderen Listen nicht brauche.<br />
Wie gesagt verstehe ich die Logik hinter der Aufgabe auch nicht wirklich.</p>
<p>Edit: Ich bearbeite mal eben meinen ersten Post um das &quot;Problem&quot; zu verdeutlichen.</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383050</guid><dc:creator><![CDATA[OraMortis]]></dc:creator><pubDate>Thu, 13 Feb 2014 17:23:15 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen on Fri, 14 Feb 2014 08:08:01 GMT]]></title><description><![CDATA[<p>Hallo OraMortis,</p>
<p>OraMortis schrieb:</p>
<blockquote>
<p>... Jetzt soll ich jedoch den &quot;next-Pointer&quot; aus meiner Klasse &quot;ListNode&quot; in die jeweiligen Klassen der Listen versetzen. Ist das möglich?</p>
</blockquote>
<p>Ich denke, dass ist schon möglich (SeppJ hat das wahrscheinlich anders verstanden). Der übliche Weg dazu, führt über ein Template.</p>
<p>Das Ziel ist es doch, die Klasse, die Du benutzt, von den Innereien des Containers (also des Stacks, bzw. der doubleLinkedList) frei zu halten.<br />
Deine Klasse wäre hier doch</p>
<pre><code>class Name
{
public:
    // Methoden
    std::string firstname;
    std::string lasttname;
};
</code></pre>
<p>Einen Container z.B. einen Stack, kann man jetzt ganz allgemein halten:</p>
<pre><code>template&lt; typename T &gt; // T wird später zu 'Name' (s.o.)
class Stack
{
    struct ListNode // eine private nested class; geht außerhalb von Stack niemanden was an
    {
        ListNode( const T&amp; x, ListNode* n )
            : next( n )
            , data( x )
        {}
        ListNode* next; // Zeiger auf den nächsten, prev braucht es hier nicht
        T data; // die User-Klasse
    };
public:
    // Methoden im Prinzip wie unten, nur das nach außen nur T und nicht
    // 'ListNode' angeboten wird. Z.B.:
    void push( const T&amp; data )
    {
        firstElement = new ListNode( data, firstElement );
    }
    T&amp; top()
    {
        assert( firstElement ); // bei leerem Stack wäre das ein fataler Fehler
        return firstElement-&gt;data;
    }
private:
    ListNode *firstElement;
};

// später 
typedef Stack&lt; Name &gt; NamensStack;
</code></pre>
<p>Tipp: berücksichtige die <a href="http://de.wikipedia.org/wiki/Dreierregel" rel="nofollow">'Regel der drei</a>', in der Praxis sind die Klassen, so wie Du sie gepostet hast, ein kapitaler Fehler!<br />
Tipp 2: Benutze <a href="http://de.wikipedia.org/wiki/Initialisierungsliste" rel="nofollow">Initialisierungslisten</a></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2383118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383118</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 14 Feb 2014 08:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer &amp;quot;auslagern&amp;quot; bei verketteten Listen on Fri, 14 Feb 2014 09:07:14 GMT]]></title><description><![CDATA[<p>OT:<br />
Mir fallen da noch einige andere Sachen auf, die du beherzigen solltest:</p>
<ol>
<li>In deiner Header Datei übergibst du in mehreren Methoden <code>string</code> . Das setzt voraus, dass du in deinem Header irgendwo sowas wie <code>using namespace std;</code> verwendest. Das hebelt das namespace-Konzept völlig aus, da durch sie Mehrdeutigkeiten aufgelöst werden sollen. In einer Header Datei solltest du <strong>niemals</strong> namespaces ausleeren, sondern deine Variablen/Parameter vollständig qualifizieren.<br />
Ausserdem übergibst du strings <code>by Value</code> , was unnötige Kopien nach sich ziehen kann. Wenn möglich solltest du sie als <code>const std::string&amp;</code> übergeben, was keine Kopien erzeugt. Sie <code>by Value</code> zu übergeben ist in Ordnung, wenn du statt einer Zuweisung an ein Attribut <code>swap</code> benutzt (was ich ausser bei Zuweisungsoperatoren noch nirgendwo gesehen habe).</li>
</ol>
<pre><code>// Option 1
void MyClass::set_name( const string&amp; Name )
{
   MyMemberName_ = Name;
}

// oder Option 2
void MyClass:set_name( string Name )
{
   swap( MyMemberName, Name );
}
</code></pre>
<ol start="2">
<li>In C++ lässt man üblicherweise das <code>void</code> bei parameterlosen Funktion/Methoden weg. Ich weiss nicht, ob dein Ausbilder das so von dir verlangt, aber es ist unüblich.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2383121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2383121</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Fri, 14 Feb 2014 09:07:14 GMT</pubDate></item></channel></rss>