<?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[C++: Initialisierung eines DoubleLinkedList Arrays]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich sitze an meiner Computeranimations-Studienarbeit und möchte die Vertex-Koordinaten plus deren Abstand zur Oberfläche des Modells in einem Struct speichern, das wiederum zum schnellen Zugriff nach Hashingart in die Liste einer von den Koordinaten abhängigen Arrayzelle eingefügt werden soll.</p>
<p>Die Initialisierung sieht so aus:</p>
<p>dlist * vertices = new dlist[x*y*z]</p>
<p>wobei x, y, z die maximale Ausdehnung in x-,y-,z-Richtung ist.</p>
<p>Der Konstruktor der DoubleLinkedList-Klasse dlist setzt die Pointer auf erstes und letztes Element (Knoten) auf NULL:</p>
<pre><code>dlist::dlist()
{
this-&gt;front = NULL;
this-&gt;back = NULL;
}
</code></pre>
<p>Das Problem ist tritt auf, wenn ich einen Knoten bereits in die Liste einer Arrayzelle x (vertices[x]) eingefügt habe, und nun einen zweiten Knoten in eine ganz andere Arrayzelle y einfüge. Dann hat die enstsprechende Liste bereits einen front- und einen back-Pointer, der nicht auf NULL zeigt, und die beiden Pointer haben als next-Element auch noch sich gegenseitig, sodass ich beim Durchlaufen auf der Suche nach der passenden Einfügestelle (ordered list) in eine Endlosschleife gerate.</p>
<p>Die komplette Klasse dlist.cpp sieht folgendermaßen aus:</p>
<p>------------------------------------------------------------------</p>
<pre><code>#include &quot;dlist.h&quot;

dlist::dlist()
{
	front=NULL;
	back=NULL;
}

dlist::~dlist()
{
}

//insert a node before nodeB
void dlist::insertBefore(vertexPlus * value,node *nodeB)    
{
	node *newNode;
	newNode=new node();
	newNode-&gt;prev=nodeB-&gt;prev;
	newNode-&gt;next =nodeB;
	newNode-&gt;value =value;	
	if(nodeB-&gt;prev==NULL)
	{
		this-&gt;front=newNode;	
	}
	nodeB-&gt;prev=newNode;
	removeNode(newNode);

}

//insert a node before the front node 
void dlist::insertFront (vertexPlus * value)
{
	node *newNode;
	if(this-&gt;front==NULL)
	{
		newNode=new node();
		this-&gt;front=newNode;
		this-&gt;back =newNode;
		 newNode-&gt;prev=NULL;
		 newNode-&gt;next=NULL;
		 newNode-&gt;value=value;

	}
	else
	{
		 insertBefore(value,this-&gt;front );
	}
}

//insert a node after  nodeB
void dlist::insertAfter(vertexPlus * value,node *nodeB)
{
	node *newNode;
	newNode=new node();
	newNode-&gt;next= nodeB-&gt;next ;
	newNode-&gt;prev  =nodeB;
	newNode-&gt;value =value;

	if(nodeB-&gt;next==NULL)
	{
		this-&gt;back =newNode;	
	}

	nodeB-&gt;next=newNode;
}

//insert a node after the last node 
void dlist::insertBack (vertexPlus * value)
{          
		if(this-&gt;back==NULL)
		{
			insertFront(value);
		}
		else
		{
			insertAfter(value,this-&gt;back  );
		}
}

void dlist::insert( vertexPlus * value)
{
	node * currentNode;
	currentNode = this-&gt;front;

	if( currentNode == NULL )
	{
		insertFront(value);
	}
	else
	{
		while( currentNode != NULL )
		{
			// If vertex already exists, return
			if( currentNode-&gt;value-&gt;coord == value-&gt;coord )
				return;
			else if( currentNode-&gt;value-&gt;coord &gt; value-&gt;coord )
			{
				insertBefore(value, currentNode );
				return;
			}
			currentNode = currentNode-&gt;next;
		}
		insertBack(value);
	}

	return;
}

