<?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[doppel verkette liste]]></title><description><![CDATA[<p>Hallo<br />
ich habe ein problem beim mehrmalingen löschen einer zahl hinternander und die rückwärtsausgabe der list bzw ich bin mir nicht sicher ob ich das mit der doppelten verkette liste richtig gemacht habe.</p>
<p>hier bekomme ich immer eine fehelermeldung:<br />
&quot;Unbehandelte Ausnahme bei 0x012316c3 in blub.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000&quot;</p>
<p>for (qelem *ptr = tail; ptr-&gt;prev!= NULL;ptr = ptr-&gt;prev)<br />
{<br />
cout &lt;&lt;ptr-&gt;data &lt;&lt; ' ' ;<br />
}</p>
<p>beim löschen muss ich woll den tail neu festlegen aber wie ?</p>
<p>void dequeue ()<br />
{</p>
<p>qelem *ptr;</p>
<p>for(ptr=head; ptr-&gt;next!=tail; ptr=ptr-&gt;next) ;<br />
ptr-&gt;next = tail-&gt;next;</p>
<p>delete tail;</p>
<p>}</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;iomanip&gt;
using namespace std;
struct qelem
{  
	struct qelem *prev ;   // Verknüpfung zum Vorgänger
	int data ;      // simuliert die Daten
	struct qelem *next;   // Verknüpfung zum Nachfolger
};
qelem *head = NULL;   // Anfang der Liste
qelem *tail = NULL;	  // ENDE der Liste
bool empty()
{
	if (head = 0)
		return 1;
	else
		return 0;
}
int size()
{   
	int j =0;
	qelem *pt ;
	for( pt = head; pt-&gt;next != NULL;pt=pt-&gt;next )
		{j++;}
	return j;
}
void enqueue (int key)
{ 
		    qelem *elem = new qelem;
            elem-&gt;data = key;  // Besetze die Daten
            elem-&gt;next = NULL; // Hänge die bisherige Liste an

			if( head == NULL )
			{
				head = elem;

			}
			else 
			{
				qelem *ptr ;
				for( ptr = head; ptr-&gt;next != NULL;ptr=ptr-&gt;next ) ;

				ptr-&gt;next = elem;
				tail = elem;
			}
}
void print_queue(qelem *head)
{  
for (qelem *ptr = head; ptr-&gt;next != NULL;ptr = ptr-&gt;next )
	{
	cout  &lt;&lt;ptr-&gt;data &lt;&lt; ' ' ;
	}

}
void dequeue ()
{	

qelem *ptr;

for(ptr=head; ptr-&gt;next!=tail; ptr=ptr-&gt;next) ;
ptr-&gt;next = tail-&gt;next;

delete tail;

}

int main(){

	int t =0;
	while (1){
	if (head == NULL)
		cout &lt;&lt; &quot;Q: (leer) #:0&quot;&lt;&lt;endl;

	else {
		cout &lt;&lt; &quot;Q:&quot;;
		print_queue(head);
		cout&lt;&lt;&quot;#:&quot;&lt;&lt;size()&lt;&lt;endl;
		}
	cout &lt;&lt;&quot;1)Element hinzufügen\n2)Element löschen\n3)ENDE\n&quot;;
	cin &gt;&gt; t;
	switch(t)
	{
	case 1:
		{
		int zahl = rand() % 60;
		enqueue (zahl);
		break;
		}
	case 2:
		{
		dequeue ();
		//cout &lt;&lt; &quot;dequeting &quot; &lt;&lt; r &lt;&lt; &quot;!\n&quot;;
		break;
		}
	case 3:
		{
		return 0; 
		}
	}

}

	system(&quot;pause&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/297193/doppel-verkette-liste</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 13:40:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297193.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Dec 2011 22:38:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to doppel verkette liste on Tue, 20 Dec 2011 22:38:22 GMT]]></title><description><![CDATA[<p>Hallo<br />
ich habe ein problem beim mehrmalingen löschen einer zahl hinternander und die rückwärtsausgabe der list bzw ich bin mir nicht sicher ob ich das mit der doppelten verkette liste richtig gemacht habe.</p>
<p>hier bekomme ich immer eine fehelermeldung:<br />
&quot;Unbehandelte Ausnahme bei 0x012316c3 in blub.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000&quot;</p>
<p>for (qelem *ptr = tail; ptr-&gt;prev!= NULL;ptr = ptr-&gt;prev)<br />
{<br />
cout &lt;&lt;ptr-&gt;data &lt;&lt; ' ' ;<br />
}</p>
<p>beim löschen muss ich woll den tail neu festlegen aber wie ?</p>
<p>void dequeue ()<br />
{</p>
<p>qelem *ptr;</p>
<p>for(ptr=head; ptr-&gt;next!=tail; ptr=ptr-&gt;next) ;<br />
ptr-&gt;next = tail-&gt;next;</p>
<p>delete tail;</p>
<p>}</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;iomanip&gt;
using namespace std;
struct qelem
{  
	struct qelem *prev ;   // Verknüpfung zum Vorgänger
	int data ;      // simuliert die Daten
	struct qelem *next;   // Verknüpfung zum Nachfolger
};
qelem *head = NULL;   // Anfang der Liste
qelem *tail = NULL;	  // ENDE der Liste
bool empty()
{
	if (head = 0)
		return 1;
	else
		return 0;
}
int size()
{   
	int j =0;
	qelem *pt ;
	for( pt = head; pt-&gt;next != NULL;pt=pt-&gt;next )
		{j++;}
	return j;
}
void enqueue (int key)
{ 
		    qelem *elem = new qelem;
            elem-&gt;data = key;  // Besetze die Daten
            elem-&gt;next = NULL; // Hänge die bisherige Liste an

			if( head == NULL )
			{
				head = elem;

			}
			else 
			{
				qelem *ptr ;
				for( ptr = head; ptr-&gt;next != NULL;ptr=ptr-&gt;next ) ;

				ptr-&gt;next = elem;
				tail = elem;
			}
}
void print_queue(qelem *head)
{  
for (qelem *ptr = head; ptr-&gt;next != NULL;ptr = ptr-&gt;next )
	{
	cout  &lt;&lt;ptr-&gt;data &lt;&lt; ' ' ;
	}

}
void dequeue ()
{	

qelem *ptr;

for(ptr=head; ptr-&gt;next!=tail; ptr=ptr-&gt;next) ;
ptr-&gt;next = tail-&gt;next;

delete tail;

}

int main(){

	int t =0;
	while (1){
	if (head == NULL)
		cout &lt;&lt; &quot;Q: (leer) #:0&quot;&lt;&lt;endl;

	else {
		cout &lt;&lt; &quot;Q:&quot;;
		print_queue(head);
		cout&lt;&lt;&quot;#:&quot;&lt;&lt;size()&lt;&lt;endl;
		}
	cout &lt;&lt;&quot;1)Element hinzufügen\n2)Element löschen\n3)ENDE\n&quot;;
	cin &gt;&gt; t;
	switch(t)
	{
	case 1:
		{
		int zahl = rand() % 60;
		enqueue (zahl);
		break;
		}
	case 2:
		{
		dequeue ();
		//cout &lt;&lt; &quot;dequeting &quot; &lt;&lt; r &lt;&lt; &quot;!\n&quot;;
		break;
		}
	case 3:
		{
		return 0; 
		}
	}

}

	system(&quot;pause&quot;);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2159499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2159499</guid><dc:creator><![CDATA[kannickel13]]></dc:creator><pubDate>Tue, 20 Dec 2011 22:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to doppel verkette liste on Wed, 21 Dec 2011 19:17:17 GMT]]></title><description><![CDATA[<p>was allgemeines zum stil: rück einheitlich ein -.-'<br />
ich hab mir mal erlaubt, alles zu kommentieren - wenn du ein wenig scrollst, wirst du deinen fehler vermutlich ziemlich schnell sehen.</p>
<pre><code class="language-cpp">struct qelem 
{   
  qelem *prev; //bevorzugt wird von den meisten qelem* prev; da es aber eindeutig eine stilfrage ist, lass ichs einfach mal so bei dir
  int data;
  qelem *next;
};
</code></pre>
<p>reicht aus, struct musst du in C++ nicht jedesmal vor den typen schreiben. in C musste man das noch. unnötige kommentare braucht es denke ich auch nicht. und &quot;simuliert die Daten&quot; ist ein wenig komisch ausgedrückt <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>
<pre><code class="language-cpp">qelem *head = NULL;
qelem *tail = NULL;
</code></pre>
<p>ok</p>
<pre><code class="language-cpp">bool empty() 
{ 
    if (head = 0)
        return 1; 
    else 
        return 0; 
}
</code></pre>
<p>falsch. = ist die Zuweisung (und gibt dann den wert zurück).<br />
und wieso verwendest du oben NULL und hier 0? konsistent bleiben bei so etwas.<br />
-&gt;</p>
<pre><code class="language-cpp">bool empty()
{
//richtiger:
  if(head == NULL)
    return 1;
  else
    return 0;
//richtig:
  return head == NULL;
}
</code></pre>
<pre><code class="language-cpp">int size() 
{   
    int j =0; 
    qelem *pt ; 
    for( pt = head; pt-&gt;next != NULL;pt=pt-&gt;next ) 
        {j++;} 
    return j; 
}
</code></pre>
<p>sicherlich ist die formatierung eine geschmackssache, aber so siehts nicht all zu hübsch aus. außerdem hast du doch nicht um sonst tail - da ist auch egal, wo der letzte eintrag hinzeigt, da es ja ohnehin als das ende bekannt ist.</p>
<pre><code class="language-cpp">int size()
{
  if(empty())
    return 0;

  int length = 1;
  for(qelem *i = head; i != tail; i=i-&gt;next)
  {
    length++;
  }
  return length;
}
</code></pre>
<pre><code class="language-cpp">void enqueue (int key)
{ 
            qelem *elem = new qelem;
            elem-&gt;data = key;  // Besetze die Daten
            elem-&gt;next = NULL; // Hänge die bisherige Liste an --- kommentar hat nichts damit zu tun - und ist zudem noch falsch

            if( head == NULL )
            {
                head = elem;

            }
            else 
            {
                qelem *ptr ;
/*unnötig, dafür hast du tail*/                for( ptr = head; ptr-&gt;next != NULL;ptr=ptr-&gt;next ) ;

                ptr-&gt;next = elem;
                tail = elem;
            }
}
</code></pre>
<pre><code class="language-cpp">void enqueue (int key) 
{ 
  qelem *elem = new qelem;
  elem-&gt;data = key;
  elem-&gt;next = NULL;

  if(empty())
  {
    elem-&gt;prev = NULL;

    head = tail = elem;
  }
  else
  {
    elem-&gt;prev = tail;

    tail-&gt;next = elem;
    tail = elem;
  }          
}
</code></pre>
<pre><code class="language-cpp">void print_queue(qelem *head) 
{   
for (qelem *ptr = head; ptr-&gt;next != NULL;ptr = ptr-&gt;next ) 
    { 
    cout  &lt;&lt;ptr-&gt;data &lt;&lt; ' ' ; 
    } 
}
</code></pre>
<p>bis auf das hässliche einrücken und die komischen leerzeichen ist hier nichts zu ändern. ich war aber mal so frei, und hab tail verwendet.</p>
<pre><code class="language-cpp">void print_queue(qelem *head) 
{
  if(empty())
    return;

  for(qelem *i = head; i != tail; i = i-&gt;next)
  { 
    cout &lt;&lt; ptr-&gt;data &lt;&lt; ' '; 
  }

  cout &lt;&lt; tail-&gt;data;
}
</code></pre>
<pre><code class="language-cpp">void dequeue () 
{    
qelem *ptr; 

for(ptr=head; ptr-&gt;next!=tail; ptr=ptr-&gt;next)
  ; //auf der gleichen zeile wirds zu leicht übersehen
/* ---&gt; ptr = tail-&gt;prev; */

ptr-&gt;next = tail-&gt;next; 
/* ---&gt; tail-&gt;prev-&gt;next = tail-&gt;next; */
/* ---&gt; tail-&gt;prev-&gt;next = NULL; */

delete tail;
//und jetzt vergisst du, tail neu zu setzen... beim nächsten deque wirds also knallen, da du den speicher dann zum zweiten mal freigibst.
}
</code></pre>
<pre><code class="language-cpp">void dequeue()
{    
//assert(!empty() &amp;&amp; &quot;cannot dequeue while list is empty&quot;); //erfordert #include &lt;cassert&gt;
  // wollts nur der vollständigkeit halber sagen, dass ichs hier hinschreiben würde.

  qelem* new_tail = tail-&gt;prev;
  delete tail;
  tail = new_tail;
//tail-&gt;next = NULL; - ist jetzt unnötig
}
</code></pre>
<p>so kurz kanns sein <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
//#include &lt;iomanip&gt; --- brauchst du nicht
#include &lt;cstdlib&gt; //system(const char*)

int main()
{
  using namespace std; //so lokal wie möglich halten

//while(1) --- endlosschleifen macht man eigentlich mit for(;;)
  for(;;)
  {
//  if (head == NULL) --- jedes mal setzt du die klammern anders - außerdem hast du noch immer eine funktion, die auf eine leere liste prüft...

/*
    if(empty())
      cout &lt;&lt; &quot;Q: (leer) #: 0&quot; &lt;&lt; endl;
    else
    {
      cout &lt;&lt; &quot;Q: &quot;;
      print_queue(head);
      cout &lt;&lt; &quot;#: &quot; &lt;&lt; size() &lt;&lt; endl;
    }
*/

    cout &lt;&lt; &quot;Q: &quot;;
    if(empty())
      cout &lt;&lt; &quot;(leer)&quot;;
    else
      print_queue(head);

    cout &lt;&lt; &quot; #: &quot; &lt;&lt; size() &lt;&lt; endl;

    cout &lt;&lt;
     &quot;1) Element hinzufügen\n&quot;
     &quot;2) Element löschen\n&quot;
     &quot;3) ENDE\n&quot;; 

    int t = 0;
    cin &gt;&gt; t;
    switch(t)
    {
/*    case 1:
      {
        int zahl = rand() % 60;
        enqueue(zahl);
        break;
      } */
      case 1:
        enqueue( rand()%60 );
        break;
      case 2: 
        dequeue();
        break; 
//    case 3: 
//      return 0; --- wenn du das programm komplett beenden willst, brauchst du auch system(&quot;PAUSE&quot;) nicht - außerdem solltest du davor speicher freigeben.
    }

    if(t == 3)
      break;

  }

