<?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[Verkettete Listen]]></title><description><![CDATA[<p>Ich befinde mich gerade auf einem Tiefpunkt von meiner derzeitigen C++ Laufbahn. Vor ein paar Tagen dacht ich mir noch, &quot;Ja langsam kann ich ja echt was, ich check fast alles.&quot;, doch heute hab ich mit Kapitel 19 von meinem Buch angefangen (Jetzt lerne ich C++), mit dem Thema &quot;verkettete Listen&quot;. Das ganze Kapitel besteht nur aus einen riesen Quellcode, der, wie ich finde völlig unzureichend erklärt wird. Ich versteh den Code zwar schon, und die Befehle, aber den Sinn...etc..überhaupt nicht.<br />
Genauso verstehe ich nicht für was man &quot;verkettete Listen&quot; eigentlich braucht?<br />
Ich mein wenn ich n paar Zahlen rumsortieren möchte, dann kann ich doch genauso <a href="std::vector" rel="nofollow">std::vector</a> nehmen, und dann nen Sortieralgorithmus drüber laufen lasse.<br />
Hier ist mal der Code aus meinem Buch:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

enum {kIsSmaller,kIsLarger,kIsSame};

class Data
{
    public:
    Data(int val):myValue(val){}
    ~Data(){}
    int Compare(const Data &amp;);
    void Show() {cout &lt;&lt; myValue &lt;&lt; endl;}

    private:
    int myValue;
};

int Data::Compare(const Data &amp;theOtherData)
{
    if (myValue &lt; theOtherData.myValue)
    return kIsSmaller;
    if (myValue &gt; theOtherData.myValue)
    return kIsLarger;
    else
    return kIsSame;
}

class Node;
class HeadNode;
class TailNode;
class InternalNode;

class Node
{
    public:
    Node() {}
    virtual ~Node() {}
    virtual Node * Insert(Data * theData) = 0;
    virtual void Show() = 0;

    private:
};

class InternalNode: public Node
{
    public:
    InternalNode(Data * theData, Node * next);
    virtual ~InternalNode() {delete myNext; delete myData;}
    virtual Node * Insert(Data * theData);
    virtual void Show()
        { myData-&gt;Show(); myNext-&gt;Show();}

    private:
    Data * myData;
    Node * myNext;
};

InternalNode::InternalNode(Data * theData, Node *next):
myData(theData), myNext(next)
{

}

Node * InternalNode::Insert(Data * theData)
{
    int result=myData-&gt;Compare(*theData);
    switch(result)
    {
        case kIsSame:
        case kIsLarger:
            {
                InternalNode * dataNode =
                    new InternalNode(theData, this);
                    return dataNode;
            }
        case kIsSmaller:
            myNext = myNext-&gt;Insert(theData);
            return this;
    }
    return this;
}

class TailNode : public Node
{
    public:
    TailNode() {}
    virtual ~TailNode() {}
    virtual Node * Insert(Data * theData);
    virtual void Show() {}
    private:
};

Node * TailNode::Insert(Data * theData)
{
    InternalNode * dataNode = new InternalNode(theData, this);
    return dataNode;
}

class HeadNode : public Node
{
    public:
    HeadNode();
    virtual ~HeadNode() {delete myNext;}
    virtual Node * Insert(Data * theData);
    virtual void Show() {myNext-&gt;Show();}
    private:
    Node * myNext;
};

HeadNode::HeadNode()
{
    myNext=new TailNode;
}

Node * HeadNode::Insert(Data * theData)
{
    myNext=myNext-&gt;Insert(theData);
    return this;
}

class LinkedList
{
    public:
    LinkedList();
    ~LinkedList() {delete myHead;}
    void Insert(Data * theData);
    void ShowAll() {myHead-&gt;Show();}

    private:
    HeadNode * myHead;
};

LinkedList::LinkedList()
{
    myHead = new HeadNode;
}

void LinkedList::Insert(Data * pData)
{
    myHead-&gt;Insert(pData);
}

int main()
{
    Data *pData;
    int val;
    LinkedList ll;

    for(;;)
    {
        cout &lt;&lt; &quot;Welcher Wert? (0 zum Beenden): &quot;;
        cin &gt;&gt; val;
        if (!val)
            break;
        pData=new Data(val);
        ll.Insert(pData);
    }
    ll.ShowAll();
    return 0;

}
</code></pre>
<p>Vll. hat ja jemand lust, mir wenigstens das Grundverständnis des Codes zu erklären. Der Witz des Codes, die Poente....<br />
Lol, und ich hab geglaubt das schlimmste in C++ hab ich hinter mir.</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193405/verkettete-listen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 05:13:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193405.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 25 Sep 2007 19:35:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 19:35:15 GMT]]></title><description><![CDATA[<p>Ich befinde mich gerade auf einem Tiefpunkt von meiner derzeitigen C++ Laufbahn. Vor ein paar Tagen dacht ich mir noch, &quot;Ja langsam kann ich ja echt was, ich check fast alles.&quot;, doch heute hab ich mit Kapitel 19 von meinem Buch angefangen (Jetzt lerne ich C++), mit dem Thema &quot;verkettete Listen&quot;. Das ganze Kapitel besteht nur aus einen riesen Quellcode, der, wie ich finde völlig unzureichend erklärt wird. Ich versteh den Code zwar schon, und die Befehle, aber den Sinn...etc..überhaupt nicht.<br />
Genauso verstehe ich nicht für was man &quot;verkettete Listen&quot; eigentlich braucht?<br />
Ich mein wenn ich n paar Zahlen rumsortieren möchte, dann kann ich doch genauso <a href="std::vector" rel="nofollow">std::vector</a> nehmen, und dann nen Sortieralgorithmus drüber laufen lasse.<br />
Hier ist mal der Code aus meinem Buch:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

enum {kIsSmaller,kIsLarger,kIsSame};

class Data
{
    public:
    Data(int val):myValue(val){}
    ~Data(){}
    int Compare(const Data &amp;);
    void Show() {cout &lt;&lt; myValue &lt;&lt; endl;}

    private:
    int myValue;
};

int Data::Compare(const Data &amp;theOtherData)
{
    if (myValue &lt; theOtherData.myValue)
    return kIsSmaller;
    if (myValue &gt; theOtherData.myValue)
    return kIsLarger;
    else
    return kIsSame;
}

class Node;
class HeadNode;
class TailNode;
class InternalNode;

class Node
{
    public:
    Node() {}
    virtual ~Node() {}
    virtual Node * Insert(Data * theData) = 0;
    virtual void Show() = 0;

    private:
};

class InternalNode: public Node
{
    public:
    InternalNode(Data * theData, Node * next);
    virtual ~InternalNode() {delete myNext; delete myData;}
    virtual Node * Insert(Data * theData);
    virtual void Show()
        { myData-&gt;Show(); myNext-&gt;Show();}

    private:
    Data * myData;
    Node * myNext;
};

InternalNode::InternalNode(Data * theData, Node *next):
myData(theData), myNext(next)
{

}

Node * InternalNode::Insert(Data * theData)
{
    int result=myData-&gt;Compare(*theData);
    switch(result)
    {
        case kIsSame:
        case kIsLarger:
            {
                InternalNode * dataNode =
                    new InternalNode(theData, this);
                    return dataNode;
            }
        case kIsSmaller:
            myNext = myNext-&gt;Insert(theData);
            return this;
    }
    return this;
}

class TailNode : public Node
{
    public:
    TailNode() {}
    virtual ~TailNode() {}
    virtual Node * Insert(Data * theData);
    virtual void Show() {}
    private:
};

Node * TailNode::Insert(Data * theData)
{
    InternalNode * dataNode = new InternalNode(theData, this);
    return dataNode;
}

class HeadNode : public Node
{
    public:
    HeadNode();
    virtual ~HeadNode() {delete myNext;}
    virtual Node * Insert(Data * theData);
    virtual void Show() {myNext-&gt;Show();}
    private:
    Node * myNext;
};

HeadNode::HeadNode()
{
    myNext=new TailNode;
}

Node * HeadNode::Insert(Data * theData)
{
    myNext=myNext-&gt;Insert(theData);
    return this;
}

class LinkedList
{
    public:
    LinkedList();
    ~LinkedList() {delete myHead;}
    void Insert(Data * theData);
    void ShowAll() {myHead-&gt;Show();}

    private:
    HeadNode * myHead;
};

LinkedList::LinkedList()
{
    myHead = new HeadNode;
}

void LinkedList::Insert(Data * pData)
{
    myHead-&gt;Insert(pData);
}

int main()
{
    Data *pData;
    int val;
    LinkedList ll;

    for(;;)
    {
        cout &lt;&lt; &quot;Welcher Wert? (0 zum Beenden): &quot;;
        cin &gt;&gt; val;
        if (!val)
            break;
        pData=new Data(val);
        ll.Insert(pData);
    }
    ll.ShowAll();
    return 0;

}
</code></pre>
<p>Vll. hat ja jemand lust, mir wenigstens das Grundverständnis des Codes zu erklären. Der Witz des Codes, die Poente....<br />
Lol, und ich hab geglaubt das schlimmste in C++ hab ich hinter mir.</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372648</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 19:54:43 GMT]]></title><description><![CDATA[<p>Die Pointe willst du wissen?</p>
<p>In C++ benutzt man dazu std::list<br />
(ein standardisierter Container, wie vector!)<br />
und entwickelt keine eigene Version davon <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Sieh es einfach mal als Übung an...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372668</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Tue, 25 Sep 2007 19:54:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 20:02:50 GMT]]></title><description><![CDATA[<p>Verkettete Listen haben schon ihre Vorteile. Dadurch, dass die Elemente mit Pointern miteinander verbunden sind und somit praktisch unabhängig voneinander (und nicht im Speicher direkt hintereinander liegen wie bei arrays/vector), kann man sehr schnell ein Element aus der Mitte rauslöschen oder einfügen. Dazu musst du halt nur das betreffende Objekt erstellen bzw löschen und ein paar Zeiger umbiegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372673</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 25 Sep 2007 20:02:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 21:13:09 GMT]]></title><description><![CDATA[<p><a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1324660.html#1324660" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1324660.html#1324660</a><br />
<a href="http://c-plusplus.net/forum/viewtopic-var-p-is-1320723.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-p-is-1320723.html</a></p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372693</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 25 Sep 2007 21:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 22:18:26 GMT]]></title><description><![CDATA[<p>Der Code ist auch fürchterlich. Vergiss den. Oder guck ihn dir ruhig genau an bis du verstehst was abgeht, aber mache nicht den Fehler das als gutes Beispiel zu nehmen vonwegen elegant oder sonstwas - ist es nicht, ist nur übel.</p>
<p>Was für eine Berechtigung Listen in C++ haben? Listen sind unter bestimmten Voraussetzungen sehr schnell. In der Mitte einfügen/rauslöschen wurde schon erwähnt.</p>
<p>Eine andere Sache wie Listen unheimlich praktisch sein können sind sog. &quot;intrusive lists&quot; - das sind Listen die man aus Daten-Elementen aufbaut die die ihre &quot;Node&quot; bereits &quot;eingebaut&quot; haben. Da so kein Speicher für die Nodes mehr angefordert werden muss kann man so garantieren dass sämtliche Operationen auf der Liste keine Exceptions werfen können. Das mag trivial klingen, ist aber manchmal ein echter Lebensretter ohne den man sich einrexen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372713</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 25 Sep 2007 22:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 25 Sep 2007 22:38:48 GMT]]></title><description><![CDATA[<p>Ehm der Code ist aber echt was fürn untern Tisch ^^ Da sollte man einiges umdesignen ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1372719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1372719</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Tue, 25 Sep 2007 22:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Wed, 26 Sep 2007 11:45:06 GMT]]></title><description><![CDATA[<p>Da mein Buch anscheinend so sch**** ist, hätt vll. jemand n gutes &quot;verkettete Listen&quot; Tutorial? Oder eine &quot;eleganteres&quot; Beispiel. Weil wenn will ichs ja gleich gescheit lernen.<br />
MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373032</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Wed, 26 Sep 2007 11:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:08:21 GMT]]></title><description><![CDATA[<p>Weiß echt keiner eine &quot;www-Adresse&quot; für mich? Also ich hab gegoogelt und so, aber nix gefunden irgendwie.<br />
MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373775</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:08:21 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:27:00 GMT]]></title><description><![CDATA[<p>Dann hast du aber nicht gut geschaut. Ich habe bei Google z.Bsp. das hier gefunden.<br />
<a href="http://hal.iwr.uni-heidelberg.de/lehre/inf1-ws02/html/node47.html" rel="nofollow">http://hal.iwr.uni-heidelberg.de/lehre/inf1-ws02/html/node47.html</a><br />
<a href="http://cib.bau.tu-dresden.de/lehre/scripte/bauinfo1/U-3-1_verk-List_02-02-01.ppt" rel="nofollow">http://cib.bau.tu-dresden.de/lehre/scripte/bauinfo1/U-3-1_verk-List_02-02-01.ppt</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373787</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:36:07 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Dann hast du aber nicht gut geschaut. Ich habe bei Google z.Bsp. das hier gefunden.<br />
<a href="http://hal.iwr.uni-heidelberg.de/lehre/inf1-ws02/html/node47.html" rel="nofollow">http://hal.iwr.uni-heidelberg.de/lehre/inf1-ws02/html/node47.html</a><br />
<a href="http://cib.bau.tu-dresden.de/lehre/scripte/bauinfo1/U-3-1_verk-List_02-02-01.ppt" rel="nofollow">http://cib.bau.tu-dresden.de/lehre/scripte/bauinfo1/U-3-1_verk-List_02-02-01.ppt</a></p>
</blockquote>
<p>Hab' mir mal die 2. angesehen und finde die aber auch nicht so dolle (wildes C/C++-Mix, tw. konfuse Darstellung, Fehler in Beispielprogrammen, &quot;iostream.h&quot;, ...)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373796</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:36:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:39:12 GMT]]></title><description><![CDATA[<p>Hast du dir meinen ersten Link angeschaut !?<br />
Da kannst du dir das von mir für den ersten Einstieg anschauen und das dann von Werner versuchen zu verstehen ...</p>
<p>Edit: Wenn du das von Werner dir anschaust, nimm die Stift und Papier dazu und versuche es zu verfolgen, wenn du es dann einmal gerafft hast, vergisst du es nie wieder.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373798</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:54:05 GMT]]></title><description><![CDATA[<p>Ich weiß gar nicht, ob du überhaupt ein Tutorial brauchst; verkettete Listen sind eigentlich sehr einfach. Ich versuche einfach mal zusammenzufassen, was ich weiß:<br />
Es gibt einfach verkettete und doppelt verkettete Listen. Es gibt zirkuläre und nicht-zirkuläre, intrusive- und nonintrusive-Listen.</p>
<p>Eine einfache einfach-verkettete Liste mag so aussehen:</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct Node
{
    T     value;
    Node* next;
};

template&lt;class T&gt; class SingleLinkedList
{
private:
    Node* start;

public:
    // add, delete, search, ...
};
</code></pre>
<p>Dabei hat einfach jedes Teil der Liste einen Zeiger auf das nächste Element und NULL für &quot;es gibt kein nächstes&quot;, jedenfalls bei nicht-zirkulären. Bei zirkulären Listen zeigt das letzte Element wieder auf das erste.</p>
<p>Bei doppelt verketteten Listen hat jedes Element noch einen Zeiger auf das vorherige Element.</p>
<p>Intrusivität hat hustbaer ja schon erklärt, hier aber nochmal ausführlicher: Bei non-intrusive-Listen fügt man ein Element in die Liste z.B. mit list.add( &quot;hallo&quot; ); ein, man gibt also den Datenwert an; die Liste fügt ein Node ein, setzt die Zeiger und der Member &quot;value&quot; der Node bekommt den Wert, der bei list.add übergeben wurde (per Copy-Konstruktor z.B.).</p>
<p>Bei instrusive-Listen bekommt man bei list.add einen fertigen Node gereicht (bzw einen Zeiger darauf) und braucht diesen nur noch einzufügen.</p>
<p>Beispiel non-intrusive:</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct Node
{
    T     value;
    Node* next;

    Node( Node* n, T v ) : next(n), value(v)
    {}
};

template&lt;class T&gt; class SingleLinkedList
{
private:
    Node* start;

public:
    void push_to_front( T value )
    {
        start = new Node( start, value );
    }
};

..

SingleLinkedList&lt;int&gt; list;
list.push_to_front( 10 );
</code></pre>
<p>Beispiel intrusive:</p>
<pre><code class="language-cpp">template&lt;class T&gt; struct Node
{
    T     value;
    Node* next;

    Node( T v ) : value(v), next(NULL)
    {}
};

template&lt;class T&gt; class SingleLinkedList
{
private:
    Node* start;

public:
    void push_to_front( Node* n )
    {
         n-&gt;next = start;
         start = n;
    }
};

..

SingleLinkedList&lt;int&gt; list;
Node* n = new Node( 10 );
list.push_to_front( n );
</code></pre>
<p>Aso, zwei Sachen noch: Die Klasse (hier z.B. SingleLinkedList) kann auch noch einen Zeiger auf die letzte Node haben, um leichter hinten einfügen zu können, oder zum rückwärts-iterieren. Und zum Suchen von Elementen oder einfügen in der Mitte musst du dich natürlich von Node zu Node hangeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373799</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:43:13 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a><br />
Ich wollte anhand der Links erstmal nur zeigen, dass es bei Google etwas gibt. Kann sein, dass die verbesserungswürdig sind.<br />
Das Problem ist hier wahrscheinlich die Existenz von std::list. Seit es die gibt, ist der Bedarf an Tutorials über verkettete Listen für C++ etwas gesunken. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373800</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:45:06 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a><br />
Ich wollte anhand der Links erstmal nur zeigen, dass es bei Google etwas gibt....</p>
</blockquote>
<p>Ich weiß.<br />
Sollte auch keine Kritik an Dir sein, sondern lediglich ein Hinweis für den unbedarften &quot;Draufclicker&quot;, dass die 2. Quelle mit Vorsicht zu genießen ist.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373801</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:48:25 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>...verkettete Listen sind eigentlich sehr einfach....</p>
</blockquote>
<p>Finde ich eigentlich auch ... kannst Du mir mal sagen, warum in dem OP-Beispiel und auch dem einen von Brauns Links &quot;Head&quot; und &quot;Tail&quot; eine Sonderrolle bekommen ?<br />
(Ich hätte das so wie Du implementiert und &quot;ungefüllte Verweise&quot; auf 0 gebogen)</p>
<p>Braucht man irgendwo die Unterscheidung in &quot;Node, Head, Tail&quot; ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373804</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 11:59:02 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Braucht man irgendwo die Unterscheidung in &quot;Node, Head, Tail&quot; ?</p>
</blockquote>
<p>Mir kommt es jedenfalls nur vor als wäre das ein wenig über-objektorientiert. Im Code vom OP hat ja die Node-Klasse virtuelle Funktionen und drei abgeleitete Klassen, imho ein wenig zuviel des Ganzen, für diese Funktionalität auf jeden Fall. Obwohl die Liste dort wohl auch sortiert, was ich so auch noch nicht kenne, wofür man aber sicherlich auch nicht den ganzen Overhead braucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373812</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 27 Sep 2007 11:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 12:03:25 GMT]]></title><description><![CDATA[<p>Ncoh mal ganz ganz kurz zu dem &quot;schlechten&quot; Beispiel aus meinem Buch, da hieß es ja am anfang:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
using namespace std; 

enum {kIsSmaller,kIsLarger,kIsSame}; 

class Data 
{ 
    public: 
    Data(int val):myValue(val){} 
    ~Data(){} 
    int Compare(const Data &amp;); 
    void Show() {cout &lt;&lt; myValue &lt;&lt; endl;} 

    private: 
    int myValue; 
}; 

int Data::Compare(const Data &amp;theOtherData) 
{ 
    if (myValue &lt; theOtherData.myValue) 
    return kIsSmaller; 
    if (myValue &gt; theOtherData.myValue) 
    return kIsLarger; 
    else 
    return kIsSame; 
} 

class Node;  // &lt;--?
class HeadNode; //&lt;--?
class TailNode;  //&lt;--?
class InternalNode;  //&lt;--?

class Node 
{ 
    public: 
    Node() {} 
    virtual ~Node() {}
//..........

//..............

//......................

//:..........................
</code></pre>
<p>Da wo ich jetzt im Code überall so &quot;&lt;--&quot; hingemacht habe, was ist das? Ist das irgendeine Sonderform die nur bei &quot;verketteten Listen&quot; angewndet wird...oder was ist das? Sry, sowas hab ich irgendwie noch nie gesehen, oder steht ich jetzt irgendwie nur auf der LEitung, eine andere schreibweise für was bock &quot;bekanntes&quot; was ich auch kenne?..Kann mirs jemand sagen?<br />
MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373816</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Thu, 27 Sep 2007 12:03:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 12:08:56 GMT]]></title><description><![CDATA[<p>Das sind einfach nur Vorwärts-Deklarationen, hat auch nix mit Listen speziell zu tun <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Braucht man öfters mal, um den Compiler ruhig zu stellen. Wenn man z.B. zwei Klassen hat, wo jede davon einen Zeiger auf die jeweils andere hat,</p>
<pre><code class="language-cpp">class A {
    B* b;
};

class B {
    A* a;
};
</code></pre>
<p>kennt der Compiler natürlich die Klasse B noch nicht, wenn er versucht, die Klasse A zu verstehen. Deshalb macht man eine Vorwärts-Deklaration und sagt damit dem Compiler: &quot;Da gibts eine Klasse B, über die erzähl ich dir später was&quot;:</p>
<pre><code class="language-cpp">// Mensch an Compiler: &quot;Da gibts eine Klasse B, über die erzähl ich dir später was&quot;
class B;

class A {
    B* b;
};

// Mensch an Compiler: &quot;Siehst du, hier ist sie&quot;
class B {
    A* a;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1373824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373824</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 27 Sep 2007 12:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 12:18:22 GMT]]></title><description><![CDATA[<p>MH achso, also wenn man jetzt schon was aufgreift, obwohl die Klassen Deklaration erst später kommt.</p>
<pre><code class="language-cpp">//class B; &lt;--kann ich auch hier hin schreiben, anstatt vor das &quot;;&quot; nach der Klasse A!?

class A
{
    public:
    A() {};
    ~A() {};
    private:
    B *object;
}
class B;

class B
{
    public:
    B() {};
    ~B() {};
    private:
};
</code></pre>
<p>ist sowas gemeint? Aber ich mein, dann kann man ja auch gleich einfach:</p>
<pre><code class="language-cpp">class B
{
    public:
    B() {};
    ~B() {};
    private:
};

class A
{
    public:
    A() {};
    ~A() {};
    private:
    B *object;
};
</code></pre>
<p>so machen?<br />
Oder liegt es da einfach wieder am &quot;Stil&quot;...kp :D, oder weil der Programmierer erst bock hat die eine Klasse zu machen als die andere?</p>
<p>Mh, also im großen und ganzen hab ichs verstanden glaub ich.</p>
<p>MfG<br />
Stromberg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373837</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Thu, 27 Sep 2007 12:18:22 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Thu, 27 Sep 2007 12:48:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A
{
    B* b;
}
class B;
</code></pre>
<p>Geht gar nicht! Das muss schon vor der Deklaration von A sein, weil der Compiler bei &quot;B* b;&quot; ja den Bezeichner B noch nicht kennt. Und zwischen &quot;}&quot; und &quot;;&quot; am Ende der Klasse steht wenn dann nur eine Instanzdeklaration der Klasse. Soll heißen (<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />), dass man mit <code>class A { ... } a;</code> gleich schon eine Variable vom Typ &quot;A&quot; deklariert.</p>
<p>Stromberg schrieb:</p>
<blockquote>
<p>ist sowas gemeint? Aber ich mein, dann kann man ja auch gleich einfach:</p>
<pre><code class="language-cpp">class B
{
    public:
    B() {};
    ~B() {};
    private:
};

class A
{
    public:
    A() {};
    ~A() {};
    private:
    B *object;
};
</code></pre>
<p>so machen?</p>
</blockquote>
<p>Ja klar, aber in meinem Beispiel oben hatte die Klasse B ja noch einen Zeiger auf die Klasse A. Nennt sich dann glaubich zirkuläre Abhängigkeit oder so. Jedenfalls braucht man dann in jedem Fall eine Vorwärts-Deklaration <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1373863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1373863</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 27 Sep 2007 12:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Sat, 29 Sep 2007 16:33:34 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>...verkettete Listen sind eigentlich sehr einfach....</p>
</blockquote>
<p>Finde ich eigentlich auch ... kannst Du mir mal sagen, warum in dem OP-Beispiel und auch dem einen von Brauns Links &quot;Head&quot; und &quot;Tail&quot; eine Sonderrolle bekommen ? <em>[sic]</em><br />
(Ich hätte das so wie Du implementiert und &quot;ungefüllte Verweise&quot; auf 0 gebogen)</p>
<p>Braucht man irgendwo die Unterscheidung in &quot;Node, Head, Tail&quot; ? <em>[sic]</em></p>
</blockquote>
<p>Keine Unterscheidung wie im OP, aber es kann durchaus nützlich sein <em>Head</em> und <em>Tail</em> als Dummy-Elemente zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374957</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sat, 29 Sep 2007 16:33:34 GMT</pubDate></item></channel></rss>