<?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!</p>
<p>Ich habe eine Klasse, mit einer Verketteten Liste, ihr Name ist explosion, der Pointer auf das nächste Element ist jeweils next. Um diese Explosionen zu verwalten, besitze ich eine Verwaltungsklasse explosionen, in welcher E jeweils der Pointer auf die erste Explosion ist, von welchem ich dann die restlichen suche. In dieser Klasse ist eine Funktion für das Aufrufen der jeweiligen Anzeigeroutinen verantwortlich.</p>
<p>Diese Funktion sieht wie folgt aus:</p>
<pre><code class="language-cpp">void explosionen::anz()
{
  if (pos&gt;0)
  {
    explosion *anzeiger, *temp;
    temp = E;anzeiger=E;
    while (anzeiger!=0)
    {
      if (temp-&gt;gibstatus()&lt;20)//Wenn noch nciht alle Frames angezeigt sind..
      {
        R-&gt;anzrs(G[temp-&gt;gibstatus()].graphikid, temp-&gt;gibx(), temp-&gt;giby());
        //Anzeigeklasse aufrufen
        temp-&gt;anz();//setze Status hoch und neue Koordinaten
      }
      else
      {

        if (pos&gt;1)
        {
          //Element löschen, da ich mich von Anfang durchhangel -&gt; erstpointer kann umgesetzt werden
          explosion *neuE;//Element nach E, das auf E geschoben werden soll
          neuE = E-&gt;next;//Element nach E wird zugewiesen
          delete E;//E wird gelöscht
          E = neuE;//Element nach E wird zugewiesen
          pos--;//Position wird 1 weniger, da Anzahl um 1 gesunken
        }
        else
        {
          //falls nur eine Exlosion läuft (-&gt;nur E gesetzt ist)
          temp-&gt;next=0;anzeiger=0; // damit aus whileschleife rausgesprungen wird -&gt; tut er net
          delete E;//löschen der einen Explosion
          pos=0;//Speichern, dass keine Explosion vorhanden ist
          return;//Anzeige geht seltsamerweise trotzdem weiter -&gt; muss aus Funktion rausspringen
        }
      }
      anzeiger = temp-&gt;next; 
      temp = anzeiger;
    }
  }
}
</code></pre>
<p>Leider funktionieren dabei 2 Sachen nicht:<br />
1. Das löschen bei pos&gt;1:(d.h. noch andere Explosionen vorhanden als E)<br />
Ich habe mir gedacht, da eine Explosion immer 20 Frames hat, die immer gleich schnell ablaufen, brauche ich nichts groß machen, um etwas zu löschen, es reicht bereits, das erste Element, also E, zu löschen, und einfach eines der anderen Elemente auf E zu setzen. Leider funktioniert das nicht, und bei temp-&gt;gibstatus() stürzt er ab, da temp irgendwie nicht gesetzt ist..<br />
Könnt ihr mir bitte sagen, wieso das nicht funktioniert, und wieso ev.<br />
2. Bei else:<br />
Hier hab ich mir gedacht, reicht es schon, einfach das Zeug zu setzen, um aus der Schleife rauszuspringen, pos auf 0 zu setzen(da keine Explosion mehr vorhanden ist) und die Explosion zu löschen. Seltsamerweise bleibt er hier irgenwdie in der Schleife, und kommt wieder zum temp-&gt;gibstatus(). Kann sich einer von euch erklären, wieso das passiert, und wieso er nicht einfach aus dem while rausspringt?</p>
<p>Ich hoffe, das ist jetzt im richtigen Unterforum, aber da ich keine Klasse, keine Windows oder Linuxspezifischen Sachen aufrufe, nehme ich an, dass das hier rein gehört..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/178313/verkettete-listen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 20:21:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/178313.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Apr 2007 10:30:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verkettete Listen on Tue, 10 Apr 2007 10:30:40 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Klasse, mit einer Verketteten Liste, ihr Name ist explosion, der Pointer auf das nächste Element ist jeweils next. Um diese Explosionen zu verwalten, besitze ich eine Verwaltungsklasse explosionen, in welcher E jeweils der Pointer auf die erste Explosion ist, von welchem ich dann die restlichen suche. In dieser Klasse ist eine Funktion für das Aufrufen der jeweiligen Anzeigeroutinen verantwortlich.</p>
<p>Diese Funktion sieht wie folgt aus:</p>
<pre><code class="language-cpp">void explosionen::anz()
{
  if (pos&gt;0)
  {
    explosion *anzeiger, *temp;
    temp = E;anzeiger=E;
    while (anzeiger!=0)
    {
      if (temp-&gt;gibstatus()&lt;20)//Wenn noch nciht alle Frames angezeigt sind..
      {
        R-&gt;anzrs(G[temp-&gt;gibstatus()].graphikid, temp-&gt;gibx(), temp-&gt;giby());
        //Anzeigeklasse aufrufen
        temp-&gt;anz();//setze Status hoch und neue Koordinaten
      }
      else
      {

        if (pos&gt;1)
        {
          //Element löschen, da ich mich von Anfang durchhangel -&gt; erstpointer kann umgesetzt werden
          explosion *neuE;//Element nach E, das auf E geschoben werden soll
          neuE = E-&gt;next;//Element nach E wird zugewiesen
          delete E;//E wird gelöscht
          E = neuE;//Element nach E wird zugewiesen
          pos--;//Position wird 1 weniger, da Anzahl um 1 gesunken
        }
        else
        {
          //falls nur eine Exlosion läuft (-&gt;nur E gesetzt ist)
          temp-&gt;next=0;anzeiger=0; // damit aus whileschleife rausgesprungen wird -&gt; tut er net
          delete E;//löschen der einen Explosion
          pos=0;//Speichern, dass keine Explosion vorhanden ist
          return;//Anzeige geht seltsamerweise trotzdem weiter -&gt; muss aus Funktion rausspringen
        }
      }
      anzeiger = temp-&gt;next; 
      temp = anzeiger;
    }
  }
}
</code></pre>
<p>Leider funktionieren dabei 2 Sachen nicht:<br />
1. Das löschen bei pos&gt;1:(d.h. noch andere Explosionen vorhanden als E)<br />
Ich habe mir gedacht, da eine Explosion immer 20 Frames hat, die immer gleich schnell ablaufen, brauche ich nichts groß machen, um etwas zu löschen, es reicht bereits, das erste Element, also E, zu löschen, und einfach eines der anderen Elemente auf E zu setzen. Leider funktioniert das nicht, und bei temp-&gt;gibstatus() stürzt er ab, da temp irgendwie nicht gesetzt ist..<br />
Könnt ihr mir bitte sagen, wieso das nicht funktioniert, und wieso ev.<br />
2. Bei else:<br />
Hier hab ich mir gedacht, reicht es schon, einfach das Zeug zu setzen, um aus der Schleife rauszuspringen, pos auf 0 zu setzen(da keine Explosion mehr vorhanden ist) und die Explosion zu löschen. Seltsamerweise bleibt er hier irgenwdie in der Schleife, und kommt wieder zum temp-&gt;gibstatus(). Kann sich einer von euch erklären, wieso das passiert, und wieso er nicht einfach aus dem while rausspringt?</p>
<p>Ich hoffe, das ist jetzt im richtigen Unterforum, aber da ich keine Klasse, keine Windows oder Linuxspezifischen Sachen aufrufe, nehme ich an, dass das hier rein gehört..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262811</guid><dc:creator><![CDATA[DaGeRe]]></dc:creator><pubDate>Tue, 10 Apr 2007 10:30:40 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 10 Apr 2007 12:19:02 GMT]]></title><description><![CDATA[<p>Aus dem Code, den Du gepostet hast, ist nicht klar ersichtlich, was er tun soll. Ich unterstelle mal folgendes. Eine Menge von Explosionen soll angezeigt werden. Mit oder nach jeder Anzeige wird der Status (gibStatus) (um 1?) erhöht. Erreicht der Wert des Status den Wert 20 oder mehr, so soll dieses (und nicht das erste!) Element aus der Liste gelöscht werden.</p>
<p>So wie Du es gemacht hast, sägst Du den Ast, auf dem Du sitzt ab, wenn Du Pointer auf ein ein Element setzt, was nachher gelöscht wird. Außerdem versucht Du immer das erste zu löschen; es kann natürlich sein, dass das erste auch immer die Explosion ist, die als erste 'fertig' ist, aber das wäre eine implizite Annahme.</p>
<p>Also gut ich würde Dir folgenden Code vorschlagen:</p>
<pre><code class="language-cpp">void explosionen::anz()
{
    explosion* prev = 0; // prev zeigt auf den Vorgänger, falls vorhanden
    for( explosion* anzeiger = E; anzeiger;  )
    {
        if( anzeiger-&gt;gibstatus() &lt; 20 )
        {
            R-&gt;anzrs(G[anzeiger-&gt;gibstatus()].graphikid, anzeiger-&gt;gibx(), anzeiger-&gt;giby());
            anzeiger-&gt;anz();

            prev = anzeiger;
            anzeiger = anzeiger-&gt;next;  // Übergang zum nächsten Element
        }
        else
        {
            // prev bleibt stehen!
            anzeiger = anzeiger-&gt;next;  // Übergang zum nächsten Element

            // Element *prev-&gt;next (vorher *anzeiger) löschen
            if( prev )
            {
                delete prev-&gt;next;
                prev-&gt;next = anzeiger;
            }
            else
            {
                delete E;
                E = anzeiger;
            }
            --pos;
        }
    }
}
</code></pre>
<p>Es wird auch jeweils der Vorgänger 'next' immer aktualisiert, wenn ein Element aus der Liste entfernt wird.</p>
<p>Ansonsten benutzte besser std::list&lt;&gt;, dann hast Du diese Probleme erst gar nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1262932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1262932</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 10 Apr 2007 12:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen on Tue, 10 Apr 2007 13:47:01 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Danke für deine Antwort.<br />
Ich habe mal meine Funktion aktuallsisiert, damit ichs mal selbst gemacht hab, das Hauptproblem war ja, dass der jeweilige Anzeiger falsch gesetzt wurde, und das ist jetzt raus:</p>
<pre><code class="language-cpp">void explosionen::anz()
{
  if (pos&gt;0)
  {
    explosion *anzeiger, *temp;
    temp = E;anzeiger=E;
    while (anzeiger!=0)
    {
      if (temp-&gt;gibstatus()&lt;20)//Wenn noch nicht alle Frames angezeigt sind..
      {
        R-&gt;anzrs(G[temp-&gt;gibstatus()].graphikid, temp-&gt;gibx(), temp-&gt;giby());
        //Anzeigeklasse aufrufen
        temp-&gt;anz();//setze Status hoch und neue Koordinaten

        anzeiger = temp-&gt;next;
        temp = anzeiger;
      }
      else
      {

        if (pos&gt;1)
        {
          //Element löschen, da ich mich von Anfang durchhangel -&gt; erstpointer kann umgesetzt werden
          explosion *neuE;//Element nach E, das auf E geschoben werden soll
          neuE = E-&gt;next;//Element nach E wird zugewiesen
          delete E;//E wird gelöscht
          E = neuE;//Element nach E wird zugewiesen
          anzeiger = E; temp = anzeiger;

        }
        else
        {
          //falls nur eine Exlosion läuft (-&gt;nur E gesetzt ist)
          temp-&gt;next=0;anzeiger=0; // damit aus whileschleife rausgesprungen wird
          delete E;//löschen der einen Explosion
        }
        pos--;//Position wird 1 weniger, da Anzahl um 1 gesunken
      }

    }
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1263002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1263002</guid><dc:creator><![CDATA[DaGeRe]]></dc:creator><pubDate>Tue, 10 Apr 2007 13:47:01 GMT</pubDate></item></channel></rss>