<?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[dynamische Listen (doppelt verkettet)]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich zerbereche mir nun schon mehrere Stunden den Kopf darüber, wie ich eine dynamische Liste invertieren kann...<br />
Die Suchfunktion brachte leider keine für meinen Wissensstand hilfreichen Erkenntnisse und deshalb poste ich hier mal meinen Quelltext:</p>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;  //für NULL
#include &lt;stdio.h&gt;   //für Ein- und Ausgabe
#include &quot;definition.h&quot;  //für Vereinbarungen

//Zeiger auf Beginn und Ende der Liste:
T_elem *p_list_start=NULL,*p_list_stop=NULL;

void add_first (unsigned k)
{
   if(!p_list_start)
   {
      p_list_start=p_list_stop=new T_elem;
      p_list_start-&gt;key=k;
      p_list_start-&gt;prev=p_list_start-&gt;next=NULL;
      return;
   }
   p_list_start-&gt;prev=new T_elem;
   p_list_start-&gt;prev-&gt;next=p_list_start;
   p_list_start=p_list_start-&gt;prev;
   p_list_start-&gt;key=k;
   p_list_start-&gt;prev=NULL;
}//add_first

void del_first ()
{
   if(!p_list_start) return;
   if(!p_list_start-&gt;next)
   {
      delete p_list_start;
      p_list_start=p_list_stop=NULL;
      return;
   }
   p_list_start=p_list_start-&gt;next;
   delete p_list_start-&gt;prev;
   p_list_start-&gt;prev=NULL;
}//del_first

void add_last (unsigned k)
{
   if(!p_list_start) { add_first(k); return; }
   p_list_stop-&gt;next=new T_elem;
   p_list_stop-&gt;next-&gt;prev=p_list_stop;
   p_list_stop=p_list_stop-&gt;next;
   p_list_stop-&gt;key=k;
   p_list_stop-&gt;next=NULL;
}//add_last

void del_last ()
{
   if(!p_list_start) return;
   if(!p_list_start-&gt;next)
   {
      delete p_list_start;
      p_list_start=p_list_stop=NULL;
      return;
   }
   p_list_stop=p_list_stop-&gt;prev;
   delete p_list_stop-&gt;next;
   p_list_stop-&gt;next=NULL;
}//del_last

void print_from(T_elem * p)
{
   if(!p) { printf(&quot; !\n&quot;); return; }
   printf(&quot; %2u&quot;,p-&gt;key);
   print_from(p-&gt;next);
}//print_from

void print()
{   print_from(p_list_start); }

int main()
{
	char c;
	unsigned k,kk;

	while(1)
	{
		scanf(&quot;%c&quot;,&amp;c);
		if(c=='e') break;

		switch(c)
		{
			case 'f': scanf(&quot;%u&quot;,&amp;k);add_first(k);break;
			case 'l': scanf(&quot;%u&quot;,&amp;k);add_last(k); break;
			case 'd': scanf(&quot;%u&quot;,&amp;k);del_first(); break;
		}
	}
	print();
	rev(p_list_start,p_list_stop);
	print();

}
</code></pre>
<p>definition.h</p>
<pre><code class="language-cpp">struct T_elem
{
   unsigned key;
   T_elem * prev, * next;
};
//Prototypen
void add_first (unsigned);
void add_last (unsigned);
void del_first ();
void del_last ();
void print();
void rev(T_elem*,T_elem*);
</code></pre>
<p>und schließlich meine Funktion, welche die Invertierung ermöglichen sollte:</p>
<pre><code class="language-cpp">#include &quot;definition.h&quot;
#include &lt;iostream&gt;
extern T_elem * p_list_start, *p_list_stop;

