<?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[Frage zu Listen]]></title><description><![CDATA[<p>Habe folgende Funktion zum einfügen eines Elements:</p>
<pre><code class="language-cpp">void insertAfter(ListeDopVerkZahlen_t *list, int val)
  {
   KnotenDopVerkZahlen_t *neuerKnoten=(KnotenDopVerkZahlen_t *)malloc(sizeof(*neuerKnoten));

   neuerKnoten-&gt;dat=val;

   if (list-&gt;curr!=NULL)
     {
      neuerKnoten-&gt;prev=list-&gt;curr;
      neuerKnoten-&gt;next=list-&gt;curr-&gt;next;

      if (list-&gt;curr-&gt;next!=NULL) list-&gt;curr-&gt;next-&gt;prev=neuerKnoten;
      if (list-&gt;tail==list-&gt;curr) list-&gt;tail=neuerKnoten;
     }
   else
     {
      neuerKnoten-&gt;prev=NULL;
      neuerKnoten-&gt;next=NULL;

      list-&gt;tail=list-&gt;curr=neuerKnoten;
       if (list-&gt;head==NULL)list-&gt;head=neuerKnoten; //Warum diese if Prüfung ??
     }
   list-&gt;curr=neuerKnoten;
   if (list-&gt;curr-&gt;prev!=NULL) list-&gt;curr-&gt;prev-&gt;next=neuerKnoten;
  }
</code></pre>
<p>Es geht also darum ein Element nach einem aktuellen einzufügen.<br />
Der else Zweig wird durchlaufen wenn der aktuelle Zeiger auf dem Pseudoknoten<br />
steht. d.h also die Liste ist noch leer. Dort wo ich den Kommentar hingeschrieben habe , frage ich mich warum man den Zeiger, der auf das 1.Listenelement zeigen soll, noch auf Null prüfen muss, wo doch die liste<br />
eh leer ist, er also auf Null zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260097/frage-zu-listen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 12:55:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260097.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 31 Jan 2010 22:27:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Listen on Sun, 31 Jan 2010 22:27:40 GMT]]></title><description><![CDATA[<p>Habe folgende Funktion zum einfügen eines Elements:</p>
<pre><code class="language-cpp">void insertAfter(ListeDopVerkZahlen_t *list, int val)
  {
   KnotenDopVerkZahlen_t *neuerKnoten=(KnotenDopVerkZahlen_t *)malloc(sizeof(*neuerKnoten));

   neuerKnoten-&gt;dat=val;

   if (list-&gt;curr!=NULL)
     {
      neuerKnoten-&gt;prev=list-&gt;curr;
      neuerKnoten-&gt;next=list-&gt;curr-&gt;next;

      if (list-&gt;curr-&gt;next!=NULL) list-&gt;curr-&gt;next-&gt;prev=neuerKnoten;
      if (list-&gt;tail==list-&gt;curr) list-&gt;tail=neuerKnoten;
     }
   else
     {
      neuerKnoten-&gt;prev=NULL;
      neuerKnoten-&gt;next=NULL;

      list-&gt;tail=list-&gt;curr=neuerKnoten;
       if (list-&gt;head==NULL)list-&gt;head=neuerKnoten; //Warum diese if Prüfung ??
     }
   list-&gt;curr=neuerKnoten;
   if (list-&gt;curr-&gt;prev!=NULL) list-&gt;curr-&gt;prev-&gt;next=neuerKnoten;
  }
</code></pre>
<p>Es geht also darum ein Element nach einem aktuellen einzufügen.<br />
Der else Zweig wird durchlaufen wenn der aktuelle Zeiger auf dem Pseudoknoten<br />
steht. d.h also die Liste ist noch leer. Dort wo ich den Kommentar hingeschrieben habe , frage ich mich warum man den Zeiger, der auf das 1.Listenelement zeigen soll, noch auf Null prüfen muss, wo doch die liste<br />
eh leer ist, er also auf Null zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848309</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Sun, 31 Jan 2010 22:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Sun, 31 Jan 2010 22:59:01 GMT]]></title><description><![CDATA[<p>Nimm doch C++ (new) statt C (malloc) <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>
<p>Was soll denn -&gt;curr und -&gt;tail sein? -&gt;dat, -&gt;prev, -&gt;next ist ja klar.</p>
<p>Pseudoknoten? Wozu das denn? Braucht man nicht!</p>
<pre><code class="language-cpp">struct Knoten
{
  Knoten* prev;
  Knoten* next;
  int dat;

  explicit Knoten(int z) : prev(0),next(0),dat(z) {}
};

/*
 *                  +------+    +------+
 * liste.start ---&gt; |     ====&gt; |     -+--&gt;   nil
 *         nil   &lt;--+-     | &lt;--+-     | &lt;--- liste.ende
 *                  +------+    +------+
 *                     A            A
 *                     |  +[neu]-+  |
 *                     |  |     -+--+
 *                     +--+-     |
 *                        +------+
 *
 * zeigerVLNR = von links nach rechts (===&gt;)
 */
void pack_dazwischen(Knoten*&amp; zeigerVLNR, int zahl)
{
  Knoten* pn = new Knoten(zahl);
  pn-&gt;next = zeiger;
  if (zeiger) pn-&gt;prev = zeiger-&gt;prev;
  if (pn-&gt;next) pn-&gt;next = pn;
  if (pn-&gt;prev) pn-&gt;prev = pn;
  zeigerVLNR = pn;
}

class Liste
{
  Knoten *start, *ende;
public:
  Liste() : start(0), ende(0) {}
  ...
};
</code></pre>
<p>(ungetestet)</p>
<p>Beachte: zeigerVLNR ist eine Referenz -- entweder auf einen next-Zeiger eines Knotens oder auf den start-Zeiger der Liste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848316</guid><dc:creator><![CDATA[kruemelkacker]]></dc:creator><pubDate>Sun, 31 Jan 2010 22:59:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Sun, 31 Jan 2010 23:03:42 GMT]]></title><description><![CDATA[<p>kruemelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void pack_dazwischen(Knoten*&amp; zeigerVLNR, int zahl)
{
  Knoten* pn = new Knoten(zahl);
  pn-&gt;next = zeiger;
  if (zeiger) pn-&gt;prev = zeiger-&gt;prev;
  if (pn-&gt;next) pn-&gt;next = pn;
  if (pn-&gt;prev) pn-&gt;prev = pn;
  zeigerVLNR = pn;
}
</code></pre>
</blockquote>
<p>Mist! Das muss heißen:</p>
<pre><code class="language-cpp">if (pn-&gt;next) pn-&gt;next-&gt;prev = pn;
  if (pn-&gt;prev) pn-&gt;prev-&gt;next = pn;
</code></pre>
<p>Aber da ist sicherlich noch etwas falsch bei diesen vielen Zeigern. <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="😉"
    /><br />
Das Prinzip sollte aber klar sein. So kommt man auch ohne Pseudoknoten aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848318</guid><dc:creator><![CDATA[kruemelkacker]]></dc:creator><pubDate>Sun, 31 Jan 2010 23:03:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Sun, 31 Jan 2010 23:08:43 GMT]]></title><description><![CDATA[<p>pseudoknoten sind knoten ohne daten.</p>
<p>Ist schon hilfreich. Man hat einen head der auf den Anfang der Liste zeigt<br />
und einen tail zeiger der eben auf das Ende zeigt. So kann man schnell<br />
zum anfang bzw Ende navigieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848320</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Sun, 31 Jan 2010 23:08:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Mon, 01 Feb 2010 09:02:59 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>Ist schon hilfreich. Man hat einen head der auf den Anfang der Liste zeigt<br />
und einen tail zeiger der eben auf das Ende zeigt. So kann man schnell<br />
zum anfang bzw Ende navigieren.</p>
</blockquote>
<p>Dazu braucht man eigentlich trotzdem keinen Pseudoknoten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848380</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 01 Feb 2010 09:02:59 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Mon, 01 Feb 2010 10:21:10 GMT]]></title><description><![CDATA[<p>Diese Pseudoknoten (habe ich unter dem Namen Sentinels kennengelernt) erfüllen noch einen weiteren Zweck: Sie eliminieren die Sonderfälle für das Einfügen/Löschen am Anfang/Ende der Liste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1848419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848419</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 01 Feb 2010 10:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Listen on Mon, 01 Feb 2010 12:53:42 GMT]]></title><description><![CDATA[<p>DocShoe schrieb:</p>
<blockquote>
<p>Diese Pseudoknoten (habe ich unter dem Namen Sentinels kennengelernt) erfüllen noch einen weiteren Zweck: Sie eliminieren die Sonderfälle für das Einfügen/Löschen am Anfang/Ende der Liste.</p>
</blockquote>
<p>Mit Referenzen auf Zeigern, wie sie kruemelkacker benutzt hat, lässt sich die Sonderbehandlung reduzieren. Ich finde, die Sonderbehandlung hält sich da in Grenzen und lässt sich bestimmt noch ein wenig vereinfachen. Ich sehe nicht, wie &quot;Pseudoknoten&quot; einen richtigen Vorteil bieten. Im Gegenteil, wo und wie soll man sie denn anlegen -- so ohne Inhalt und dass man auch noch drauf Zeigen kann? Wo spare ich denn da Sonderbehandlung? Zeig mal ... <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/1848499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1848499</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 01 Feb 2010 12:53:42 GMT</pubDate></item></channel></rss>