<?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[LinkedList mit Node-Objekten]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich arbeite derzeit an der Entwicklung einer LinkedList, dafür verwende ich eine vordefinierte Node-Klasse die ein LinkedList Toolkit zur Verfügung stellt um die LinkedList entsprechend manipulieren zu können. (<a href="http://www.cs.colorado.edu/~main/chapter5/node1.h" rel="nofollow">http://www.cs.colorado.edu/~main/chapter5/node1.h</a>).<br />
Ich entwickle jetzt gerade eine Sequence-Klasse die eine Sequence von Zahlen in einer LinkedList speichern soll.</p>
<p>Mein header file der sequence Klasse bzw. deren methoden und variablen sieht so aus:</p>
<pre><code>public:
        // TYPEDEFS and MEMBER CONSTANTS
        typedef double value_type;
        typedef std::size_t size_type;
        // CONSTRUCTORS and DESTRUCTOR
        sequence( );
        sequence(const sequence&amp; source);
        ~sequence( );
        // MODIFICATION MEMBER FUNCTIONS
        void start( );
        void advance( );
        void insert(const value_type&amp; entry);
        void attach(const value_type&amp; entry);
        void operator =(const sequence&amp; source);
        void remove_current( );
        // CONSTANT MEMBER FUNCTIONS
        size_type size( ) const { return many_nodes; }
        bool is_item( ) const { return (cursor != NULL); }
        value_type current( ) const;
    private:
    node *head_ptr;
    node *tail_ptr;
    node *cursor;
    node *precursor;
    size_type many_nodes;
</code></pre>
<p>Ich habe bereits die zwei Konstruktoren, den Destructor und die advance und start-Methode implementiert:</p>
<pre><code>sequence::sequence()
{
    head_ptr = NULL;
    tail_ptr = NULL;
    many_nodes = 0;
}

sequence::sequence(const sequence&amp; source)
{
    node *tail_ptr;
    list_copy(source.head_ptr, head_ptr, tail_ptr);
    many_nodes = source.many_nodes;
}

sequence::~sequence()
{
    list_clear(head_ptr);
    many_nodes = 0;
}

void sequence::start()
{
    cursor = head_ptr;
}

void sequence::advance()
{
    cursor = cursor-&gt;link();
}
</code></pre>
<p>Ich hoffe, die stimmen so.<br />
Leider habe ich jetzt ein Problem bei der insert-Funktion. Entsprechend der Spezifikation sollte die insert-Funktion einen neuen Knoten vor dem Node-Objekt einfügen auf die der cursor pointer zeigt. Daher muss ich den precursor-pointer verwenden und dieser muss dann auf den Knoten vor dem, auf den der cursor-pointer zeigt, zeigen lassen. Leider ist mir nicht ganz klar, wie ich diese Position herausfinden kann...:((</p>
<p>Weiß vielleicht hier jemand, wie ich diese insert-Methode am effizientesten definieren kann..?:-/</p>
<p>matti</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/162444/linkedlist-mit-node-objekten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 06:59:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162444.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Oct 2006 15:36:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Wed, 18 Oct 2006 15:36:10 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich arbeite derzeit an der Entwicklung einer LinkedList, dafür verwende ich eine vordefinierte Node-Klasse die ein LinkedList Toolkit zur Verfügung stellt um die LinkedList entsprechend manipulieren zu können. (<a href="http://www.cs.colorado.edu/~main/chapter5/node1.h" rel="nofollow">http://www.cs.colorado.edu/~main/chapter5/node1.h</a>).<br />
Ich entwickle jetzt gerade eine Sequence-Klasse die eine Sequence von Zahlen in einer LinkedList speichern soll.</p>
<p>Mein header file der sequence Klasse bzw. deren methoden und variablen sieht so aus:</p>
<pre><code>public:
        // TYPEDEFS and MEMBER CONSTANTS
        typedef double value_type;
        typedef std::size_t size_type;
        // CONSTRUCTORS and DESTRUCTOR
        sequence( );
        sequence(const sequence&amp; source);
        ~sequence( );
        // MODIFICATION MEMBER FUNCTIONS
        void start( );
        void advance( );
        void insert(const value_type&amp; entry);
        void attach(const value_type&amp; entry);
        void operator =(const sequence&amp; source);
        void remove_current( );
        // CONSTANT MEMBER FUNCTIONS
        size_type size( ) const { return many_nodes; }
        bool is_item( ) const { return (cursor != NULL); }
        value_type current( ) const;
    private:
    node *head_ptr;
    node *tail_ptr;
    node *cursor;
    node *precursor;
    size_type many_nodes;
</code></pre>
<p>Ich habe bereits die zwei Konstruktoren, den Destructor und die advance und start-Methode implementiert:</p>
<pre><code>sequence::sequence()
{
    head_ptr = NULL;
    tail_ptr = NULL;
    many_nodes = 0;
}

sequence::sequence(const sequence&amp; source)
{
    node *tail_ptr;
    list_copy(source.head_ptr, head_ptr, tail_ptr);
    many_nodes = source.many_nodes;
}

sequence::~sequence()
{
    list_clear(head_ptr);
    many_nodes = 0;
}

void sequence::start()
{
    cursor = head_ptr;
}

void sequence::advance()
{
    cursor = cursor-&gt;link();
}
</code></pre>
<p>Ich hoffe, die stimmen so.<br />
Leider habe ich jetzt ein Problem bei der insert-Funktion. Entsprechend der Spezifikation sollte die insert-Funktion einen neuen Knoten vor dem Node-Objekt einfügen auf die der cursor pointer zeigt. Daher muss ich den precursor-pointer verwenden und dieser muss dann auf den Knoten vor dem, auf den der cursor-pointer zeigt, zeigen lassen. Leider ist mir nicht ganz klar, wie ich diese Position herausfinden kann...:((</p>
<p>Weiß vielleicht hier jemand, wie ich diese insert-Methode am effizientesten definieren kann..?:-/</p>
<p>matti</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157195</guid><dc:creator><![CDATA[mathon]]></dc:creator><pubDate>Wed, 18 Oct 2006 15:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Wed, 18 Oct 2006 20:06:33 GMT]]></title><description><![CDATA[<p>mathon schrieb:</p>
<blockquote>
<p>Leider habe ich jetzt ein Problem bei der insert-Funktion. Entsprechend der Spezifikation sollte die insert-Funktion einen neuen Knoten vor dem Node-Objekt einfügen auf die der cursor pointer zeigt. Daher muss ich den precursor-pointer verwenden und dieser muss dann auf den Knoten vor dem, auf den der cursor-pointer zeigt, zeigen lassen. Leider ist mir nicht ganz klar, wie ich diese Position herausfinden kann...:((</p>
</blockquote>
<p>Hallo Matti,</p>
<p>bist Du immer noch nicht fertig mit der Liste ...</p>
<p>Zu Deiner Frage: führe den Member 'precursor' in der advance-Methode mit. Also</p>
<pre><code class="language-cpp">void sequence::advance()
{
    precursor = cursor;
    cursor = cursor-&gt;link();
}
</code></pre>
<p>in der insert-Methode musst Du dann den Fall unterscheiden, ob cursor noch auf 'head_ptr' zeigt - dann list_head_insert() benutzen -, oder eben nicht - dann nimmst Du list_insert() und den 'precursor'. Alles klar?</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157309</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Wed, 18 Oct 2006 20:06:33 GMT</pubDate></item><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Thu, 19 Oct 2006 03:41:55 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ja leider bin noch immer dabei...:(</p>
<p>Habe jetzt mal insert und attach implementiert, soweit funktionieren sie auch nur leider gibt es beim testen noch immer fehler:</p>
<pre><code>void sequence::insert(const value_type&amp; entry)
{
	if(precursor == NULL)
	{
		list_head_insert(head_ptr, entry);
		cursor = head_ptr;
		tail_ptr = head_ptr;
	}
	else
	{
		list_insert(precursor, entry);
		cursor = precursor-&gt;link();
	}

    ++many_nodes;
} 

void sequence::attach(const value_type&amp; entry)
{
	if(cursor == NULL)
	{
		list_head_insert(head_ptr, entry);
		cursor = head_ptr;
		tail_ptr = head_ptr;
	}
	else
	{
		list_insert(cursor, entry);
		cursor = cursor-&gt;link();
	}

    ++many_nodes;

}
</code></pre>
<p>Sieht vielleicht jemand was an den beiden funktionen noch falsch ist...? das insert und attachen funktioniert soweit nur gibt es anscheinend noch probleme mit den boundary-testen.</p>
<p>matti</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157369</guid><dc:creator><![CDATA[mathon]]></dc:creator><pubDate>Thu, 19 Oct 2006 03:41:55 GMT</pubDate></item><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Thu, 19 Oct 2006 08:49:45 GMT]]></title><description><![CDATA[<p>mathon schrieb:</p>
<blockquote>
<p>Sieht vielleicht jemand was an den beiden funktionen noch falsch ist...? das insert und attachen funktioniert soweit nur gibt es anscheinend noch probleme mit den boundary-testen.</p>
</blockquote>
<p>Wenn du noch dazu sagst, wo du diese boundary-tests durchführst und wie sich die Fehler äußern, können wir dir eventuell weiterhelfen <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>
<p>PS: du hast hoffentlich die advance()-Methode so geändert, wie Werner gesagt hat.</p>
<p>PPS: Und vermutlich mußt du in der attach()-Methode auch den precursor nachziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157469</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 19 Oct 2006 08:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Thu, 19 Oct 2006 15:51:17 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>ja habe ich alles gemacht, ich habe mir das ganze auch ganz genau aufgezeichnet und meine Methoden sehen jetzt so aus:</p>
<pre><code>void sequence::start()
{
        cursor = head_ptr;
        precursor = 0;

}

void sequence::advance()
{
		if(is_item())
		{
			precursor = cursor;
			cursor = cursor-&gt;link(); 
		}

} 

void sequence::insert(const value_type&amp; entry)
{
	if(!(is_item()))
		cursor = head_ptr;

	if(precursor == NULL)
	{
		list_head_insert(head_ptr, entry);
		cursor = head_ptr;
		tail_ptr = head_ptr;
	}
	else
	{
		list_insert(precursor, entry);
		cursor = precursor-&gt;link();
	}

    ++many_nodes;

	node* cursor1;
	node * precursor1;
	for(cursor1 = head_ptr; cursor1 != NULL; cursor1 = cursor1-&gt;link())
	{
		precursor1 = cursor1;
	}
	tail_ptr = precursor1;
} 

void sequence::attach(const value_type&amp; entry)
{
	if(cursor == NULL)
	{
		list_head_insert(head_ptr, entry);
		cursor = head_ptr;
		tail_ptr = head_ptr;
	}
	else
	{
		list_insert(cursor, entry);
		cursor = cursor-&gt;link();
		precursor = cursor;
	}

    ++many_nodes;

	node* cursor1;
	node* precursor1;
	for(cursor1 = head_ptr; cursor1 != NULL; cursor1 = cursor1-&gt;link())
	{
		precursor1 = cursor1;
	}
	tail_ptr = precursor1;
}
void sequence::operator =(const sequence&amp; source)
{
	if(this == &amp;source)
		return;

	list_clear(head_ptr);
	many_nodes=0;
	list_copy(source.head_ptr, head_ptr, tail_ptr);
	many_nodes = source.many_nodes;
}
</code></pre>
<p>Ich habe habe bei insert und attach zum schluss immer eine for-schleife, damit der tail_ptr auch sicher immer auf den letzten Knoten zeigt. wenn ich es interaktiv teste funktioniert auch alles, aber wenn ich diesen test durchführe:</p>
<pre><code>int test1( )
{
    sequence empty;                            // An empty sequence
    sequence test;                             // A sequence to add items to
    double items1[4] = { 5, 10, 20, 30 };  // These 4 items are put in a sequence
    double items2[4] = { 10, 15, 20, 30 }; // These are put in another sequence

    // Test that the empty sequence is really empty
    cout &lt;&lt; &quot;Starting with an empty sequence.&quot; &lt;&lt; endl;
    if (!correct(empty, 0, 0, items1)) return 0;

    // Test the attach function to add something to an empty sequence
    cout &lt;&lt; &quot;I am now using attach to put 10 into an empty sequence.&quot; &lt;&lt; endl;
    test.attach(10);
    if (!correct(test, 1, 0, items2)) return 0;

    // Test the insert function to add something to an empty sequence
    cout &lt;&lt; &quot;I am now using insert to put 10 into an empty sequence.&quot; &lt;&lt; endl;
    test = empty;

    test.insert(10);

    if (!correct(test, 1, 0, items2)) return 0;

    // Test the insert function to add an item at the front of a sequence
    cout &lt;&lt; &quot;I am now using attach to put 10,20,30 in an empty sequence.\n&quot;;
    cout &lt;&lt; &quot;Then I move the cursor to the start and insert 5.&quot; &lt;&lt; endl;
    test = empty;
    test.attach(10);
    test.attach(20);
    test.attach(30);
    test.start( );
    test.insert(5);
    if (!correct(test, 4, 0, items1)) return 0;

    // Test the insert function to add an item in the middle of a sequence
    cout &lt;&lt; &quot;I am now using attach to put 10,20,30 in an empty sequence.\n&quot;;
    cout &lt;&lt; &quot;Then I move the cursor to the start, advance once, &quot;;
    cout &lt;&lt; &quot;and insert 15.&quot; &lt;&lt; endl;
    test = empty;
    test.attach(10);
    test.attach(20);
    test.attach(30);
    test.start( );
    test.advance( );
    test.insert(15);
    if (!correct(test, 4, 1, items2)) return 0;

    // Test the attach function to add an item in the middle of a sequence
    cout &lt;&lt; &quot;I am now using attach to put 10,20,30 in an empty sequence.\n&quot;;
    cout &lt;&lt; &quot;Then I move the cursor to the start and attach 15 &quot;;
    cout &lt;&lt; &quot;after the 10.&quot; &lt;&lt; endl;
    test = empty;
    test.attach(10);
    test.attach(20);
    test.attach(30);
    test.start( );
    test.attach(15);
    if (!correct(test, 4, 1, items2)) return 0;

    // All tests have been passed
    cout &lt;&lt; &quot;All tests of this first function have been passed.&quot; &lt;&lt; endl;
}
</code></pre>
<p>Doch bei diesem test.insert(10); in dem Abschnitt I am now using insert to put 10 in an empty sequence, stoppt das programm und es öffnet sich ein popup-fenster, dass das programm einen fehler festgestellt hat und beendet werden musste. ich habe auch versucht zu debuggen,aber ich komme einfach nicht auf den fehler drauf...? <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>
<p>lg matti</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157775</guid><dc:creator><![CDATA[mathon]]></dc:creator><pubDate>Thu, 19 Oct 2006 15:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to LinkedList mit Node-Objekten on Thu, 19 Oct 2006 20:27:44 GMT]]></title><description><![CDATA[<p>mathon schrieb:</p>
<blockquote>
<p>... ich habe auch versucht zu debuggen,aber ich komme einfach nicht auf den fehler drauf...?</p>
</blockquote>
<p>Hallo Matti,</p>
<p>DIE Fehler wäre richtig. <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 />
Bitte benutze ganz dringend Initialisierungslisten in Deinen Konstruktoren, dann vergisst man nicht so leicht die Member mit Default-Werten zu belegen. Wie auch <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-160634-and-highlight-is-.html" rel="nofollow">hier</a> schon erwähnt.</p>
<pre><code class="language-cpp">sequence::sequence()
    : head_ptr( 0 )
    , tail_ptr( 0 )
    , cursor( 0 )
    , precursor( 0 )
    , many_nodes( 0 )
{
}

sequence::sequence( const sequence&amp; source )  
    : head_ptr( 0 )
    , tail_ptr( 0 )
    , cursor( 0 )
    , precursor( 0 )
    , many_nodes( 0 )
{
    //node *tail_ptr; achte darauf keine lokalen Variblen mit gleichen Namen wie Member anzulegen!
    list_copy(source.head_ptr, head_ptr, tail_ptr);
    many_nodes = source.many_nodes;
    start(); // 'cursor' auf begin setzen
}
</code></pre>
<p>Du hast vergessen den 'cursor' zu initialisieren, deshalb geht insert immer schief, wenn vorher kein start() aufgerufen wurde.</p>
<p>Bei der insert-Methode sind drei Fälle zu unterscheiden.<br />
1.) der Cursor zeigt auf 'end' (auch bei Liste ist leer)<br />
2.) der Cursor zeigt auf den Anfang, dann ist precursor == 0<br />
3.) der Cursor zeigt irgendwo hin und precursor hat einen gültigen Wert</p>
<p>am Ende der Methode sollte der Cursor auf das zuletzt eingefügte Element zeigen. So ist es jedenfalls im C++-Standard. Das bedeutet auch, dass precursor in insert in keinem Fall verändert wird.</p>
<p>Bei der attach-Methode sind es nur zwei Fälle<br />
1.) Die Liste ist leer<br />
2.) sie ist nicht leer<br />
Hier wird der Cursor und auch precursor gar nicht verändert, es wird lediglich ein Element am Ende angehängt.<br />
Bei attach und insert kannst Du Dir die Schleife mit dem precursor sparen. Er sollte nach Aufruf jeder Funktion immer einen korrekten Wert haben.</p>
<p>Im Zuweisungsopertor hast Du vergessen, den Cursor umzusetzen. Am besten Du rufst dort start() auf.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1157951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1157951</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 19 Oct 2006 20:27:44 GMT</pubDate></item></channel></rss>