void rev(T_elem *p,T_elem *q)
{
	unsigned int count=1;

	 do //Länge der Liste bestimmen
	{
	    p_list_start=p_list_start-&gt;next;
	    if(p_list_start-&gt;next-&gt;key != NULL)
	    {
	    	count++;
		 }
	}
	    	while  (p_list_start-&gt;next-&gt;key != NULL);

	 for (unsigned int i=0; i&lt;=count; i++) // Elemente vertauschen
	 {
		 p_list_start-&gt;next-&gt;prev= NULL;
		 p_list_start-&gt;prev=p_list_stop-&gt;next;
		 p_list_stop-&gt;next=p_list_start-&gt;prev;
		 p_list_start-&gt;next=NULL;
	 }
</code></pre>
<p>das Programm lässt sich zwar kompilieren und es ist auch möglich, die Liste zu erstellen, aber sobald ich mit &quot;e&quot; die Konstruktion der Liste abbreche, erhalte ich einen Fehler &quot;Programm hat einen Fehler festgestellt und muss beendet werden&quot;<br />
=&gt; ich gehe mal davon aus, dass die Invertierungsfunktion <strong>rev(p_list_start,p_list_stop)</strong> fehlerhaft ist.(und sehr wahrscheinlich auch sehr umständlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ) Leider kann ich den bzw. die Fehler nicht finden.</p>
<p>Ich hoffe ihr könnt mir einige Denkanstöße geben.</p>
<p>Vielen Dank &amp; lg Dragon</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203462/dynamische-listen-doppelt-verkettet</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 07:54:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203462.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Jan 2008 00:12:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Wed, 23 Jan 2008 00:12:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich zerbereche mir nun schon mehrere Stunden den Kopf darüber, wie ich eine dynamische Liste invertieren kann...<br />
Die Suchfunktion brachte leider keine für meinen Wissensstand hilfreichen Erkenntnisse und deshalb poste ich hier mal meinen Quelltext:</p>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &lt;stdlib.h&gt;  //für NULL
#include &lt;stdio.h&gt;   //für Ein- und Ausgabe
#include &quot;definition.h&quot;  //für Vereinbarungen

//Zeiger auf Beginn und Ende der Liste:
T_elem *p_list_start=NULL,*p_list_stop=NULL;

void add_first (unsigned k)
{
   if(!p_list_start)
   {
      p_list_start=p_list_stop=new T_elem;
      p_list_start-&gt;key=k;
      p_list_start-&gt;prev=p_list_start-&gt;next=NULL;
      return;
   }
   p_list_start-&gt;prev=new T_elem;
   p_list_start-&gt;prev-&gt;next=p_list_start;
   p_list_start=p_list_start-&gt;prev;
   p_list_start-&gt;key=k;
   p_list_start-&gt;prev=NULL;
}//add_first

void del_first ()
{
   if(!p_list_start) return;
   if(!p_list_start-&gt;next)
   {
      delete p_list_start;
      p_list_start=p_list_stop=NULL;
      return;
   }
   p_list_start=p_list_start-&gt;next;
   delete p_list_start-&gt;prev;
   p_list_start-&gt;prev=NULL;
}//del_first

void add_last (unsigned k)
{
   if(!p_list_start) { add_first(k); return; }
   p_list_stop-&gt;next=new T_elem;
   p_list_stop-&gt;next-&gt;prev=p_list_stop;
   p_list_stop=p_list_stop-&gt;next;
   p_list_stop-&gt;key=k;
   p_list_stop-&gt;next=NULL;
}//add_last

void del_last ()
{
   if(!p_list_start) return;
   if(!p_list_start-&gt;next)
   {
      delete p_list_start;
      p_list_start=p_list_stop=NULL;
      return;
   }
   p_list_stop=p_list_stop-&gt;prev;
   delete p_list_stop-&gt;next;
   p_list_stop-&gt;next=NULL;
}//del_last

void print_from(T_elem * p)
{
   if(!p) { printf(&quot; !\n&quot;); return; }
   printf(&quot; %2u&quot;,p-&gt;key);
   print_from(p-&gt;next);
}//print_from

void print()
{   print_from(p_list_start); }

int main()
{
	char c;
	unsigned k,kk;

	while(1)
	{
		scanf(&quot;%c&quot;,&amp;c);
		if(c=='e') break;

		switch(c)
		{
			case 'f': scanf(&quot;%u&quot;,&amp;k);add_first(k);break;
			case 'l': scanf(&quot;%u&quot;,&amp;k);add_last(k); break;
			case 'd': scanf(&quot;%u&quot;,&amp;k);del_first(); break;
		}
	}
	print();
	rev(p_list_start,p_list_stop);
	print();

}
</code></pre>
<p>definition.h</p>
<pre><code class="language-cpp">struct T_elem
{
   unsigned key;
   T_elem * prev, * next;
};
//Prototypen
void add_first (unsigned);
void add_last (unsigned);
void del_first ();
void del_last ();
void print();
void rev(T_elem*,T_elem*);
</code></pre>
<p>und schließlich meine Funktion, welche die Invertierung ermöglichen sollte:</p>
<pre><code class="language-cpp">#include &quot;definition.h&quot;
#include &lt;iostream&gt;
extern T_elem * p_list_start, *p_list_stop;

void rev(T_elem *p,T_elem *q)
{
	unsigned int count=1;

	 do //Länge der Liste bestimmen
	{
	    p_list_start=p_list_start-&gt;next;
	    if(p_list_start-&gt;next-&gt;key != NULL)
	    {
	    	count++;
		 }
	}
	    	while  (p_list_start-&gt;next-&gt;key != NULL);

	 for (unsigned int i=0; i&lt;=count; i++) // Elemente vertauschen
	 {
		 p_list_start-&gt;next-&gt;prev= NULL;
		 p_list_start-&gt;prev=p_list_stop-&gt;next;
		 p_list_stop-&gt;next=p_list_start-&gt;prev;
		 p_list_start-&gt;next=NULL;
	 }
</code></pre>
<p>das Programm lässt sich zwar kompilieren und es ist auch möglich, die Liste zu erstellen, aber sobald ich mit &quot;e&quot; die Konstruktion der Liste abbreche, erhalte ich einen Fehler &quot;Programm hat einen Fehler festgestellt und muss beendet werden&quot;<br />
=&gt; ich gehe mal davon aus, dass die Invertierungsfunktion <strong>rev(p_list_start,p_list_stop)</strong> fehlerhaft ist.(und sehr wahrscheinlich auch sehr umständlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> ) Leider kann ich den bzw. die Fehler nicht finden.</p>
<p>Ich hoffe ihr könnt mir einige Denkanstöße geben.</p>
<p>Vielen Dank &amp; lg Dragon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441693</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441693</guid><dc:creator><![CDATA[T-Dragonmaster XII]]></dc:creator><pubDate>Wed, 23 Jan 2008 00:12:08 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Wed, 23 Jan 2008 04:24:47 GMT]]></title><description><![CDATA[<blockquote>
<p>ich gehe mal davon aus, dass die Invertierungsfunktion rev(p_list_start,p_list_stop) fehlerhaft ist</p>
</blockquote>
<p>Wenn du dein Progrmm beenden rufst du auch noch deine &quot;print()&quot; funktionen auf.. bevor sich einer die die mühe macht den fehler frü dich zu suchen, solltest du mal debuggen <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>stetz nen breakpoint zum ersten print und geh dann schritt für schritt druch und schau die deine zeiger der listenelement an, ob sie richtig verknüft wurden. WEnn du dann den fehler genauer spezifizieren kannst und nich weiter kommst, kommen wir isn spiel;)</p>
<p>P.S.: Damit dir das debuggen nicht zu schwer fällt, würde ich deine print_from funktion nicht rekursiv machen mach ne schleife<br />
bspw. so:</p>
<pre><code class="language-cpp">void printlist(){
//vorwärts
for(T_elem* p= p_list_start; p!= NULL; p= p-&gt;next){
printf(&quot; %2u&quot;,p-&gt;key);
}
//rückwärts
for(T_elem* p= p_list_ende; p!= NULL; p= p-&gt;prev){
printf(&quot; %2u&quot;,p-&gt;key);
}

}
</code></pre>
<p>in der art. Die printf funktion gibt die list nun vorwärts und rückwärts aus, so kansnt überprüfen ob du sie richtg verkettet hast;) Vll. helfen dir die schleifen auch deine Rückwärtssuceh zu ermöglichen ^^</p>
<p>P.P.S: Wieso hat deine funktion &quot;rev&quot; parameter, welche du nicht mal in der funktion verwendest?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441717</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Wed, 23 Jan 2008 04:24:47 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Mon, 28 Jan 2008 15:33:37 GMT]]></title><description><![CDATA[<p>Hallo und danke für deine Antwort...</p>
<p>ich habe anscheinend nicht beachtet, dass es sich hierbei um eine doppelt verkettete Liste handelt und somit sind die Zeiger inkorrekt gesetzt...</p>
<p>ich werde diese nochmals überarbeiten und anschließend melde ich mich hier erneut...</p>
<p>lg Dragon</p>
<p>/EDIT: nun ist die Funktion zumindest funktionsfähig, wenn auch nicht optimal:</p>
<pre><code class="language-cpp">#include &quot;vorgP3.6.h&quot;
#include &quot;stdlib.h&quot;
#include &lt;iostream&gt;
using namespace std;
extern T_elem * p_list_start, *p_list_stop;

void rev(T_elem *p,T_elem *q)
{
	add_first(p_list_stop-&gt;key);
	del_last();

	T_elem* temp = p_list_start;   

	while (temp-&gt;next != NULL)   
	      {  
	           T_elem* neu = new T_elem; 
	           neu-&gt;next = temp-&gt;next; 
	           temp-&gt;next = neu; 
	           neu-&gt;prev = temp; 
	           neu-&gt;next-&gt;prev = neu; 
	           neu-&gt;key = p_list_stop-&gt;key; 
	           del_last(); 
	           temp = neu;  
	      }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1444228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444228</guid><dc:creator><![CDATA[T-Dragonmaster XII]]></dc:creator><pubDate>Mon, 28 Jan 2008 15:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Tue, 29 Jan 2008 08:15:19 GMT]]></title><description><![CDATA[<p>gibt es eine elegantere Lösung für das Problem, als diee von mir angegebene?</p>
<p>lg Dragon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445465</guid><dc:creator><![CDATA[T-Dragonmaster XII]]></dc:creator><pubDate>Tue, 29 Jan 2008 08:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Tue, 29 Jan 2008 10:32:08 GMT]]></title><description><![CDATA[<p>Ich denke schon, daß es elegantere Lösungen gibt.<br />
Bei deiner Lösung fällt mir negativ auf, daß du jedesmal ein neues Element erzeugst und wieder eines löschst (new und del_last).</p>
<p>Da du die reverse-Funktion ja inplace implementieren willst (also keine Kopie der Liste erzeugst), würde ich einfach die prev- und next-Zeiger der einzelnen Listen-Elemente vertauschen (und halt den Kopf und das Ende der Liste).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445533</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Tue, 29 Jan 2008 10:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to dynamische Listen (doppelt verkettet) on Tue, 29 Jan 2008 20:16:41 GMT]]></title><description><![CDATA[<p>T-Dragonmaster XII schrieb:</p>
<blockquote>
<p>gibt es eine elegantere Lösung für das Problem, als diee von mir angegebene?</p>
</blockquote>
<p>Hallo Dragon,</p>
<p>ja - die gibt es. Um die Reihenfolge der Elemente einer doppelt verketteten Liste umzukehren, braucht man doch nur bei jedem Element den prev- und next-Pointer auszutauschen. Das ganze sähe dann so aus:</p>
<pre><code class="language-cpp">void rev()
{
    for( T_elem* p = p_list_start; p; p = p-&gt;prev )
    {
        std::swap( p-&gt;next, p-&gt;prev );
    }
    std::swap( p_list_start, p_list_stop );
}
</code></pre>
<p>(std::swap braucht #include &lt;algorithm&gt;)</p>
<p>Ich möchte Dir noch wärmstens empfehlen, aus Deinen Funktionen eine Klasse zu machen und die beiden globalen Pointer als Member reinzupacken.</p>
<pre><code class="language-cpp">// --   eine Liste von unsigned
class List
{
public:
    List();
    ~List();

    void add_first (unsigned);
    void add_last (unsigned);
    void del_first ();
    void del_last ();
    void print();
    void rev();

private:
    T_elem* p_list_start;
    T_elem* p_list_stop;

    // --   Kopieren vorläufig stilllegen -&gt; Regel der Drei
    List( const List&amp; );
    List&amp; operator=( const List&amp; );
};
</code></pre>
<p>das schafft Überblick. Weiter könnte man auch für so profane Strukturen wie T_elem einen Konstruktor vorsehen ...</p>
<pre><code class="language-cpp">struct T_elem
{
    T_elem( unsigned k, T_elem* pr, T_elem* nx )
        : key( k ), prev( pr ), next( nx )
    {}
    unsigned key;
    T_elem * prev, * next;
};
</code></pre>
<p>.. dann vereinfacht sich z.B. die Methode add_first zu</p>
<pre><code class="language-cpp">void List::add_first (unsigned k)
{
   T_elem* neu = new T_elem( k, 0, p_list_start );
   if(!p_list_start)
   {
      p_list_start=p_list_stop = neu;
      return;
   }
   p_list_start-&gt;prev = neu;
   p_list_start = neu;
}
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1445951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1445951</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 29 Jan 2008 20:16:41 GMT</pubDate></item></channel></rss>