<?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[Template-Queue funktioniert nicht richtig]]></title><description><![CDATA[<p>Hi,<br />
ich hab ein Template geschrieben was wie eine Queue funktionieren soll.<br />
Doch irgendiwe stimmt das mit den Zeigern noch nicht so richtig.<br />
Das Queue hängt die Elemente nicht ans ende der Schlange sonder an Anfang <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Jemand ne idee??</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

#ifndef _QUEUE_H
#define _QUEUE_H

template &lt;class T&gt;
class Queue
{
public:
	Queue(): counter(0), topp (0){}		//Konstruktor
	~Queue(){}				//Destruktor

//Funktionsprototypen

	void deque();		//löschen des ersten Elements
	bool enque(const T&amp;);	//einfügen eines Elements ans Ende

	T&amp; first()const;		//Zugriff auf das erste Element
	bool isEmpty()const;		//Test ob Queue leer ist

private:
			class qNode
				{
				public:
				T data;
				qNode *next_element;
				};	

			qNode *topp;		//Zeiger auf erstes Element
			int counter;	//zählt wie viel elemente in Queue

};

//Funktionen

//prüft ob Queue leer ist, 0 Queue ist nicht leer und 1 Queue ist leer
template &lt;class T&gt; bool Queue&lt;T&gt;::isEmpty()const
	{
	if(counter == 0)
	return true;
	else
	return false;
	}	

//fügt Element am Ende an
template &lt;class T&gt; bool Queue&lt;T&gt;::enque(const T&amp; einzufuegendes_element)
{
	qNode *node = new qNode;
	node-&gt;data = einzufuegendes_element;
	node-&gt;next_element = topp;
	topp = node;
	++counter;
	return true;
}

//löscht erstes element
template &lt;class T&gt; void Queue&lt;T&gt;::deque()
{
	qNode *old_element = topp;
	topp = topp-&gt;next_element;
	delete old_element;
	--counter;
}

//gibt erstes element zurück
template &lt;class T&gt; T&amp; Queue&lt;T&gt;::first()const
{
	return topp-&gt;data;
}

#endif

int main()
{
	Queue&lt;int&gt; intQueue;
	cout &lt;&lt; &quot;Queue leer? 0-&gt;nein....1-&gt;ja    &quot; &lt;&lt; intQueue.isEmpty() &lt;&lt; endl;
	for(int index = 0; index &lt;= 5; index++)
	{
		if(intQueue.enque(index))
		cout &lt;&lt; index &lt;&lt; &quot; &quot; &lt;&lt; &quot;Element auf Queue abgelegt&quot; &lt;&lt; endl;
		else
		cout &lt;&lt; &quot;Es konnte nichts abgelegt werden !&quot; &lt;&lt; endl;
	}
	cout &lt;&lt; &quot;Queue leer? 0-&gt;nein....1-&gt;ja    &quot; &lt;&lt; intQueue.isEmpty() &lt;&lt; endl;
	cout &lt;&lt; intQueue.first();

}
</code></pre>
<p>Gruß steve</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/243507/template-queue-funktioniert-nicht-richtig</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 00:06:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/243507.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Jun 2009 15:38:52 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template-Queue funktioniert nicht richtig on Wed, 17 Jun 2009 15:38:52 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich hab ein Template geschrieben was wie eine Queue funktionieren soll.<br />
Doch irgendiwe stimmt das mit den Zeigern noch nicht so richtig.<br />
Das Queue hängt die Elemente nicht ans ende der Schlange sonder an Anfang <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Jemand ne idee??</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

#ifndef _QUEUE_H
#define _QUEUE_H

template &lt;class T&gt;
class Queue
{
public:
	Queue(): counter(0), topp (0){}		//Konstruktor
	~Queue(){}				//Destruktor

//Funktionsprototypen

	void deque();		//löschen des ersten Elements
	bool enque(const T&amp;);	//einfügen eines Elements ans Ende

	T&amp; first()const;		//Zugriff auf das erste Element
	bool isEmpty()const;		//Test ob Queue leer ist

private:
			class qNode
				{
				public:
				T data;
				qNode *next_element;
				};	

			qNode *topp;		//Zeiger auf erstes Element
			int counter;	//zählt wie viel elemente in Queue

};

//Funktionen

//prüft ob Queue leer ist, 0 Queue ist nicht leer und 1 Queue ist leer
template &lt;class T&gt; bool Queue&lt;T&gt;::isEmpty()const
	{
	if(counter == 0)
	return true;
	else
	return false;
	}	

//fügt Element am Ende an
template &lt;class T&gt; bool Queue&lt;T&gt;::enque(const T&amp; einzufuegendes_element)
{
	qNode *node = new qNode;
	node-&gt;data = einzufuegendes_element;
	node-&gt;next_element = topp;
	topp = node;
	++counter;
	return true;
}

//löscht erstes element
template &lt;class T&gt; void Queue&lt;T&gt;::deque()
{
	qNode *old_element = topp;
	topp = topp-&gt;next_element;
	delete old_element;
	--counter;
}

//gibt erstes element zurück
template &lt;class T&gt; T&amp; Queue&lt;T&gt;::first()const
{
	return topp-&gt;data;
}

#endif

int main()
{
	Queue&lt;int&gt; intQueue;
	cout &lt;&lt; &quot;Queue leer? 0-&gt;nein....1-&gt;ja    &quot; &lt;&lt; intQueue.isEmpty() &lt;&lt; endl;
	for(int index = 0; index &lt;= 5; index++)
	{
		if(intQueue.enque(index))
		cout &lt;&lt; index &lt;&lt; &quot; &quot; &lt;&lt; &quot;Element auf Queue abgelegt&quot; &lt;&lt; endl;
		else
		cout &lt;&lt; &quot;Es konnte nichts abgelegt werden !&quot; &lt;&lt; endl;
	}
	cout &lt;&lt; &quot;Queue leer? 0-&gt;nein....1-&gt;ja    &quot; &lt;&lt; intQueue.isEmpty() &lt;&lt; endl;
	cout &lt;&lt; intQueue.first();

}
</code></pre>
<p>Gruß steve</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728319</guid><dc:creator><![CDATA[WINFO2105]]></dc:creator><pubDate>Wed, 17 Jun 2009 15:38:52 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Queue funktioniert nicht richtig on Wed, 17 Jun 2009 16:21:18 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Das Queue hängt die Elemente nicht ans ende der Schlange sonder an Anfang</p>
</blockquote>
<p>Ist ja auch logisch. So ist der Prozess:</p>
<p>1. Aufruf von ennode</p>
<pre><code class="language-cpp">qNode *node = new qNode; // neuer, 1. Node
    node-&gt;data = einzufuegendes_element; // Node bekommt Daten
    node-&gt;next_element = topp; // node zeigt auf 0
    topp = node; // Anfang zeigt auf den Node
    ++counter;
    return true;
</code></pre>
<p>2. Aufruf:</p>
<pre><code class="language-cpp">qNode *node = new qNode; // neuer, 2. node
    node-&gt;data = einzufuegendes_element; // daten einfügen
    node-&gt;next_element = topp; // 2. node zeigt auf den 1. node
    topp = node; // der anfang ist der 2. node, (FIFO-Prinzip)
    ++counter;
    return true;
</code></pre>
<p>Konzeptvorschlag: Bau die Klassen um. Erstelle ein Interface (Queue), ein Anfangsknoten, der implizit erstellt wird und der erstellt automatisch einen Endknoten, der einfach nur die Nodes alloziiert. Die Nodes entscheiden dann, ob sie selber einen neuen Node erzeugen und den an ihren Vorgänger zurückgeben oder dass sie das erzeugen dem Nachfolger überlassen, bis spätestens Endnode eh alles alloziiert.<br />
Ein Beispiel meine Doppelt-Verketteten Liste (für dein Beispiel wäre das qNode):</p>
<pre><code class="language-cpp">#ifndef DEFNODE_HPP
#define DEFNODE_HPP

template &lt;class T&gt;
class DefNode : public Node&lt;T&gt; {

private:
	Node&lt;T&gt; *next;
	Node&lt;T&gt; *prev;
	T *data;
	DefNode(const DefNode&lt;T&gt;&amp;);

public:
	DefNode() { }
	DefNode(Node&lt;T&gt;*, Node&lt;T&gt;*, T*);
	~DefNode();
	Node&lt;T&gt;* Append(T*, Node&lt;T&gt;*);
	void Read() const;

	DefNode&lt;T&gt; operator =(DefNode&lt;T&gt; &amp;dn) {
		if(this == &amp;dn) return *this;
		delete next;
		next = dn.next;
		prev = dn.prev;
		data = dn.data;
		return *this;
	}

};

template &lt;class T&gt;
DefNode&lt;T&gt;::DefNode(Node&lt;T&gt; *n, Node&lt;T&gt; *p, T *d)
	: next(n), prev(p), data(d)
{
}

template &lt;class T&gt;
DefNode&lt;T&gt;::DefNode(const DefNode&lt;T&gt; &amp;dn) {
	next = dn.next;
	prev = dn.prev;
	data = dn.data;
}

template &lt;class T&gt;
DefNode&lt;T&gt;::~DefNode() {
	delete data;
	delete next;
}

template &lt;class T&gt;
Node&lt;T&gt;* DefNode&lt;T&gt;::Append(T *data, Node&lt;T&gt; *p) {
#define FIFO3
#ifdef FIFO
	DefNode&lt;T&gt; *newNode = new DefNode&lt;T&gt;(this, p, data);
	prev = newNode;
	return newNode;
#else

	next = next-&gt;Append(data, this);
	return this;
#endif
}

template &lt;class T&gt;
void DefNode&lt;T&gt;::Read() const {
	cout &lt;&lt; *data &lt;&lt; endl;
	next-&gt;Read();
}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1728335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728335</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Wed, 17 Jun 2009 16:21:18 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Queue funktioniert nicht richtig on Wed, 17 Jun 2009 16:40:59 GMT]]></title><description><![CDATA[<p>Mhh jetzt wo du es sagst,stimmt jetzt seh ich es auch.<br />
Kann ich evtl. die Zeiger irgendwie umbiegen?<br />
Gruß steve</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728353</guid><dc:creator><![CDATA[WINFO2105]]></dc:creator><pubDate>Wed, 17 Jun 2009 16:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Queue funktioniert nicht richtig on Wed, 17 Jun 2009 17:10:44 GMT]]></title><description><![CDATA[<p>Es gibt sehr viele Möglichkeiten. Entweder du machst eine Struktur wie ich (sehr dynamisch, schönes C++) oder eine Fast-Variante. Überlass es - wie gesagt - qNode, weitere Nodes zu kreieren. Schreibe für qNode folgende Methode enque():</p>
<pre><code class="language-cpp">template &lt;class T&gt;
qNode&lt;T&gt;* qNode&lt;T&gt;::enque(T *data) {
   if(next_element == 0) { // Zeiger auf 0, ich bin der letzte, ich muss neuen Node erstellen
      qNode&lt;T&gt; *newNode = new qNode&lt;T&gt;; // newNode-&gt;next_element zeigt implizit auf 0, wird letzter
      newNode-&gt;data = data; // fülle den letzten
      return newNode; // Adresse zurückgeben vom letzten
   }
   else {
      next_element = next_element-&gt;enque(data); // lass das den nächsten Node machen, gib mir nur die Adresse vom ggf. neuen Node (nur, wenn ich vorletzter bin)
      return this; // gib mich selber zurück, ich erstelle keinen neuen Node, Kette bleibt gleich!
   }
}
</code></pre>
<p>Die rekursive Schleife im else muss irgendwann unterbruchen werden, d.h. irgendein qNode muss die Drecksarbeit erledigen, einen neuen qNode zu erstellen, das macht die IF-Abfrage, wenn es kein next mehr gibt, wenn doch, dann überlass es dem nächsten. Wenn der einen next hat, dann überlässt der es wiederrum den nächsten usw. und gibt sich selbst zurück, was dann der Vorgänger als next nimmt, das bleibt logischerweise auch gleich. Wenn jedoch der letzte Node aufgefordert wird, der einen neuen Node zurückgibt, dann wird er eben auch next zugewiesen und der neue Node zeigt implizit auf 0. <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 Thema ist nicht so einfach, hat bei mir auch eine Weile gedauert, mal dir das am besten mal alles auf, das hilft extrem. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1728371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728371</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Wed, 17 Jun 2009 17:10:44 GMT</pubDate></item><item><title><![CDATA[Reply to Template-Queue funktioniert nicht richtig on Wed, 17 Jun 2009 17:12:01 GMT]]></title><description><![CDATA[<p>hab es mir schon ma aufgemalt werd es nochma neu machen.<br />
Trotzdem danke.<br />
Gruß Steve</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1728375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1728375</guid><dc:creator><![CDATA[WINFO2105]]></dc:creator><pubDate>Wed, 17 Jun 2009 17:12:01 GMT</pubDate></item></channel></rss>