//speicher freigeben müsstest du halt auch noch...
  while(!empty())
    dequeue();

  system(&quot;pause&quot;);
}
</code></pre>
<p>und noch einmal komplett ohne sinnlose kommentare:</p>
<pre><code class="language-cpp">struct qelem 
{   
  qelem *prev;
  int data;
  qelem *next;
};

qelem *head = NULL;
qelem *tail = NULL;

bool empty()
{
  return head == NULL;
}

int size()
{
  if(empty())
    return 0;

  int length = 1;
  for(qelem *i = head; i != tail; i=i-&gt;next)
  {
    ++length;
  }
  return length;
}

void enqueue (int key) 
{ 
  qelem *elem = new qelem;
  elem-&gt;data = key;
  elem-&gt;next = NULL;

  if(empty())
  {
    elem-&gt;prev = NULL;

    head = tail = elem;
  }
  else
  {
    elem-&gt;prev = tail;

    tail-&gt;next = elem;
    tail = elem;
  }          
}

void print_queue(qelem *head) 
{
  if(empty())
    return;

  for(qelem *i = head; i != tail; i = i-&gt;next)
  { 
    cout &lt;&lt; ptr-&gt;data &lt;&lt; ' '; 
  }

  cout &lt;&lt; tail-&gt;data;
}

