<?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[Problem mit Zeigern in einer verketteten Liste]]></title><description><![CDATA[<p>Ich möchte mir eine verkette Liste erstellen, dafür habe ich mir erstmal zwei Datensätze erstellt:</p>
<pre><code class="language-cpp">struct inh{
	inh *next;
	int wert;
};

struct l_typ{
	inh anf,pos;
};
</code></pre>
<p>Zuerst der Inhaltstyp, wobei hier irgendein Wert gespeichert werden soll und natürlich der Verweis auf das nächste Listenelement.<br />
Der Listentyp dann ist auch wieder ein Datensatz bestehend aus einem starren Anfangselement und meinem Positionselement, welches das genutzt werden soll die Liste zu durchlaufen.</p>
<p>Dann habe ich mir noch zwei Funktionen erstellt bei denen ich mir, aufgrund meiner geringen Erfahrung mit Zeigern, nicht sicher bin ob sie so richtig sind.<br />
Liste erstellen:</p>
<pre><code class="language-cpp">void l_create(l_typ&amp; liste)
{
	liste.anf.wert = 0;
	liste.anf.next = NULL;
	liste.pos = liste.anf;
};
</code></pre>
<p>Und ein Listenelement hinzufügen:</p>
<pre><code class="language-cpp">void l_add_element(l_typ&amp; liste, int v)
{
	while (liste.pos.next != NULL )
		liste.pos = *liste.pos.next;//Springe ich so wirklich zum nächsten Listenelement?
	liste.pos.next  = new inh;
	liste.pos.next-&gt;next = NULL;//Mit dem -&gt; Operator veränder ich doch den Wert auf den der Zeiger zeigt?
	liste.pos.next-&gt;wert = v;
};
</code></pre>
<p>Hoffe ihr könnt mir helfen <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/209366/problem-mit-zeigern-in-einer-verketteten-liste</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 14:41:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209366.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Mar 2008 20:11:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 20:11:49 GMT]]></title><description><![CDATA[<p>Ich möchte mir eine verkette Liste erstellen, dafür habe ich mir erstmal zwei Datensätze erstellt:</p>
<pre><code class="language-cpp">struct inh{
	inh *next;
	int wert;
};

struct l_typ{
	inh anf,pos;
};
</code></pre>
<p>Zuerst der Inhaltstyp, wobei hier irgendein Wert gespeichert werden soll und natürlich der Verweis auf das nächste Listenelement.<br />
Der Listentyp dann ist auch wieder ein Datensatz bestehend aus einem starren Anfangselement und meinem Positionselement, welches das genutzt werden soll die Liste zu durchlaufen.</p>
<p>Dann habe ich mir noch zwei Funktionen erstellt bei denen ich mir, aufgrund meiner geringen Erfahrung mit Zeigern, nicht sicher bin ob sie so richtig sind.<br />
Liste erstellen:</p>
<pre><code class="language-cpp">void l_create(l_typ&amp; liste)
{
	liste.anf.wert = 0;
	liste.anf.next = NULL;
	liste.pos = liste.anf;
};
</code></pre>
<p>Und ein Listenelement hinzufügen:</p>
<pre><code class="language-cpp">void l_add_element(l_typ&amp; liste, int v)
{
	while (liste.pos.next != NULL )
		liste.pos = *liste.pos.next;//Springe ich so wirklich zum nächsten Listenelement?
	liste.pos.next  = new inh;
	liste.pos.next-&gt;next = NULL;//Mit dem -&gt; Operator veränder ich doch den Wert auf den der Zeiger zeigt?
	liste.pos.next-&gt;wert = v;
};
</code></pre>
<p>Hoffe ihr könnt mir helfen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1482848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482848</guid><dc:creator><![CDATA[Nozdrum]]></dc:creator><pubDate>Sat, 29 Mar 2008 20:11:49 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 20:40:34 GMT]]></title><description><![CDATA[<p>Hi Nozdrum,</p>
<pre><code class="language-cpp">struct l_typ{
    inh anf,pos; // An dieser Stelle wäre ein Zeiger sicherlich sinnvoller
    // und der Zeiger auf eine Position ist denke ich auch keine Member-Variable ... (oder ist es nen Zeiger auf last?)
    inh* anf;
};
</code></pre>
<p>Ansonsten Erstellst du dir bei jeder Wertzuweisung eine Kopie des Objektes, das<br />
du zuweist.<br />
z. B. hier erstellst du eine Kopie:</p>
<pre><code class="language-cpp">liste.pos = *liste.pos.next;//Springe ich so wirklich zum nächsten Listenelement?
</code></pre>
<p>und in l_create erzeugst du auch eine Kopie:</p>
<pre><code class="language-cpp">void l_create(l_typ&amp; liste)
{
    liste.anf.wert = 0;
    liste.anf.next = NULL;
    liste.pos = liste.anf; // Hier!!! Folglich sind anf und pos verschiedene
    // Speicherbereiche und eine Änderung eines Wertes, ändert den anderen nicht...
};
</code></pre>
<p>Zur Verdeutlichung:</p>
<pre><code class="language-cpp">int main(){

	l_typ liste;
	liste.anf.wert = 22;
	liste.anf.next = NULL;
	liste.pos = liste.anf;
	std::cout &lt;&lt; liste.anf.wert &lt;&lt; std::endl;
	std::cout &lt;&lt; liste.pos.wert &lt;&lt; std::endl;
	liste.anf.wert = 23;
	std::cout &lt;&lt; liste.anf.wert &lt;&lt; std::endl;
	std::cout &lt;&lt; liste.pos.wert &lt;&lt; std::endl;
	return 0;
}
</code></pre>
<p>AUSGABE:</p>
<blockquote>
<p>22<br />
22<br />
23<br />
22</p>
</blockquote>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482864</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 29 Mar 2008 20:40:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 21:37:15 GMT]]></title><description><![CDATA[<p>Danke für die Antwort CSpille.</p>
<p>Also mein neues Datenkonzept:</p>
<pre><code class="language-cpp">struct inh_typ{
     inh_typ *next;
     int wert;
 };

 struct l_typ{
     inh_typ *anf,*pos;
 };
</code></pre>
<p>Jetzt habe ich mir das so gedacht:</p>
<pre><code class="language-cpp">void l_create(l_typ&amp; liste)
{
	liste.anf-&gt;next = NULL;
	liste.anf-&gt;wert = 0;
	liste.pos-&gt;next = NULL;
	liste.pos-&gt;wert = 0;
};
void l_add_element(l_typ&amp; liste,int v)
{
	while ( liste.pos-&gt;next != NULL )
		liste.pos = liste.pos-&gt;next; 
	liste.pos-&gt;next = new inh_typ;
	liste.pos-&gt;next-&gt;next = NULL;
	liste.pos-&gt;next-&gt;wert = v;
};
</code></pre>
<p>Im main-Teil steht dann als Bsp:</p>
<pre><code class="language-cpp">int main()
{
	l_typ liste;
	l_create(liste);
	l_add_element(liste,10);
	return 0;
};
</code></pre>
<p>Jedoch bekomme ich da Fehler wegen Speicherverletzung schon in l_create bei der ersten Anweisung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1482897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482897</guid><dc:creator><![CDATA[Nozdrum]]></dc:creator><pubDate>Sat, 29 Mar 2008 21:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 21:57:12 GMT]]></title><description><![CDATA[<p>Naja. Das Problem ist, dass du bei l_create davon ausgehst, dass</p>
<pre><code class="language-cpp">liste.anf-&gt;next = NULL;
</code></pre>
<p>hier bereits ein Element dort drinn ist.</p>
<p>Also schau dir das mal an:</p>
<pre><code class="language-cpp">liste.anf-&gt;next = NULL; //liste ist ja eine Referenz auf:

l_typ liste; // aber das hier ist ja lediglich:

 struct l_typ{
     inh_typ *anf,*pos; //und hier hast du ja einen zeiger drin, der nicht auf ein gültiges Objekt zeigt..
 };
</code></pre>
<p>Naja.. Hier besteht noch viel Verbesserungspotenzial. <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="😉"
    /> Wenigstens deleten solltest du die Elemente wieder, wenn du die mal in einer Liste hast.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482913</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 29 Mar 2008 21:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 22:15:12 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Naja. Das Problem ist, dass du bei l_create davon ausgehst, dass</p>
<pre><code class="language-cpp">liste.anf-&gt;next = NULL;
</code></pre>
<p>hier bereits ein Element dort drinn ist.</p>
</blockquote>
<p>Ahh Danke. So funzt es:</p>
<pre><code class="language-cpp">void l_create(l_typ&amp; liste)
{
	liste.anf = new inh_typ;
	liste.pos = liste.anf;
	liste.anf-&gt;next = NULL;
	liste.anf-&gt;wert = 0;
};
</code></pre>
<p>drakon schrieb:</p>
<blockquote>
<p>Naja.. Hier besteht noch viel Verbesserungspotenzial. <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="😉"
    /> Wenigstens deleten solltest du die Elemente wieder, wenn du die mal in einer Liste hast.. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Hehe. Wie delete ich ein Element dann wieder? Oder meinst die eine delete-Funktion wo die Werte wieder frei gegeben werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482921</guid><dc:creator><![CDATA[Nozdrum]]></dc:creator><pubDate>Sat, 29 Mar 2008 22:15:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sat, 29 Mar 2008 22:16:36 GMT]]></title><description><![CDATA[<p>Du weisst ja, dass man alles, dass man per new Operator anfordert auch weider von dir freigegeben werden muss per delete/delete[]..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482923</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 29 Mar 2008 22:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sun, 30 Mar 2008 15:23:44 GMT]]></title><description><![CDATA[<p>hier die hatte ich mal geschrieben, weil ich nem kumpel beweisen wollte, dass die qlist aus qt4 fehlerhaft wäre... es stellte sich raus, das meine liste das selbe verhalten zeigte^^ aber ich konnte so den fehler besser finden.<br />
nicht böse sein, ich war im rausch als ich sie geschrieben hatte und sie jetzt auch etwas kompliziert...<br />
weis jemand wie man iteratoren hinzufügen kann? wäre ganz witzig wenn man als forumspiel diese liste verbessert oder/und erweitert.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

template &lt;class T&gt;
class vector
{
private:
	T *data;

public:
	//! eigentlich priv
	int index;
	vector *next;
	vector *prev;

	//!konstruktor
	vector();
	vector(T &amp;v);
	vector(vector &amp;v);
	~vector();

	//! setter
	bool push_back(T data);
	//! cleaner
	void removeAt(int i);
	void clear();
	//! getter
	T get_last();
	T get_first();
	T at(int index);
}; 

//! konstrukoren &amp; destruktoren
template &lt;class T&gt;
vector&lt;T&gt;::vector() {
	next = NULL;
	prev = NULL;

	index = 0;
	data = new T;
}

template &lt;class T&gt;
vector&lt;T&gt;::~vector()
{

}

//! daten-settups
template &lt;class T&gt;
bool vector&lt;T&gt;::push_back(T data) {
	vector *new_node = new vector;
	*new_node-&gt;data = data;
	new_node-&gt;next = NULL;

	//verknüpfung zum alten beim neuen element
	new_node-&gt;prev = this-&gt;next;

	//verknüpfung zum neuen beim alten element
	this-&gt;next = new_node;

	new_node-&gt;index = index;
	index++;
}

//! getter
template &lt;class T&gt;
T vector&lt;T&gt;::get_last()
{
	if(next-&gt;data != NULL)
		return *next-&gt;data;
}

template &lt;class T&gt;
T vector&lt;T&gt;::get_first()
{
	vector *old_pointer = next;

	while(true) {
		if(next-&gt;index == 0) {
			T data;
			if(next-&gt;data != NULL)
				data = *next-&gt;data;
			next = old_pointer;
			return data;
		}
		else {
			next = next-&gt;prev;
		}
	}
}

//! getter
template &lt;class T&gt;
T vector&lt;T&gt;::at(int ind)
{
	vector *old_pointer = next;

	if(ind &gt; index-1)
		return *next-&gt;data;
	if(ind &lt; 0)
		return get_at(0);

	while(true) {
		if(next-&gt;index == ind) {
			T data;
			if(next-&gt;data != NULL)
				data = *next-&gt;data;
			next = old_pointer;
			return data;
		}
		else {
			next = next-&gt;prev;
		}
	}
}

//! cleaner
template &lt;class T&gt;
void vector&lt;T&gt;::clear()
{
	vector *old_pointer = next;

	for(int i = 0; i &lt; index; i++) {
		old_pointer = next;
		next = next-&gt;prev;

		delete old_pointer;
	}
}

template &lt;class T&gt;
void vector&lt;T&gt;::removeAt(int ind)
{
	vector&lt;T&gt; *temp = new vector&lt;T&gt;;
	T buffer[index];

	for(int i = index-1; i &gt;= 0; i--) {
		T data = *next-&gt;data;
		buffer[i] = data;
		next = next-&gt;prev;
	}

	for(int i = 0; i &lt; index; i++) {
		if(i != ind) {
			temp-&gt;push_back(buffer[i]);
		}
	}

	next = temp-&gt;next;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1483205</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483205</guid><dc:creator><![CDATA[dgrat]]></dc:creator><pubDate>Sun, 30 Mar 2008 15:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Zeigern in einer verketteten Liste on Sun, 30 Mar 2008 15:51:51 GMT]]></title><description><![CDATA[<p>Also gute Listen gibt es hier im Forum bereits zur genüge. <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="😉"
    /> - Und auch wie man Iteratoren dazu schreibt. Musst nur danach suchen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483234</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 30 Mar 2008 15:51:51 GMT</pubDate></item></channel></rss>