<?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[Implementierung für Liste [für Anfänger]]]></title><description><![CDATA[<p>Ich würd mal gern wissen was ihr von folgenden haltet. Das ganze soll Leuten gezeigt werden die keine Ahnung von Operatorenüberladung, irgendwelchen dynamischen Datenstrukturen (also auch nichts von der STL) oder Templates haben.<br />
Die Iteratoren hab ich einfach mal weggelassen, imo würde das sonst zu komplex werden...</p>
<p>Naja hier der Code, ist nur bissl auskommentiert, hab ich grade hingekritzelt. Natürlich wird die Funktionsweise anhand von Schaubildern davor erklärt. Damit mein ich also dass die Daten sozusagen in einem Kreis verbunden sind, und dass man deshalb nur den Pointer zum Ende braucht. Und etwa warum der End-Pointer über die Liste hinaus zeigt.</p>
<p>Naja hier der Code:</p>
<pre><code class="language-cpp">struct Node 
{
    // pointer to next node (or first element if head)
	Node* next;
	// pointer to previous node (or last element if head)
	Node* prev;
	// stored value (unused if head)
	int value;
};

class List
{
	private:

		Node* _head;
		unsigned _size;

	public:

		List()
		{
			// generating list's end
			_head = new Node;
			_head-&gt;next = _head-&gt;prev = _head;
			_size = 0;
		}

		// List(List const&amp;) { ... }
		// fehlt absichtlich... Ich will nicht noch die Copy-C'toren erklären

		~List()
		{
			// free all elements
			clear();
			// free head
			delete _head;
		}

		void insert(Node* pos, int value)
		{
			// allocating memory
			Node* newNode = new Node;
			newNode-&gt;value = value;
			// revalidating pointers
			newNode-&gt;next = pos;
			newNode-&gt;prev = pos-&gt;prev;
			pos-&gt;prev-&gt;next = newNode;
			pos-&gt;prev = newNode;
			// increasing size
			++_size;
		}

		void push_front(int value) // pop_front/back wär auch noch drin
		{
			insert(begin(), value);
		}

		void push_back(int value)
		{
			insert(end(), value);
		}

		Node* erase(Node* pos)
		{
			// store next element
			Node* returning = pos-&gt;next;
			// revalidating pointers
			pos-&gt;next-&gt;prev = pos-&gt;prev;
			pos-&gt;prev-&gt;next = pos-&gt;next;
			// free node
			delete pos;
			// decreasing size
			--_size;
			// return the next element after the erased
			return returning;
		}

		void clear()
		{
			Node* iterator = begin();
			while( iterator != end() ) {
				iterator = erase(iterator);
			}
		};

		Node* begin() // hier eventuell noch const überladung
		{
			return _head-&gt;next;
		}

		Node* end() 
		{
			return _head;
		}

		bool empty() const
		{
			return _size == 0;
		}

		unsigned size() const
		{
			return _size;
		}

};
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/126376/implementierung-für-liste-für-anfänger</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 16:46:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/126376.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 14 Nov 2005 18:02:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 18:25:11 GMT]]></title><description><![CDATA[<p>Ich würd mal gern wissen was ihr von folgenden haltet. Das ganze soll Leuten gezeigt werden die keine Ahnung von Operatorenüberladung, irgendwelchen dynamischen Datenstrukturen (also auch nichts von der STL) oder Templates haben.<br />
Die Iteratoren hab ich einfach mal weggelassen, imo würde das sonst zu komplex werden...</p>
<p>Naja hier der Code, ist nur bissl auskommentiert, hab ich grade hingekritzelt. Natürlich wird die Funktionsweise anhand von Schaubildern davor erklärt. Damit mein ich also dass die Daten sozusagen in einem Kreis verbunden sind, und dass man deshalb nur den Pointer zum Ende braucht. Und etwa warum der End-Pointer über die Liste hinaus zeigt.</p>
<p>Naja hier der Code:</p>
<pre><code class="language-cpp">struct Node 
{
    // pointer to next node (or first element if head)
	Node* next;
	// pointer to previous node (or last element if head)
	Node* prev;
	// stored value (unused if head)
	int value;
};

class List
{
	private:

		Node* _head;
		unsigned _size;

	public:

		List()
		{
			// generating list's end
			_head = new Node;
			_head-&gt;next = _head-&gt;prev = _head;
			_size = 0;
		}

		// List(List const&amp;) { ... }
		// fehlt absichtlich... Ich will nicht noch die Copy-C'toren erklären

		~List()
		{
			// free all elements
			clear();
			// free head
			delete _head;
		}

		void insert(Node* pos, int value)
		{
			// allocating memory
			Node* newNode = new Node;
			newNode-&gt;value = value;
			// revalidating pointers
			newNode-&gt;next = pos;
			newNode-&gt;prev = pos-&gt;prev;
			pos-&gt;prev-&gt;next = newNode;
			pos-&gt;prev = newNode;
			// increasing size
			++_size;
		}

		void push_front(int value) // pop_front/back wär auch noch drin
		{
			insert(begin(), value);
		}

		void push_back(int value)
		{
			insert(end(), value);
		}

		Node* erase(Node* pos)
		{
			// store next element
			Node* returning = pos-&gt;next;
			// revalidating pointers
			pos-&gt;next-&gt;prev = pos-&gt;prev;
			pos-&gt;prev-&gt;next = pos-&gt;next;
			// free node
			delete pos;
			// decreasing size
			--_size;
			// return the next element after the erased
			return returning;
		}

		void clear()
		{
			Node* iterator = begin();
			while( iterator != end() ) {
				iterator = erase(iterator);
			}
		};

		Node* begin() // hier eventuell noch const überladung
		{
			return _head-&gt;next;
		}

		Node* end() 
		{
			return _head;
		}

		bool empty() const
		{
			return _size == 0;
		}

		unsigned size() const
		{
			return _size;
		}

};
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917620</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 14 Nov 2005 18:25:11 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 18:04:32 GMT]]></title><description><![CDATA[<p>Hättest nicht zufällig Lust nen Artikel daraus zu machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917624</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 14 Nov 2005 18:04:32 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 18:08:15 GMT]]></title><description><![CDATA[<p>Hallo,<br />
spontan:<br />
* die Kommentare sind größtenteils grausam.<br />
* die Liste tut wie ein Value-Type hat aber eine kaputte Kopiersemantik. Also entweder kopieren verbieten oder richtig implementieren.<br />
* ein paar asserts wären imo angebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917628</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 14 Nov 2005 18:08:15 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 18:14:33 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Hättest nicht zufällig Lust nen Artikel daraus zu machen?</p>
</blockquote>
<p>Muss zuerst meine Präsentation fertig machen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Aber villeicht könnt ich ja mal ne Art Tutorial zur Erstellung von so was machen wo dann auch noch ins Themengebiet der Iteratoren und Templates eingreift. Btw: Artikel für was?</p>
<p>Ich wollte einfach mal wissen ob die Implementierung und die Funktionsweise so ok ist, oder ob ich das was wichtiges vergessen / falsch habe, weil ich das wie gesagt mit einer Präsentation aufbaue. Irgendwelche Standardalgorithmen sind ja noch gar nicht drin.</p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>* die Kommentare sind größtenteils grausam.</p>
</blockquote>
<p>Dacht ich mir auch, wird aber so verlangt vom Lehrer... (soll heißen: eigentlich muss bei dem vor jede Zeile so ein dummes Kommentar) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>* die Liste tut wie ein Value-Type hat aber eine kaputte Kopiersemantik. Also entweder kopieren verbieten oder richtig implementieren.</p>
</blockquote>
<p>Weiß ich auch, nur keiner weiß was ein Copy-C'tor ist, deshalb hab ich ihn nicht drin. Villeicht ergänz ich es noch am Ende</p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>* ein paar asserts wären imo angebracht.</p>
</blockquote>
<p>Müsst ich auch noch erklären, meine Vorstellung ist zeitlich beschränkt...</p>
<p>Tja man könnte fast schon sagen bei uns hat keiner Ahnung...</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917634</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 14 Nov 2005 18:14:33 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 18:15:25 GMT]]></title><description><![CDATA[<p>Artikel für's C++ Magazin, hatte das auch schon im Lineup, bin aber gerade andersweitig beschäftigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917643</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Mon, 14 Nov 2005 18:15:25 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 19:15:33 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Artikel für's C++ Magazin, hatte das auch schon im Lineup, bin aber gerade andersweitig beschäftigt.</p>
</blockquote>
<p>Da soll das dann aber sicher eine andere Zielgruppe sein, oder? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917726</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 14 Nov 2005 19:15:33 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 19:39:58 GMT]]></title><description><![CDATA[<p>FireFlow schrieb:</p>
<blockquote>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>* die Kommentare sind größtenteils grausam.</p>
</blockquote>
<p>Dacht ich mir auch, wird aber so verlangt vom Lehrer... (soll heißen: eigentlich muss bei dem vor jede Zeile so ein dummes Kommentar)</p>
</blockquote>
<p>Kauf ich dir nicht ab. Kein Lehrer der Welt wird schlechte Kommentare guten vorziehen. Wenn du also schon soviel (mehr oder weniger jede Zeile) Kommentieren musst, dann beschreib doch lieber die Idee hinter der Zeile statt die Wirkung des Codes. Letztere steht nämlich bereits genau im C++ Standard beschrieben. Und auch das Englisch erscheint mir etwas holprig zu sein.</p>
<p>Sowas:</p>
<blockquote>
<p>// generating list's end<br />
_head = new Node;</p>
</blockquote>
<p>ist doch eher verwirrend. Laut Kommentar wird das Ende der Liste erzeugt. Der Code weißt _head einen neuen Knoten zu. Mit Kopf assoziere ich Vorne/Anfang, nicht Ende. Mir ist zwar klar, was du tust (und warum). Aber das nur, weil ich auch schon die ein oder andere Liste implementiert habe und nicht weil ich deine Kommentare bzw. Implementation gelesen habe.</p>
<p>Warum hat deine leere Liste (_size ist ja 0) denn einen Knoten? Und was ist die Bedeutung des Knotens? Oder anders: warum verwendest du ein Sentinel-Knoten nicht z.B. einfach Nullpointer?<br />
Der Standardgrund dafür ist doch der, dass dadurch die Implementation von Methoden wie insert einfacher wird, da keine Sonderfälle berücksichtigt werden müssen.</p>
<p>Das könnte man z.B. kurz und knapp als Kommentar hinschreiben. Dabei würde ich dann noch gleich den Namen head ändern. Schließlich ist head immer der Nachfolger des letzten Knotens der Liste und der Vorgänger des ersten. Damit ist er weder eindeutig Head noch eindeutig Tail und wird deshalb wohl gerne Nil oder ähnlich genannt.</p>
<p>Mal ein kläglicher Versuch:</p>
<pre><code class="language-cpp">// The special nil-node acts as a sentinel node. It is the successor
// of a list's tail node and the predecessor of a list's first node.
// Using such a nil-node makes the implementation easier
// because empty lists don't need special treatment.
_nil = new Node;
_nil-&gt;next = _nil-&gt;prev = _nil;
_size = 0;
</code></pre>
<p>Oder was bringt einem ein Kommentar à la: // revalidating pointers<br />
in insert?<br />
Wäre es hier z.B. nicht interessanter zu wissen, dass wir den neuen Knoten<br />
vor dem Knoten pos einfügen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917752</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 14 Nov 2005 19:39:58 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 20:16:21 GMT]]></title><description><![CDATA[<p>&lt;offtopic&gt;</p>
<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Kein Lehrer der Welt wird schlechte Kommentare guten vorziehen.</p>
</blockquote>
<p>Achja... Dann sag mir bitte dass kein Lehrer der Welt behauptet...<br />
- dass virtuelle Methoden zur Laufzeit kompilliert werden.<br />
- dass virtuelle Methoden erst zur Laufzeit instanziert werden (die v-table hat er nie erwähnt).<br />
- dass eine Methode keine Übergabeparameter haben darf, die es schon mit selben Bezeichner in der Klasse gibt.<br />
- der nicht weiß, dass MyClass t(); kein Objekt instanziert, sondern eine Funktion deklariert.<br />
- ...</p>
<p>Also ich kennen leider zumindest einen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /> Ist immer ansichstsache was der Lehrer als gut erachtet. Ist ja jetzt auch egal, hab den Code nur kurz fürs Prinzip erstellt <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 />
&lt;/offtopic&gt;</p>
<p>Wie gesagt gibt es eine Präsentation, in der erwähne ich dann schon was der Knoten da soll. Ich denke aber der ist nicht nur wegen dem insert(), das macht fast alle Methoden einfacher. Das <em>head</em> hab ich aus der Implementierung die im VC++05 verwendet wird, hab da irgendwie nicht weiter nachgedacht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>Btw: Ich weiß dass meine Kommentare nichts bringen... Normalerweise kommentier ich in Methoden oder Funktionen nie, sondern nur die Funktionsweise davon. Mehr als 10 (Code-)Zeilen kommen da meistens nicht rein, und die lassen sich schnell ohne Kommentare verstehen, wenn man weiß was das ganze zusammen anstellt.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917794</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 14 Nov 2005 20:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 20:21:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Ist immer ansichstsache was der Lehrer als gut erachtet</p>
</blockquote>
<p>Das ist sicher richtig. Auf der anderen Seite ist es imo wichtiger sich darauf zu konzentriert was man selbst für gut erachtet. Schließlich steht am Ende ja der eigene Name auf dem Papier/Vortrag/Tutorial und nicht der des Lehrers.<br />
Und die meisten Lehrer/Profs sind doch recht offen wenn es darum geht neue Sichtweisen zu aktzeptieren auch wenn sie von der Lehrermeinung abweichen. Zumindest solange man seine Argumente sachlich fundiert und nicht etwa neunmal klug oder arrogant vorträgt.</p>
<p>Aber bevor das jetzt ausartet: Meine Beiträge waren nur Antworten auf dein:</p>
<blockquote>
<p>Ich würd mal gern wissen was ihr von folgenden haltet</p>
</blockquote>
<p>und können selbstverständlich ignoriert werden (oder gar totaler quatsch sein).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917806</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 14 Nov 2005 20:21:33 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 20:34:12 GMT]]></title><description><![CDATA[<p>erase auf empty gibt dir glaub ich max unsigned.<br />
mit erase(0) macht erase Boom.<br />
List L;<br />
L.erase(begin());<br />
sollte auch nicht das erwartete liefern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917825</guid><dc:creator><![CDATA[b7f7]]></dc:creator><pubDate>Mon, 14 Nov 2005 20:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Implementierung für Liste [für Anfänger] on Mon, 14 Nov 2005 20:46:18 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<p>Aber bevor das jetzt ausartet: Meine Beiträge waren nur Antworten auf dein:</p>
<blockquote>
<p>Ich würd mal gern wissen was ihr von folgenden haltet</p>
</blockquote>
<p>und können selbstverständlich ignoriert werden (oder gar totaler quatsch sein).</p>
</blockquote>
<p>Wie erwähnt das war nur offtopic. Das mit den Kommentaren war natürlich ein wichtiger Kritikpunkt.</p>
<blockquote>
<p>erase auf empty gibt dir glaub ich max unsigned.<br />
mit erase(0) macht erase Boom.<br />
List L;<br />
L.erase(begin());<br />
sollte auch nicht das erwartete liefern</p>
</blockquote>
<p>Stimmt, das macht alles boom. Man könnte auch einen Pointer auf einen Knoten einder anderen Liste übergeben, dann sieht es zwar noch nach außen gut aus, hat aber innen Boom gemacht.<br />
Das oben genannte macht aber auch bei der STL Boom (soll es ja schließlich, nur die Frage ist wie) - afaik in Form von Asserts.</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/917837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/917837</guid><dc:creator><![CDATA[FireFlow]]></dc:creator><pubDate>Mon, 14 Nov 2005 20:46:18 GMT</pubDate></item></channel></rss>