bool dlist::find( vertexPlus * value)
{

	node * currentNode;
	currentNode = this-&gt;front;

	if( currentNode == NULL )
	{
		return false;
	}
	else
	{
		while( currentNode != NULL )
		{
			if( currentNode-&gt;value-&gt;coord == value-&gt;coord )
				return true;
			currentNode = currentNode-&gt;next;
		}
		return false;
	}
}
</code></pre>
<p>und der relevante Part von der Headerdatei:</p>
<pre><code>class node
{
public:
vertexPlus * value;           //value stored in the node 
node *next;          //pointer to next node 
node *prev;          //pointer to previous node 
};

class dlist
{
public:

dlist();
~dlist();

node *front;       //pointer to front of list   
node *back;        //pointer to back of list  
..
.
};
</code></pre>
<p>---------------------------------------------------------------------------</p>
<p>wobei hier im ersten Aufruf erst find() false ausgibt und dann insert() und in dessen Konsequenz insertFront() aufgerufen wird. Im zweiten Aufruf geht find() in die Endlosschleife, weil die Liste unerklärlicherweise nicht leer ist, und der currentNode-Pointer zwischen this-&gt;front und this-&gt;back springt.</p>
<p>Hat es was mit der Initialisierung des Arrays zu tun? Kann bei der Initialisierung von this-&gt;front und this-&gt;back mit NULL auch sowas unerklärliches rauskommen?</p>
<p>Bin für jede Idee dankbar. Grüßle</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202421/c-initialisierung-eines-doublelinkedlist-arrays</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 16:58:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202421.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Jan 2008 12:44:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++: Initialisierung eines DoubleLinkedList Arrays on Fri, 11 Jan 2008 12:44:48 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich sitze an meiner Computeranimations-Studienarbeit und möchte die Vertex-Koordinaten plus deren Abstand zur Oberfläche des Modells in einem Struct speichern, das wiederum zum schnellen Zugriff nach Hashingart in die Liste einer von den Koordinaten abhängigen Arrayzelle eingefügt werden soll.</p>
<p>Die Initialisierung sieht so aus:</p>
<p>dlist * vertices = new dlist[x*y*z]</p>
<p>wobei x, y, z die maximale Ausdehnung in x-,y-,z-Richtung ist.</p>
<p>Der Konstruktor der DoubleLinkedList-Klasse dlist setzt die Pointer auf erstes und letztes Element (Knoten) auf NULL:</p>
<pre><code>dlist::dlist()
{
this-&gt;front = NULL;
this-&gt;back = NULL;
}
</code></pre>
<p>Das Problem ist tritt auf, wenn ich einen Knoten bereits in die Liste einer Arrayzelle x (vertices[x]) eingefügt habe, und nun einen zweiten Knoten in eine ganz andere Arrayzelle y einfüge. Dann hat die enstsprechende Liste bereits einen front- und einen back-Pointer, der nicht auf NULL zeigt, und die beiden Pointer haben als next-Element auch noch sich gegenseitig, sodass ich beim Durchlaufen auf der Suche nach der passenden Einfügestelle (ordered list) in eine Endlosschleife gerate.</p>
<p>Die komplette Klasse dlist.cpp sieht folgendermaßen aus:</p>
<p>------------------------------------------------------------------</p>
<pre><code>#include &quot;dlist.h&quot;

dlist::dlist()
{
	front=NULL;
	back=NULL;
}

dlist::~dlist()
{
}

//insert a node before nodeB
void dlist::insertBefore(vertexPlus * value,node *nodeB)    
{
	node *newNode;
	newNode=new node();
	newNode-&gt;prev=nodeB-&gt;prev;
	newNode-&gt;next =nodeB;
	newNode-&gt;value =value;	
	if(nodeB-&gt;prev==NULL)
	{
		this-&gt;front=newNode;	
	}
	nodeB-&gt;prev=newNode;
	removeNode(newNode);

}