void dequeue()
{    
  qelem* new_tail = tail-&gt;prev;
  delete tail;
  tail = new_tail;
}

#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

int main()
{
  using namespace std;

  for(;;)
  {
    cout &lt;&lt; &quot;Q: &quot;;
    if(empty())
      cout &lt;&lt; &quot;(leer)&quot;;
    else
      print_queue(head);

    cout &lt;&lt; &quot; #: &quot; &lt;&lt; size() &lt;&lt; endl;

    cout &lt;&lt;
     &quot;1) Element hinzufügen\n&quot;
     &quot;2) Element löschen\n&quot;
     &quot;3) ENDE\n&quot;; 

    int t = 0;
    cin &gt;&gt; t;
    switch(t)
    {
      case 1:
        enqueue( rand()%60 );
        break;
      case 2: 
        dequeue();
        break; 
    }

    if(t == 3)
      break;

  }

  while(!empty())
    dequeue();

  system(&quot;pause&quot;);
}
</code></pre>
<p>bb</p>
<p>edit: mir ist gerad aufgefallen, dass im deque noch eine abfrage fehlt. wenn die liste (danach) leer ist, dann sollte head = tail = NULL gesetzt werden. sry^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2159565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2159565</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 21 Dec 2011 19:17:17 GMT</pubDate></item></channel></rss>