<?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[einfache verkette liste]]></title><description><![CDATA[<p>hallo,<br />
ich muss eine einfache verkette liste zu einer doppelten verketten liste machen<br />
benutz den borland c++ 6pro</p>
<p>beim rückwärstausgeben muss ich ja zuerst das letzte element ausfindig machen<br />
d.h. next = NULL<br />
und dann die liste rückwärst ausgeben (richtig???)<br />
d.h. next = last und von last bis listenanfang</p>
<p>danke für die hilfe...</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;

struct listenelement {
    char daten[30];
    listenelement* next;
    listenelement* last;
};

listenelement* listenanfang;
listenelement* hilfszeiger;
listenelement* listenende;

void einfuegen(char datenneu[30]) {
    hilfszeiger = listenanfang;
    while (hilfszeiger-&gt;next != NULL) {
       hilfszeiger = hilfszeiger-&gt;next;
    }
    hilfszeiger-&gt;next = new(listenelement);
    hilfszeiger = hilfszeiger-&gt;next;
    strcpy(hilfszeiger-&gt;daten,datenneu);
    hilfszeiger-&gt;next = NULL;
}

// nichts ändern
void ausgeben() {
    hilfszeiger = listenanfang;
    cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    while (hilfszeiger-&gt; next != NULL) {
        hilfszeiger = hilfszeiger-&gt;next;
        cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    }
}

void init() {
    listenanfang= new(listenelement);
    listenanfang-&gt;next = NULL;
    strcpy(listenanfang-&gt;daten, &quot;Element 0&quot;);
}

void ende() {
    while (listenanfang != NULL) {
        hilfszeiger = listenanfang;
        listenanfang = listenanfang-&gt;next;
        delete(hilfszeiger);
    }
}

void ausgaberueckwaerts() {
    hilfszeiger = listenanfang;
    while (hilfszeiger-&gt; next != NULL) {
        hilfszeiger = hilfszeiger-&gt;next;
    }
}
// nichts ändern
void main() {
        init();
        einfuegen(&quot;element 1&quot;);
        einfuegen(&quot;element 2&quot;);
        ausgeben();
        ausgaberueckwaerts();
        ende();

char p[50];
cin.getline(p,50);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/186884/einfache-verkette-liste</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 12:49:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186884.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 13 Jul 2007 11:23:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 11:23:44 GMT]]></title><description><![CDATA[<p>hallo,<br />
ich muss eine einfache verkette liste zu einer doppelten verketten liste machen<br />
benutz den borland c++ 6pro</p>
<p>beim rückwärstausgeben muss ich ja zuerst das letzte element ausfindig machen<br />
d.h. next = NULL<br />
und dann die liste rückwärst ausgeben (richtig???)<br />
d.h. next = last und von last bis listenanfang</p>
<p>danke für die hilfe...</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;

struct listenelement {
    char daten[30];
    listenelement* next;
    listenelement* last;
};

listenelement* listenanfang;
listenelement* hilfszeiger;
listenelement* listenende;

void einfuegen(char datenneu[30]) {
    hilfszeiger = listenanfang;
    while (hilfszeiger-&gt;next != NULL) {
       hilfszeiger = hilfszeiger-&gt;next;
    }
    hilfszeiger-&gt;next = new(listenelement);
    hilfszeiger = hilfszeiger-&gt;next;
    strcpy(hilfszeiger-&gt;daten,datenneu);
    hilfszeiger-&gt;next = NULL;
}

// nichts ändern
void ausgeben() {
    hilfszeiger = listenanfang;
    cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    while (hilfszeiger-&gt; next != NULL) {
        hilfszeiger = hilfszeiger-&gt;next;
        cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    }
}

void init() {
    listenanfang= new(listenelement);
    listenanfang-&gt;next = NULL;
    strcpy(listenanfang-&gt;daten, &quot;Element 0&quot;);
}

void ende() {
    while (listenanfang != NULL) {
        hilfszeiger = listenanfang;
        listenanfang = listenanfang-&gt;next;
        delete(hilfszeiger);
    }
}

void ausgaberueckwaerts() {
    hilfszeiger = listenanfang;
    while (hilfszeiger-&gt; next != NULL) {
        hilfszeiger = hilfszeiger-&gt;next;
    }
}
// nichts ändern
void main() {
        init();
        einfuegen(&quot;element 1&quot;);
        einfuegen(&quot;element 2&quot;);
        ausgeben();
        ausgaberueckwaerts();
        ende();

char p[50];
cin.getline(p,50);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1324586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324586</guid><dc:creator><![CDATA[dietzmxi]]></dc:creator><pubDate>Fri, 13 Jul 2007 11:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 11:30:22 GMT]]></title><description><![CDATA[<p>Und jetzt bitte auf Deutsch: Wo ist dein Problem? Du hast doch schon einen Zeiger 'listenende' definiert, den du beim Einfügen und Löschen von Elementen auch aktualisieren solltest, wenn es erforderlich ist. Damit kommst du sofort an das letzte Element und kannst dich dann entlang der last-Zeiger vorhangeln bis zu Listenanfang (der z.B. durch last==NULL gekennzeichnet werden kann).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324590</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 13 Jul 2007 11:30:22 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 11:43:15 GMT]]></title><description><![CDATA[<p>hats du den sinn einer doppelt verketten liste verstanden?</p>
<p>in einer einfachverketten liste, zeigen die elemente ja ommer auf ihren nächsten (rechten) bruder. Bei einer doppelt verketten liste zeigen alle elemetne jeweil auf ihr nächsten und vorhigen (linken/ und rechten ) bruder</p>
<pre><code class="language-cpp">class element{

 element *pNext; //Rechter bruder
 element *pPref; //Linker bruder

 //DATA

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1324601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324601</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 13 Jul 2007 11:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 11:45:21 GMT]]></title><description><![CDATA[<p>ok mein problem ist wie akutalisier ich den zeiger in der funktion einfügen?</p>
<p>mein code guckt grade so aus. blos das ja totaler misst...</p>
<pre><code class="language-cpp">#include&lt;iostream.h&gt;

struct listenelement {
    char daten[30];
    listenelement* next;
    listenelement* last;
};

listenelement* listenanfang;
listenelement* hilfszeiger;
listenelement* listenende;

void einfuegen(char datenneu[30]) {
    hilfszeiger = listenanfang;

    while (hilfszeiger-&gt;next != NULL) {
       hilfszeiger = hilfszeiger-&gt;next;
    }

    hilfszeiger-&gt;next = new(listenelement);
    listenende = hilfszeiger;
    hilfszeiger = hilfszeiger-&gt;next;

    strcpy(hilfszeiger-&gt;daten,datenneu);
    hilfszeiger-&gt;next = NULL;
    hilfszeiger-&gt;last = listenende;
    listenende = hilfszeiger;
    }

// nichts ändern
void ausgeben() {
    hilfszeiger = listenanfang;
    cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    while (hilfszeiger-&gt; next != NULL) {
        hilfszeiger = hilfszeiger-&gt;next;
        cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; &quot;\n&quot;;
    }
}

void init() {
    listenanfang= new(listenelement);
    listenanfang-&gt;next = NULL;
    listenanfang-&gt;last = NULL;
    listenende = listenanfang;
    strcpy(listenanfang-&gt;daten, &quot;Element 0&quot;);
}

void ende() {
    while (listenanfang != NULL) {
        hilfszeiger = listenanfang;
        listenanfang = listenanfang-&gt;next;
        delete(hilfszeiger);
    }
}

void ausgaberueckwaerts() {
    hilfszeiger = listenanfang;
    while (hilfszeiger-&gt;last != NULL) {
        hilfszeiger = hilfszeiger-&gt;last;
    cout &lt;&lt; hilfszeiger-&gt;daten &lt;&lt; endl;
    }
}
// nichts ändern
void main() {
        init();
        einfuegen(&quot;element 1&quot;);
        einfuegen(&quot;element 2&quot;);
        ausgeben();
        ausgaberueckwaerts();
        ende();

char p[50];
cin.getline(p,50);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1324604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324604</guid><dc:creator><![CDATA[dietzmxi]]></dc:creator><pubDate>Fri, 13 Jul 2007 11:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 11:55:45 GMT]]></title><description><![CDATA[<p>Mein Vorschlag: Zeichne es dir auf, dann siehst du leichter, welcher Zeiger wohin gebogen werden muß:</p>
<pre><code>...&lt;-- El     x- El
   --&gt; alt-x     neu -x
        ^
last ---+

...&lt;-- El &lt;-- El
   --&gt; alt--&gt; neu-x
               ^
last ----------+
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1324616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324616</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 13 Jul 2007 11:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 12:01:45 GMT]]></title><description><![CDATA[<p>absolut, zeichne es dir auf.. <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="😉"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> Ich weis wovon ich spreche;)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324621</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 13 Jul 2007 12:01:45 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 13:00:56 GMT]]></title><description><![CDATA[<p>Hier mal sowas wie nen grafisches Tutorial für einfach verkette Listen.<br />
Musste ich mal für die Klasse vorbereiten. Ist zwar nicht so gut, wenn ich nicht dazu referiere aber egal <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 />
<a href="http://www.livetip.de/data/list.htm" rel="nofollow">http://www.livetip.de/data/list.htm</a></p>
<p>Edit: In ne html Datei eingebetet, damit man nicht die Datei runterladen muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324660</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 13 Jul 2007 13:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 15:34:21 GMT]]></title><description><![CDATA[<p>Ich finde den Code des Threaderstellers furchtbar. Furchtbar, weil er globale Variablen benutzt, char-Arrays mit festen Längen benutzt und weil es reiner C-Code ist, und das im C++-Forum vorstellt wo C++ doch alle Möglichkeiten hat, diese Nachteile aus dem Weg zu räumen.<br />
Ich find's auch deshalb furchtbar, weil ich genau diesen Code hier mindestens schon drei mal gesehen habe - der scheint irgendwo in einem Lehrbuch zu stehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>Das ist die gleiche einfach verkette Liste in C++ implementiert (jedenfalls nach meiner unbedeutenden Meinung):</p>
<pre><code class="language-cpp">// SList.h
template&lt; typename T &gt;
class SList
{
public:
    typedef T value_type;

private:
    class Node  // Listenelement
    {
    public:
        explicit Node( const value_type&amp; x, Node* next = 0 )
            : m_next( next )
            , m_value( x )
        {}
        Node* m_next;
        value_type m_value;
    };

public:
    SList()     // ersetzt das init()
        : m_kopf( value_type() )
        , m_ende( &amp;m_kopf )
    {}
    ~SList() { clear(); } // immer schön wieder aufräumen

    void push_back( const value_type&amp; x ) // ersetzt das einfuegen() was ein anhaengen() ist
    {
        m_ende-&gt;m_next = new Node( x );
        m_ende = m_ende-&gt;m_next;
    }

    void clear() // ersetzt das ende()
    {
        for( Node* p = m_kopf.m_next; p; )
        {
            Node* tmp = p;
            p = p-&gt;m_next;
            delete tmp;
        }
        m_kopf.m_next = 0;
        m_ende = &amp;m_kopf;
    }

    // --   Ausgabe
    std::ostream&amp; ausgeben( std::ostream&amp; out, const char* delim = &quot;&quot; )
    {
        for( Node* p = m_kopf.m_next; p; p = p-&gt;m_next )
        {
            out &lt;&lt; p-&gt;m_value &lt;&lt; delim;
        }
        return out;
    }

private:
    // Kopieren z.Zt. nicht vorgesehen; -&gt; &quot;Regel der drei&quot;
    SList( const SList&amp; );
    SList&amp; operator=( const SList&amp; );

    // --   Member
    Node m_kopf;
    Node* m_ende;
};
</code></pre>
<p>.. und wer nicht weiß was ein Template ist, ok kein Problem; der lassen die Zeile mit dem 'template' einfach weg und ersetze das T bei typedef durch den Typ seiner Wahl (z.B. int oder std::string)</p>
<p>und das gleiche nochmal mit der doppelten Verkettung:</p>
<pre><code class="language-cpp">// DList.h
class DList
{
public:
    typedef T value_type;

private:
    class Node  // Listenelement
    {
    public:
        explicit Node( const value_type&amp; x, Node* prev, Node* next )
            : m_next( next )
            , m_prev( prev )
            , m_value( x )
        {}
        Node* m_next;
        Node* m_prev;
        value_type m_value;
    };

public:
    DList()     // ersetzt das init()
        : m_kopf( value_type(), &amp;m_kopf, &amp;m_kopf )
    {}
    ~DList() { clear(); }

    void push_back( const value_type&amp; x ) // ersetzt das einfuegen() was ein anhängen ist
    {
        m_kopf.m_prev-&gt;m_next = new Node( x, m_kopf.m_prev, &amp;m_kopf );
        m_kopf.m_prev = m_kopf.m_prev-&gt;m_next;
    }

    void clear() // ersetzt das ende()
    {
        for( Node* p = m_kopf.m_next; p != &amp;m_kopf; )
        {
            Node* tmp = p;
            p = p-&gt;m_next;
            delete tmp;
        }
        m_kopf.m_next = &amp;m_kopf;
        m_kopf.m_prev = &amp;m_kopf;
    }

    // --   Ausgabe
    std::ostream&amp; ausgeben( std::ostream&amp; out, const char* delim = &quot;&quot; )
    {
        for( Node* p = m_kopf.m_next; p != &amp;m_kopf; p = p-&gt;m_next )
        {
            out &lt;&lt; p-&gt;m_value &lt;&lt; delim;
        }
        return out;
    }
    std::ostream&amp; ausgaberueckwaerts( std::ostream&amp; out, const char* delim = &quot;&quot; )
    {
        for( Node* p = m_kopf.m_prev; p != &amp;m_kopf; p = p-&gt;m_prev )
        {
            out &lt;&lt; p-&gt;m_value &lt;&lt; delim;
        }
        return out;
    }

private:
    // Kopieren z.Zt. nicht vorgesehen; -&gt; &quot;Regel der drei&quot;
    DList( const DList&amp; );
    DList&amp; operator=( const DList&amp; );

    // --   Member
    Node m_kopf;
};
</code></pre>
<p>und das main dazu</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;

#include &quot;DList.h&quot;

int main()
{
    using namespace std;
    DList&lt; string &gt; l;
    l.push_back( &quot;Hello&quot; );
    l.push_back( &quot;World&quot; );
    l.ausgeben( cout, &quot; &quot; ) &lt;&lt; endl;
    l.ausgaberueckwaerts( cout, &quot; &quot; ) &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>und schlussendlich halte ich es immer noch für wichtiger, dass ein Anfänger lernt std::list&lt;&gt; anzuwenden, bevor er lernt eine Liste selber zu programmieren.</p>
<p>KasF schrieb:</p>
<blockquote>
<p>Hier mal sowas wie nen grafisches Tutorial für einfach verkette Listen.<br />
Musste ich mal für die Klasse vorbereiten. Ist zwar nicht so gut, wenn ich nicht dazu referiere aber egal <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 />
<a href="http://www.livetip.de/data/list.htm" rel="nofollow">http://www.livetip.de/data/list.htm</a></p>
</blockquote>
<p>das finde ich richtig gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> . Wenn Du noch Initialisierungslisten nutzen würdest und die Regel der drei einbaust (Kopy-ctor und Assignment-operator) dann wär's perfekt.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324772</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 13 Jul 2007 15:34:21 GMT</pubDate></item><item><title><![CDATA[Reply to einfache verkette liste on Fri, 13 Jul 2007 15:53:32 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>das finde ich richtig gut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> . Wenn Du noch Initialisierungslisten nutzen würdest und die Regel der drei einbaust (Kopy-ctor und Assignment-operator) dann wär's perfekt.</p>
</blockquote>
<p>Danke. Vielleicht erweitere ich es mal irgendwann. Mein Lehrer hatte schon genug Probleme der Klasse ne verkette Liste in den Kopf zu setzen, da wären Initialisierungsliste, Templates, Regel der drei etc. der Tod der Schüler <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/1324786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324786</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 13 Jul 2007 15:53:32 GMT</pubDate></item></channel></rss>