//insert a node before the front node 
void dlist::insertFront (vertexPlus * value)
{
	node *newNode;
	if(this-&gt;front==NULL)
	{
		newNode=new node();
		this-&gt;front=newNode;
		this-&gt;back =newNode;
		 newNode-&gt;prev=NULL;
		 newNode-&gt;next=NULL;
		 newNode-&gt;value=value;

	}
	else
	{
		 insertBefore(value,this-&gt;front );
	}
}

//insert a node after  nodeB
void dlist::insertAfter(vertexPlus * value,node *nodeB)
{
	node *newNode;
	newNode=new node();
	newNode-&gt;next= nodeB-&gt;next ;
	newNode-&gt;prev  =nodeB;
	newNode-&gt;value =value;

	if(nodeB-&gt;next==NULL)
	{
		this-&gt;back =newNode;	
	}

	nodeB-&gt;next=newNode;
}

//insert a node after the last node 
void dlist::insertBack (vertexPlus * value)
{          
		if(this-&gt;back==NULL)
		{
			insertFront(value);
		}
		else
		{
			insertAfter(value,this-&gt;back  );
		}
}

void dlist::insert( vertexPlus * value)
{
	node * currentNode;
	currentNode = this-&gt;front;

	if( currentNode == NULL )
	{
		insertFront(value);
	}
	else
	{
		while( currentNode != NULL )
		{
			// If vertex already exists, return
			if( currentNode-&gt;value-&gt;coord == value-&gt;coord )
				return;
			else if( currentNode-&gt;value-&gt;coord &gt; value-&gt;coord )
			{
				insertBefore(value, currentNode );
				return;
			}
			currentNode = currentNode-&gt;next;
		}
		insertBack(value);
	}

	return;
}

bool dlist::find( vertexPlus * value)
{

	node * currentNode;
	currentNode = this-&gt;front;

	if( currentNode == NULL )
	{
		return false;
	}
	else
	{
		while( currentNode != NULL )
		{
			if( currentNode-&gt;value-&gt;coord == value-&gt;coord )
				return true;
			currentNode = currentNode-&gt;next;
		}
		return false;
	}
}
</code></pre>
<p>und der relevante Part von der Headerdatei:</p>
<pre><code>class node
{
public:
vertexPlus * value;           //value stored in the node 
node *next;          //pointer to next node 
node *prev;          //pointer to previous node 
};

class dlist
{
public:

dlist();
~dlist();

node *front;       //pointer to front of list   
node *back;        //pointer to back of list  
..
.
};
</code></pre>
<p>---------------------------------------------------------------------------</p>
<p>wobei hier im ersten Aufruf erst find() false ausgibt und dann insert() und in dessen Konsequenz insertFront() aufgerufen wird. Im zweiten Aufruf geht find() in die Endlosschleife, weil die Liste unerklärlicherweise nicht leer ist, und der currentNode-Pointer zwischen this-&gt;front und this-&gt;back springt.</p>
<p>Hat es was mit der Initialisierung des Arrays zu tun? Kann bei der Initialisierung von this-&gt;front und this-&gt;back mit NULL auch sowas unerklärliches rauskommen?</p>
<p>Bin für jede Idee dankbar. Grüßle</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434846</guid><dc:creator><![CDATA[jiriki]]></dc:creator><pubDate>Fri, 11 Jan 2008 12:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++: Initialisierung eines DoubleLinkedList Arrays on Fri, 11 Jan 2008 15:33:19 GMT]]></title><description><![CDATA[<p>Warum nutzt du denn nicht die Standard-Klasse 'std::list' aus &lt;list&gt;?<br />
Dann würden dir auch keine solchen Zeiger Probleme bereiten.</p>
<p>Ansonsten jede Funktion einzeln debuggen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434960</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 11 Jan 2008 15:33:19 GMT</pubDate></item></channel></rss>