<?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>Hallo,<br />
in meinem Buch wird das Thema Verkettete Listen OO verdeutlicht. Hier mal die Klassendefinitionen:</p>
<pre><code class="language-cpp">class Knoten { 
public: 
   Knoten() {} 
   virtual ~Knoten() {} 
   virtual Knoten* einfuegen( Daten* d ) = 0; 
   virtual void anzeigen() = 0; 
}; 
class AllgemeinerKnoten : public Knoten { 
private: 
   Daten* daten; 
   Knoten* next; 
public: 
   // Konstruktor 
   AllgemeinerKnoten( Daten* d, Knoten* n ): 
                                 daten(d), next(n) { 
   // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
   cout &lt;&lt; &quot;Objekt [AllgemeinerKnoten] erzeugt\n&quot;; 
   } 
   // Destruktor 
   ~AllgemeinerKnoten() { 
      delete next; 
      delete daten; 
   } 
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen(); 
};

class EndKnoten : public Knoten { 
public: 
   EndKnoten() { 
   // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
   cout &lt;&lt; &quot;Objekt [EndKnoten] erzeugt\n&quot;; 
   } 
   ~EndKnoten() {} 
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen() { }; 
}; 

private: 
   // ... zeigt immer auf das erste Element 
   Knoten* next; 
