<?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[Priority Queue]]></title><description><![CDATA[<p>Hallo miteinander!</p>
<p>Ich sollte in einer Priority Queue (d.h. linked list) eine insert-Methode implementieren, die &quot;node&quot; als Argument hat. Als private Variable sollte man lediglich _root (ich hoffe, die Namen sind selbsterklärend <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="😉"
    /> ) verwenden.<br />
Meine Frage: Aus was muss ich hier besonders achten, bzw. wie ist diese Methode zu implementieren? (evtl. Schritt-&quot;Anleitung&quot;)</p>
<p>Liebe Grüsse,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285482/priority-queue</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 06:53:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285482.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Apr 2011 12:29:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 12:29:50 GMT]]></title><description><![CDATA[<p>Hallo miteinander!</p>
<p>Ich sollte in einer Priority Queue (d.h. linked list) eine insert-Methode implementieren, die &quot;node&quot; als Argument hat. Als private Variable sollte man lediglich _root (ich hoffe, die Namen sind selbsterklärend <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="😉"
    /> ) verwenden.<br />
Meine Frage: Aus was muss ich hier besonders achten, bzw. wie ist diese Methode zu implementieren? (evtl. Schritt-&quot;Anleitung&quot;)</p>
<p>Liebe Grüsse,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052495</guid><dc:creator><![CDATA[MaxC++]]></dc:creator><pubDate>Thu, 21 Apr 2011 12:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 12:36:11 GMT]]></title><description><![CDATA[<p>Sag doch erst einmal, wie <strong>du</strong> es machen würdest. Dann kann man kommentieren, ob das gut oder schlecht ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052499</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 21 Apr 2011 12:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 12:55:13 GMT]]></title><description><![CDATA[<p>MaxC++ schrieb:</p>
<blockquote>
<p>Hallo miteinander!<br />
Ich sollte in einer Priority Queue (d.h. linked list)</p>
</blockquote>
<p>Ungewöhnlich, weil insert O(n) Zeit kostet.<br />
Ich sehme mal an single linked list, also nur Nachfolgerzeiger.</p>
<p>Erste Idee:</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   for(Node* n=root;n!=nullptr;n=n-&gt;next)//läuft über alle bisherigen Nodes
      if(n-&gt;key&gt;=newNode-&gt;key)
          //füge newNode VOR n ein. 
}
</code></pre>
<p>EDIT: Glaube, &lt;= war gemeint, ist dann auch im Folgenden überall falsch.</p>
<p>Mist. Wie kann ich denn VOR n was einfügen?<br />
Dazu müßte ich einen Zeiger auf den Node VOR n haben.<br />
Ok, den merke ich mir halt auch.</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   Node* vorher;
   for(Node* n=root;n!=nullptr;n=n-&gt;next){
      if(n-&gt;key&gt;=newNode-&gt;key)
          //füge newNode VOR n ein. Also NACH vorher. 
      vorher=n;
   }
}
</code></pre>
<p>Ja, riecht gut.</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   Node* vorher;
   for(Node* n=root;n!=nullptr;n=n-&gt;next){
      if(n-&gt;key&gt;=newNode-&gt;key){
          vorher-&gt;next=newNode;
          newNode-&gt;next=n;
      }
      vorher=n;
   }
}
</code></pre>
<p>Ok, jetzt noch die Ränder checken.<br />
Klappt das auch ganz am Ende?<br />
Nee. Das müßte nach der Schleife passieren.</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   Node* vorher;
   for(Node* n=root;n!=nullptr;n=n-&gt;next){
      if(n-&gt;key&gt;=newNode-&gt;key){
          vorher-&gt;next=newNode;
          newNode-&gt;next=n;
          return;
      }
      vorher=n;
   }
   //falls kein Einfügen passierte
   vorher-&gt;next=newNode;
   newNode-&gt;next=nullptr;
}
</code></pre>
<p>Riecht schon nicht mehr schön. Aber scheint zu laufen.<br />
Noch den Sonderfasll abfangen, daß am Anfang eingefügt wird, weil dann gibt es noch kein vorher.</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   Node* vorher=nullptr;
   for(Node* n=root;n!=nullptr;n=n-&gt;next){
      if(n-&gt;key&gt;=newNode-&gt;key){
          if(vorher==nullptr){
             newNode-&gt;next=root;
             root=newNode;
          }
          else{
             vorher-&gt;next=newNode;
             newNode-&gt;next=n;
          }
          return;
      }
      vorher=n;
   }
   //falls kein Einfügen passierte
   vorher-&gt;next=newNode;
   newNode-&gt;next=nullptr;
}
</code></pre>
<p>Und den Sonderfall, daß die Liste ganz leer war.</p>
<pre><code class="language-cpp">void insert(Node* newNode){
   if(root==nullptr){
      root=newNode;
      newNode-&gt;next=nullptr;
   }
   Node* vorher=nullptr;
   for(Node* n=root;n!=nullptr;n=n-&gt;next){
      if(n-&gt;key&gt;=newNode-&gt;key){
          if(vorher==nullptr){
             newNode-&gt;next=root;
             root=newNode;
          }
          else{
             vorher-&gt;next=newNode;
             newNode-&gt;next=n;
          }
          return;
      }
      vorher=n;
   }
   //falls kein Einfügen passierte
   vorher-&gt;next=newNode;
   newNode-&gt;next=nullptr;
}
</code></pre>
<p>So, Phase I abgeschlossen. Falls es klappt, habe nichts getestet.<br />
Phase II ist dann, gleichartigen Code zusammenzurassen, falls möglich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052508</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 21 Apr 2011 12:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 13:17:10 GMT]]></title><description><![CDATA[<p>lol volkard</p>
<p>n1, einfach mal so aus dem stegreif...</p>
<p>*respekt hab*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052520</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 21 Apr 2011 13:17:10 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 13:17:15 GMT]]></title><description><![CDATA[<p>WOW! Vielen Dank für den Vorschlag!<br />
Den werde ich mir zu Hause gleich mal anschauen.<br />
Ich habs inzwischen so gemacht - allerdings hat es noch bugs drinnen, denn die Ausgabe ist nicht korrekt. Zudem ist vorgegeben, dass man nur die private Variable _root verwenden darf, und ich teilw. einige &quot;temporäre&quot; erstellt habe.<br />
Was meint ihr dazu? (..oder ist es völliger bullshit?)</p>
<pre><code class="language-cpp">#include &quot;priority_queue.hpp&quot;

priority_queue::priority_queue() : _root(NULL) {}

void priority_queue::insert(node* node_)
{
    /* Insert your code here. */
	node* prev = NULL;
	node* current = _root;
	while (current != NULL &amp;&amp; current-&gt;get_priority() &gt;= node_-&gt;get_priority()) {
		prev = current;
		current = current-&gt;get_next();
	}
	node* temp;
	if (prev = NULL) {
		temp-&gt;get_next() == _root;
		_root = temp;
	}
	else {
		temp-&gt;get_next() == current;
		prev-&gt;get_next() == temp;
	}

}

node* priority_queue::pop()
{
	/* Insert your code here. */
	node* temp = _root;
	_root = _root-&gt;get_next();
	return temp;
}

size_t priority_queue::size() const
{
	/* Insert your code here. */
	*_root = priority_queue().size();
	_root-&gt;get_next() == NULL;
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2052521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052521</guid><dc:creator><![CDATA[MaxC++]]></dc:creator><pubDate>Thu, 21 Apr 2011 13:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Thu, 21 Apr 2011 13:56:41 GMT]]></title><description><![CDATA[<p>MaxC++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">node* temp;//und zeigt wohin?
	if (prev = NULL) {
		temp-&gt;get_next() == _root;
		_root = temp;
	}
	else {
		temp-&gt;get_next() == current;
		prev-&gt;get_next() == temp;
	}

}
</code></pre>
</blockquote>
<p>War damit nicht eher gemeint</p>
<pre><code class="language-cpp">//node* temp; //weg
	if (prev = NULL) {
		node_-&gt;get_next() == _root;
		_root = node_;
	}
	else {
		node_-&gt;get_next() == current;
		prev-&gt;get_next() == node_;
	}

}
</code></pre>
<p>Dein insert verlangt, daß jemand außerhalb schon den neuen Node genastelt hat. <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="😞"
    /></p>
<pre><code class="language-cpp">node* newNode=new Node;//hier
newNode-&gt;priority=17;
theQueue.insert(newNode);
</code></pre>
<p>Deswegen mußt Du keinen selber anlegen.</p>
<p>Um symmetrisch zu sein, sollte pop auch nur den kleinsten Node ausketten und den ausgeketteten Node zurückliefern.</p>
<pre><code class="language-cpp">node* poppedNode=theQueue.pop();
cout&lt;&lt;poppedNode-&gt;priority&lt;&lt;'\n';
delete poppedNode;
</code></pre>
<p>Oh, das klappt ja schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052536</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 21 Apr 2011 13:56:41 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Sat, 23 Apr 2011 00:24:48 GMT]]></title><description><![CDATA[<p>Besten Dank für die Antworten!</p>
<p>Mein Code funktioniert soweit.<br />
In einer diesen beiden Methoden muss es aber irgendwo noch einen (logischen) Fehler haben, denn der Compiler kompiliert, aber bei der Ausführung bricht das Programm ab. Doch was ist falsch, oder noch nicht vollständig?</p>
<pre><code class="language-cpp">node* priority_queue::pop()
{
	/* Insert your code here. */
	node* temp = _root;
	_root = _root-&gt;get_next();
	delete temp;
	return _root;
}

size_t priority_queue::size() const
{
	/* Insert your code here. */
	*_root = priority_queue().size();
	_root-&gt;get_next() == NULL;
	return 0;
}
</code></pre>
<p>Liebe Grüsse,<br />
Max</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053121</guid><dc:creator><![CDATA[MaxC++]]></dc:creator><pubDate>Sat, 23 Apr 2011 00:24:48 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Sat, 23 Apr 2011 04:04:49 GMT]]></title><description><![CDATA[<p>MaxC++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// schnipp
void priority_queue::insert(node* node_)
{
    /* Insert your code here. */
	node* prev = NULL;
	node* current = _root;
	while (current != NULL &amp;&amp; current-&gt;get_priority() &gt;= node_-&gt;get_priority()) {
		prev = current;
		current = current-&gt;get_next();
	}
	node* temp;
	if (prev = NULL) {                 // &lt;- eine Zuweisung
		temp-&gt;get_next() == _root;     // &lt;- keine Zuweisung + temp nicht initialisiert
		_root = temp;
	}
	else {
		temp-&gt;get_next() == current;    // &lt;- keine Zuweisung
		prev-&gt;get_next() == temp;       // &lt;- keine Zuweisung
	}

}
// schnapp
</code></pre>
</blockquote>
<p>Du willst wahrscheinlich (unter der Annahme, dass get_next eine Referenz eines nichtkonstanten Zeiger zurückgibt):</p>
<pre><code class="language-cpp">if (prev == NULL) {
    node-&gt;get_next() = _root;
    _root = node_;
}
else {
    node_-&gt;get_next() = current;
    prev-&gt;get_next() = node_;
}
</code></pre>
<p>Was du dir beim programmieren der size-Fkt. gedacht hast kann ich leider garnicht nachvollziehen <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>P.S.: zwei mal editieren müssen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> - es wird wohl Zeit ins Bett zu gehen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2053124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053124</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Sat, 23 Apr 2011 04:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Priority Queue on Sat, 23 Apr 2011 06:31:51 GMT]]></title><description><![CDATA[<p>MaxC++ schrieb:</p>
<blockquote>
<pre><code class="language-cpp">node* priority_queue::pop()
{
	/* Insert your code here. */
	node* temp = _root;
	_root = _root-&gt;get_next();
	delete temp;
	return _root;
}
</code></pre>
</blockquote>
<p>Das löscht das bisherige Kopf-Element und gibt das neue Kopf-Element zurück. Du solltest da vermutlich <code>temp</code> zurückgeben anstatt es zu vernichten.</p>
<blockquote>
<pre><code class="language-cpp">size_t priority_queue::size() const
{
	/* Insert your code here. */
	*_root = priority_queue().size();
	_root-&gt;get_next() == NULL;
	return 0;
}
</code></pre>
</blockquote>
<p>Ich hab' echt keine Ahnung, was dieser Code macht. Die erste Zeile sieht nach einem rekursiven Aufruf der Methode aus, die zweite Zeile kappt die Verbindung zwischen dem Kopf und der restlichen Kette (was dir zumindest ein Speicherleck beschert).<br />
Wenn du die Größe/Länge deiner Queue zurückgeben willst, hast du zwei Möglichkeiten: Entweder du merkst dir die Größe und aktualisierst sie bei jedem insert() und pop() oder du läufst einmal durch die Struktur und zählst die Elemente.</p>
<pre><code class="language-cpp">//Variante 1:
void priority_queue::insert(node* node_)
{
  //dein Code
  ++_size;
}

node* priority_queue::pop()
{
  node* tmp = _root;
  _root = _root-&gt;get_next();
  --_size;
  return tmp;
}

size_t priority_queue::size() const
{
  return _size;
}

//Variante 2
size_t priority_queue::size() const
{
  node* tmp = root;
  size_t sz=0;
  for( ; tmp!=NULL ; tmp=tmp-&gt;ge_next(),++sz ) ;
  return sz;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2053131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2053131</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 23 Apr 2011 06:31:51 GMT</pubDate></item></channel></rss>