public: 
   // Konstruktor 
   AnfangsKnoten() { 
      // ... gleich auch einen Endknoten erzeugen 
      next = new EndKnoten; 
      // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
      cout &lt;&lt; &quot;Objekt [AnfangsKnoten] erzeugt\n&quot;; 
   } 
   ~AnfangsKnoten() {}
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen(); 
}; 
class Liste { 
private: 
   AnfangsKnoten *anfang; 
public: 
   // Bei Anlegen gleich ein Objekt &quot;Anfangsknoten&quot; erzeugen 
   // Der Konstruktor von &quot;AnfangsKnoten&quot; erzeugt wiederum 
   // ein Objekt &quot;EndKnoten&quot;, auf das dieser gleich zeigt. 
   Liste() { anfang = new AnfangsKnoten; } 
   ~Liste() { delete anfang; } 
   void einfuegen( Daten* d ) { 
      anfang-&gt;einfuegen(d); 
   } 
   void alles_anzeigen() { 
      anfang-&gt;anzeigen(); 
   } 
};
</code></pre>
<p>Die Methoden habe ich jetzt mal weggelassen.<br />
Das ganze Funktioniert im Prinzip so:<br />
Anfangsknoten&lt;-&gt;AllgemeinerKnoten&lt;-&gt;---&lt;-&gt;AllgemeinerKnoten&lt;-&gt;Endknoten</p>
<p>Mein Problem ist jetzt Der Destruktur von Alg.Knoten löscht jeweils den nächsten, auf den er zeigt. Also der Letzte AlgKnoten den Endknoten etc. Der Anfangsknoten wird von der Liste gelöscht. Nur wie wird der erste allgemeine Knoten in der Liste gelöscht?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262560/verkettete-listen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 11:13:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262560.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Mar 2010 10:36:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verkettete Listen on Mon, 08 Mar 2010 10:36:48 GMT]]></title><description><![CDATA[<p>Hallo,<br />
in meinem Buch wird das Thema Verkettete Listen OO verdeutlicht. Hier mal die Klassendefinitionen:</p>
<pre><code class="language-cpp">class Knoten { 
public: 
   Knoten() {} 
   virtual ~Knoten() {} 
   virtual Knoten* einfuegen( Daten* d ) = 0; 
   virtual void anzeigen() = 0; 
}; 
class AllgemeinerKnoten : public Knoten { 
private: 
   Daten* daten; 
   Knoten* next; 
public: 
   // Konstruktor 
   AllgemeinerKnoten( Daten* d, Knoten* n ): 
                                 daten(d), next(n) { 
   // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
   cout &lt;&lt; &quot;Objekt [AllgemeinerKnoten] erzeugt\n&quot;; 
   } 
   // Destruktor 
   ~AllgemeinerKnoten() { 
      delete next; 
      delete daten; 
   } 
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen(); 
};

class EndKnoten : public Knoten { 
public: 
   EndKnoten() { 
   // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
   cout &lt;&lt; &quot;Objekt [EndKnoten] erzeugt\n&quot;; 
   } 
   ~EndKnoten() {} 
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen() { }; 
}; 

private: 
   // ... zeigt immer auf das erste Element 
   Knoten* next; 
public: 
   // Konstruktor 
   AnfangsKnoten() { 
      // ... gleich auch einen Endknoten erzeugen 
      next = new EndKnoten; 
      // Zu Debug- bzw. Verständniszwecken ggf. entfernen 
      cout &lt;&lt; &quot;Objekt [AnfangsKnoten] erzeugt\n&quot;; 
   } 
   ~AnfangsKnoten() {}
   // Implizit virtual 
   Knoten* einfuegen( Daten* d ); 
   // Implizit virtual 
   void anzeigen(); 
}; 
class Liste { 
private: 
   AnfangsKnoten *anfang; 
public: 
   // Bei Anlegen gleich ein Objekt &quot;Anfangsknoten&quot; erzeugen 
   // Der Konstruktor von &quot;AnfangsKnoten&quot; erzeugt wiederum 
   // ein Objekt &quot;EndKnoten&quot;, auf das dieser gleich zeigt. 
   Liste() { anfang = new AnfangsKnoten; } 
   ~Liste() { delete anfang; } 
   void einfuegen( Daten* d ) { 
      anfang-&gt;einfuegen(d); 
   } 
   void alles_anzeigen() { 
      anfang-&gt;anzeigen(); 
   } 
};
</code></pre>
<p>Die Methoden habe ich jetzt mal weggelassen.<br />
Das ganze Funktioniert im Prinzip so:<br />
Anfangsknoten&lt;-&gt;AllgemeinerKnoten&lt;-&gt;---&lt;-&gt;AllgemeinerKnoten&lt;-&gt;Endknoten</p>
<p>Mein Problem ist jetzt Der Destruktur von Alg.Knoten löscht jeweils den nächsten, auf den er zeigt. Also der Letzte AlgKnoten den Endknoten etc. Der Anfangsknoten wird von der Liste gelöscht. Nur wie wird der erste allgemeine Knoten in der Liste gelöscht?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865799</guid><dc:creator><![CDATA[Tom2]]></dc:creator><pubDate>Mon, 08 Mar 2010 10:36:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Mon, 08 Mar 2010 11:11:55 GMT]]></title><description><![CDATA[<p>da fehlt dem Anfangsknoten wohl auch ein delete nex; im Destruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865815</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 08 Mar 2010 11:11:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Mon, 08 Mar 2010 11:22:16 GMT]]></title><description><![CDATA[<p>Gut hätte ich auch gesagt. Der Fehler wird aber auch in den folgenden Kapiteln, die darauf aufbauen nicht behoben.</p>
<p>Dann noch eine Frage in einem späteren Kapitel wird an dem Beispiel das Arbeiten mit Templates verdeutlicht.<br />
Da werden alle Knoten Klassen mit Templates ausgestattet. Aber hätte man nicht einfach die Klasse Daten, in der die Werte gespeichert sind mit Templates ausstatten können?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865820</guid><dc:creator><![CDATA[Tom2]]></dc:creator><pubDate>Mon, 08 Mar 2010 11:22:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Mon, 08 Mar 2010 12:06:03 GMT]]></title><description><![CDATA[<p>Tom2 schrieb:</p>
<blockquote>
<p>Aber hätte man nicht einfach die Klasse Daten, in der die Werte gespeichert sind mit Templates ausstatten können?</p>
</blockquote>
<p>Hätte man, aber dazu hätte man dann immernoch das Klassentemplate Daten überall mit rumschleppen müssen, jedesmal ein neues Daten&lt;X&gt; erstellen müssen bevor man es in die Liste hängt usw. Dann lieber gleich die ganze Liste zum Template machen und die Elemente direkt da reinhängen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865842</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 08 Mar 2010 12:06:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Mon, 08 Mar 2010 15:11:48 GMT]]></title><description><![CDATA[<p>Dazu noch eine Frage zu den Templates. Dort steht so ungefähr folgender Code:</p>
<pre><code class="language-cpp">template &lt;class T&gt; 
void input( Liste&lt;T&gt;&amp; data ) { 
     input_func( data ); 
} 
...
void input_func( Liste&lt;Temperatur&gt;&amp; tempList ) { 
...
void input_func( Liste&lt;Daten&gt;&amp; datenList ) { 
...
</code></pre>
<p>Ist die Funktion input nicht total sinnlos? Man könnte doch gleich input_func in func umbenennen. Das hätte doch durch die Überladung genau den gleichen Effekt. Zumal die Überladung in func ohnehin genutzt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1865957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1865957</guid><dc:creator><![CDATA[Tom2]]></dc:creator><pubDate>Mon, 08 Mar 2010 15:11:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 09 Mar 2010 09:57:41 GMT]]></title><description><![CDATA[<p>Kann mir da keiner weiterhelfen, und sagen, ob ich richtig lag?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866408</guid><dc:creator><![CDATA[Tom2]]></dc:creator><pubDate>Tue, 09 Mar 2010 09:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 09 Mar 2010 10:38:44 GMT]]></title><description><![CDATA[<p>Wenn in deinen weggeschnittenen Stellen nicht zusätzliche Informationen versteckt waren: ja.</p>
<p>Ansonsten:<br />
Geht es in dem Kapitel um Refactoring und wie man trotz neuer Methodennamen auch noch die alte API supported?<br />
Handelt es sich da um freie Funktionen oder Methoden einer Klasse?<br />
Ist da irgendwas abgeleitet und in der Basisklasse war input_func virtual?<br />
Oder IST das eine Basisklasse und in der Klassendefinition ist input_func als virtual deklariert?<br />
Welches Buch ist das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866425</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866425</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 09 Mar 2010 10:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 09 Mar 2010 18:24:14 GMT]]></title><description><![CDATA[<p>Hier komplett:</p>
<pre><code class="language-cpp">// main.cpp 
#include &quot;daten.h&quot; 
#include &quot;temperatur.h&quot; 
#include &quot;lliste.h&quot; 
void input_func( Liste&lt;Temperatur&gt;&amp; tempList ); 
void input_func( Liste&lt;Daten&gt;&amp; datenList ); 
template &lt;class T&gt; void input( Liste&lt;T&gt;&amp; data ); 
int main( void ) { 
   // Instantiierung 
   Liste&lt;Temperatur&gt; elemente1; 
   Liste&lt;Daten&gt; elemente2; 
   input(elemente1);   // Liste&lt;Temperatur&gt; 
   input(elemente2);   // Liste&lt;Daten&gt; 
   elemente1.alles_anzeigen(); 
   elemente2.alles_anzeigen(); 
   return 0; 
} 
// Funktion zum Einlesen der Eigenschaften für Temperatur 
void input_func( Liste&lt;Temperatur&gt;&amp; tempList ) { 
   Temperatur* daten; 
   int grad; 
   char monat[20]; 
   for(;;) { 
      cout &lt;&lt; &quot;Monat eingeben : &quot;; 
      if( (!(cin &gt;&gt; monat)) ) 
         strcpy( monat, &quot;keine Angabe&quot;);
      cout &lt;&lt; &quot;Temperatur eingeben (99=Ende) : &quot;; 
      if( (!(cin &gt;&gt; grad)) || grad == 99 ) 
         break; // Ende 
      daten = new Temperatur(grad, monat); 
      tempList.einfuegen(daten); 
   } 
} 
// Funktion zum Einlesen der Eigenschaften für Daten 
void input_func( Liste&lt;Daten&gt;&amp; datenList ) { 
   Daten* daten; 
   int iwert; 
   for(;;) { 
      cout &lt;&lt; &quot;Wert eingeben (0=Ende) : &quot;; 
      if( (!(cin &gt;&gt; iwert)) || iwert == 0 ) 
         break; // Ende 
      daten = new Daten(iwert); 
      datenList.einfuegen(daten); 
   } 
} 
// Funktions-Template 
template &lt;class T&gt; 
void input( Liste&lt;T&gt;&amp; data ) { 
     input_func( data ); 
}
</code></pre>
<p>Buch: C++ von A bis Z</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1866657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1866657</guid><dc:creator><![CDATA[Tom2]]></dc:creator><pubDate>Tue, 09 Mar 2010 18:24:14 GMT</pubDate></item></channel></rss>