<?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[Verkettete Listen ein Anfang]]></title><description><![CDATA[<p>Hallo also ich arbeite mich grad in Verkette Listen ein. Und Wollte eine Liste mit 4 Werten erstellen. Vorname, Nachname, Alter und Matrikelnummer.</p>
<p>Ich habe aber das Konzept nicht ganz verstanden glaube ich. Deshalb habe ich 3 Fragen die Nummeriert sind gestellt.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

struct liste {//Eine struct variable mit dem Namen &quot;datei&quot; wird erstellt
	char vnam[30];//Vorname	
	char nnam[30];//Nachname
	int alt;//Alter
	int matr;//Matrikelnummer
	struct datei *next;//Zeiger auf das nächste Element der Liste
}
struct liste *anker;//1. Verstehe nicht wass das macht. Es wird ein Zeiger auf einen Typ liste erstellt der aber auf NULL zeigt weil da noch kein Speicherplatz ist.
//Dies macht man global damit man von überall drauf zugreifen kann ohne es jedes mal an die Funktion zu übergeben. Oder?

void anhang (struct liste *anker) //Funktion zum anhängen es wird der anker übergeben
{
	int alter=0,matrnr=0; 
	char vorname[30],nachname[30];
	struct liste *zgr, *hzgr; //zwei Zeiger vom Typ struct
	zgr=anker; //aufs erste Element
	while(zgr-&gt;next!= NULL)//2.zgr zeigt jetzt auf das erste Element. So dass zgr-&gt;next auf den Zeiger zeigt der auf das nächste Element zeigt. 
		zgr=zgr-&gt;next;//Solange der Zeiger nicht NULL ist (also danach nichts mehr kommt, ende der Liste) wird zgr zum next Zeiger.
	hzgr=malloc(sizeof(struct element));//Speicherplatz für neues Element

}

int main()
{
	anker=malloc(sizeof(struct liste));//3. Hier wird jetzt auch der Speicherplatz allociert und zugewiesen so das nach dem anker jetzt auch ein element ist.
	anhang(anker);

	printf(&quot;world\n&quot;);
	getchar();
	return 0;
}
</code></pre>
<p>Wie man sehen kann bin ich grad dabei die Funktion Anhang zu schreiben damit ein neues Listenelement angehägt wird und man es dann mit Daten füllen kann.</p>
<p>Dazu habe ich jetzt das Problem wie ich denn am besten die Daten reinschreibe die von der Tastatur eingegeben werden sollen.</p>
<p>würde folgendes gehen?</p>
<pre><code class="language-cpp">scanf(&quot;%s&quot;,hzgr-&gt;vnam);
</code></pre>
<p>Außerdem habe ich gelesen das scanf ne scheiß Funktion ist da man über das Array hinausschreiben kann weil die Länge der Eingabe nicht geprüft ist. Was wäre denn eine bessere Funktion? Bitte nur Betriebsystemunabhängig wenns so etwas gibt. Und dann wäre natürlich cool wenn ihr die Funktion die ihr nennt erklärt oder nen Link zu ner guten Quelle gebt <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="🙂"
    /> Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308388/verkettete-listen-ein-anfang</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 15:53:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308388.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Sep 2012 15:03:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 15:03:57 GMT]]></title><description><![CDATA[<p>Hallo also ich arbeite mich grad in Verkette Listen ein. Und Wollte eine Liste mit 4 Werten erstellen. Vorname, Nachname, Alter und Matrikelnummer.</p>
<p>Ich habe aber das Konzept nicht ganz verstanden glaube ich. Deshalb habe ich 3 Fragen die Nummeriert sind gestellt.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;

struct liste {//Eine struct variable mit dem Namen &quot;datei&quot; wird erstellt
	char vnam[30];//Vorname	
	char nnam[30];//Nachname
	int alt;//Alter
	int matr;//Matrikelnummer
	struct datei *next;//Zeiger auf das nächste Element der Liste
}
struct liste *anker;//1. Verstehe nicht wass das macht. Es wird ein Zeiger auf einen Typ liste erstellt der aber auf NULL zeigt weil da noch kein Speicherplatz ist.
//Dies macht man global damit man von überall drauf zugreifen kann ohne es jedes mal an die Funktion zu übergeben. Oder?

void anhang (struct liste *anker) //Funktion zum anhängen es wird der anker übergeben
{
	int alter=0,matrnr=0; 
	char vorname[30],nachname[30];
	struct liste *zgr, *hzgr; //zwei Zeiger vom Typ struct
	zgr=anker; //aufs erste Element
	while(zgr-&gt;next!= NULL)//2.zgr zeigt jetzt auf das erste Element. So dass zgr-&gt;next auf den Zeiger zeigt der auf das nächste Element zeigt. 
		zgr=zgr-&gt;next;//Solange der Zeiger nicht NULL ist (also danach nichts mehr kommt, ende der Liste) wird zgr zum next Zeiger.
	hzgr=malloc(sizeof(struct element));//Speicherplatz für neues Element

}

int main()
{
	anker=malloc(sizeof(struct liste));//3. Hier wird jetzt auch der Speicherplatz allociert und zugewiesen so das nach dem anker jetzt auch ein element ist.
	anhang(anker);

	printf(&quot;world\n&quot;);
	getchar();
	return 0;
}
</code></pre>
<p>Wie man sehen kann bin ich grad dabei die Funktion Anhang zu schreiben damit ein neues Listenelement angehägt wird und man es dann mit Daten füllen kann.</p>
<p>Dazu habe ich jetzt das Problem wie ich denn am besten die Daten reinschreibe die von der Tastatur eingegeben werden sollen.</p>
<p>würde folgendes gehen?</p>
<pre><code class="language-cpp">scanf(&quot;%s&quot;,hzgr-&gt;vnam);
</code></pre>
<p>Außerdem habe ich gelesen das scanf ne scheiß Funktion ist da man über das Array hinausschreiben kann weil die Länge der Eingabe nicht geprüft ist. Was wäre denn eine bessere Funktion? Bitte nur Betriebsystemunabhängig wenns so etwas gibt. Und dann wäre natürlich cool wenn ihr die Funktion die ihr nennt erklärt oder nen Link zu ner guten Quelle gebt <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="🙂"
    /> Danke schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253745</guid><dc:creator><![CDATA[Odatas]]></dc:creator><pubDate>Sun, 23 Sep 2012 15:03:57 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 15:58:29 GMT]]></title><description><![CDATA[<p>Zu 1.:<br />
Du musst dir merken, wo die Liste anfängt, sonst gehen dir Elemente verloren, da du ja nur den Nachfolger kennst.<br />
Es muss nicht global sein. Es ist sogar besser, wenn du es jedesmal an deine Funktionen mit übergibst.</p>
<p>Zu 2.:<br />
Es ist blöd, die lokale Variable genau so zu nennen wie dein Listenanfang.<br />
Du hast dann nämlich keinen Zugriff auf das globale anker.</p>
<p>Es kann auch sein das zgr schon NULL ist. Dann hast du bei zgr-&gt;next Probleme.</p>
<p>Deine Funktionen sollten auch einen sinnvollen Rückgabewert haben.<br />
z.B den Wert vom ersten Listenelement.</p>
<p>Du besorgst z.Zt Speicher in main und benutzt ihn nicht. (Zeile 32)<br />
Du solltest zumindest nach der Speicheranforderung das next-Element initialisieren (mit NULL)</p>
<p>Verkettete Listen funktionieren so wie Schnitzeljagd.<br />
Dir wird gesagt wo du anfängst (dein anker), und an dem Ort findest du einen Hinweis, wo es weitergeht (next), und an dem Ort .....</p>
<p>Und den Speicher den du mit malloc angefordert hast, musst du auch wieder freigeben.</p>
<p>malloc kann auch mal schief laufen und gibt dann NULL zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253759</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Sun, 23 Sep 2012 15:58:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 16:22:15 GMT]]></title><description><![CDATA[<p>So dann hier das neue Kunstwerk. Aber wie du schon sagtes macht die While schleife Probleme.</p>
<p>Ich habe mal Dummyhaft für das erste Element schon in der Main Funktion die Eingabe machen lassen. So das der erste nicht frei bleibt.</p>
<p>Woran liegt den das Problem in der While schleife? Eigentlich sage ich doch nur er soll immer wieder das next vom nächsten Element bekommen wenn es noch ein nächstes Element gibt.</p>
<p>Auch die If schleife davor kann vor dem Problem nicht zu bewahren.</p>
<pre><code class="language-cpp">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

struct liste {//Eine struct variable mit dem Namen &quot;liste&quot; wird erstellt
	char vnam[30];//Vorname	
	char nnam[30];//Nachname
	int alt;//Alter
	int matr;//Matrikelnummer
	struct liste *next;//Zeiger auf das nächste Element der Liste
};

void anhang (struct liste *anker) //Funktion zum anhängen es wird der anker übergeben
{

	struct liste *zgr, *hzgr; //zwei Zeiger vom Typ struct
	zgr=anker; //aufs erste Element
	if (zgr-&gt;next!=NULL)//PROBLEM MIT DER IF ABFRAGE
	{
		while(zgr-&gt;next!= NULL)//PROBLEM MIT DER SCHLEIFE
		zgr=zgr-&gt;next;
	}

	hzgr=malloc(sizeof(struct liste));//Speicherplatz für neues Element
	if (hzgr==NULL)
	{
		printf(&quot;\nFehler bei der Speicher allocierung in der Funktion: Anhang&quot;);
		getchar();
		return ;
	}
	printf(&quot;\nBitte Vorname eingeben:&quot;);//Eingabe aller Daten.
	scanf(&quot;%s&quot;,hzgr-&gt;vnam);
	printf(&quot;\nBitte nachnamen eingeben:&quot;);
	scanf(&quot;\n%s&quot;,hzgr-&gt;nnam);
	printf(&quot;\nBitte Alter eingeben:&quot;);
	scanf(&quot;%d&quot;,&amp;hzgr-&gt;alt);
	printf(&quot;\nBitte Matrikelnummer eingeben:&quot;);
	scanf(&quot;%d&quot;,&amp;hzgr-&gt;matr);
	hzgr-&gt;next=NULL;//Den zeiger vom neuen Element noch auf NULL setzen
	zgr-&gt;next=hzgr;//Und das neue Element an das Ende der alten Liste
	return ;
}

int main()
{

	struct liste *anker;
	anker=malloc(sizeof(struct liste));
	printf(&quot;\nBitte Vorname eingeben:&quot;);//Eingabe aller Daten.
	scanf(&quot;%s&quot;,anker-&gt;vnam);
	printf(&quot;\nBitte nachnamen eingeben:&quot;);
	scanf(&quot;\n%s&quot;,anker-&gt;nnam);
	printf(&quot;\nBitte Alter eingeben:&quot;);
	scanf(&quot;%d&quot;,&amp;anker-&gt;alt);
	printf(&quot;\nBitte Matrikelnummer eingeben:&quot;);
	scanf(&quot;%d&quot;,&amp;anker-&gt;matr);
	anhang(anker);
	printf(&quot;world\n&quot;);
	getchar();
	getchar();
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2253760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253760</guid><dc:creator><![CDATA[Odatas]]></dc:creator><pubDate>Sun, 23 Sep 2012 16:22:15 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 16:21:39 GMT]]></title><description><![CDATA[<p>Jetzt habe ich das mit scanf glatt vergessen.</p>
<p>scanf ist nicht scheiße.<br />
Du musst nur wissen was es macht.<br />
Bei den Formatspecifiern kann man Längenangaben machen.<br />
Ein %29s liest maximal 29 Zeichen ein. Ein Zeichen wird für die abschließende '\0' gebraucht.<br />
Allerdings stopt es bei Leerzeichen. Ein &quot;Kai Malte&quot; als Vornamen macht also Probleme.</p>
<p>gets ist scheiße, denn da kannst du keine Längenangabe machen.<br />
Bei fgets kannst die Länge angeben (in diesem fall 30).<br />
fgets speichert aber das '\n' von der Entertaste mit ab.</p>
<p>Du kannst bei scanf den [ Specifier nehmen. Da gibt man eine Liste von erlaubten oder nicht erlaubten Zeichen ein.<br />
Ein <code>%29[^\n]</code> liest alles bis zur Entertaste aber maximal 29 Zeichen.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Die Zeichen ab 30 werden dann für die nächste Eingabe verwendet.</p>
<p>Dies ist das Unterforum für Standard-C. Hier gibt es nur betriebsystemunabhängige Hinweise. <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="😃"
    /></p>
<p>Und wenn es nicht anders geht, nur mit großen Bauchschmerzen <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/2253765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253765</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Sun, 23 Sep 2012 16:21:39 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 16:33:16 GMT]]></title><description><![CDATA[<p>Odatas  schrieb:</p>
<blockquote>
<p>Ich habe mal Dummyhaft für das erste Element schon in der Main Funktion die Eingabe machen lassen. So das der erste nicht frei bleibt.</p>
<p>Woran liegt den das Problem in der While schleife? Eigentlich sage ich doch nur er soll immer wieder das next vom nächsten Element bekommen wenn es noch ein nächstes Element gibt.</p>
</blockquote>
<p>Und was ist mit anker-&gt;next?<br />
Welchen wert hat das?</p>
<p>Du musst aus deiner Funktion anhang auch das erste Listenelement zurückbekommen.</p>
<pre><code class="language-cpp">struct liste *anhang (struct liste *anker) 
{ Wenn anker != NULL Nachfolger suchen.

  Speicher (zgr) besorgen und füllen.

   Wenn anker == NULL 
      return zgr;
   sonst
      retrun anker;
}

//und in main
anker = anhang(anker);
</code></pre>
<p>Da fehlt allerdings die Fehlerbehandlung.<br />
Du kannst auch Speicher holen/füllen und an Liste anhängen in getrennte Funktionen machen.</p>
<p>Odatas  schrieb:</p>
<blockquote>
<p>Auch die If schleife davor kann vor dem Problem nicht zu bewahren.</p>
</blockquote>
<p>Es gibt keine if-Schleife <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/2253770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253770</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Sun, 23 Sep 2012 16:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 18:38:27 GMT]]></title><description><![CDATA[<p>DirkB schrieb:</p>
<blockquote>
<p>Und was ist mit anker-&gt;next?<br />
Welchen wert hat das?</p>
</blockquote>
<p>Ok da war der Fehler der Next von Anker muss natürlich auch NULL bekommen.</p>
<p>Jetzt klappt es super.</p>
<p>DirkB schrieb:</p>
<blockquote>
<p>Du musst aus deiner Funktion anhang auch das erste Listenelement zurückbekommen.</p>
</blockquote>
<p>Du meinst den Anker? Wäre es da nicht dann doch schlauer gewesen den Global zu machen dann muss ich den weder zurückgeben noch hingeben. Oder ist Global einfach zu verpöhnt?</p>
<p>DirkB schrieb:</p>
<blockquote>
<p>Da fehlt allerdings die Fehlerbehandlung.</p>
</blockquote>
<p>Ja an der muss ich noch arbeiten ist aber erstmal Sekundär für mich <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>
<p>DirkB schrieb:</p>
<blockquote>
<p>Es gibt keine if-Schleife <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><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</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253807</guid><dc:creator><![CDATA[Odatas]]></dc:creator><pubDate>Sun, 23 Sep 2012 18:38:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verkettete Listen ein Anfang on Sun, 23 Sep 2012 18:57:28 GMT]]></title><description><![CDATA[<p>Mit der einen globalen Variablen, kannst du nur <strong>eine</strong> Liste verwalten.<br />
Wenn die Liste jedesmal an die Funktion übergeben wird, kannst du auch mehrere gleichartige Listen in deinem Programm verwalten.</p>
<p>Nebenbei ist eine <code>struct liste</code> vom Namen her ziemlich blöd, wenn sie Studenten verwaltet.</p>
<p>Eine struct list sieht ungefähr so aus:</p>
<pre><code class="language-cpp">struct liste {
    struct liste *next;
};
</code></pre>
<p>So eine struct ist wenig sinnvoll, da sie kein Nutzdaten hat, aber du kannst die Komplette Listenverwaltung (einfügen, anhängen, löschen, Ende finden) damit machen.</p>
<pre><code class="language-cpp">Wenn du dann eine struct student {
    struct liste *student;//Zeiger auf das nächste Element der Liste
    char vnam[30];//Vorname   
    char nnam[30];//Nachname
    int alt;//Alter
    int matr;//Matrikelnummer
};
</code></pre>
<p>hast, ist das nicht anders.<br />
Da die -&gt;next Zeiger sogar an der selben Stelle stehen, kannst du sogar die selben Funktionen nehmen. (zum verketten der liste, nicht zum Speicher holen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2253813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2253813</guid><dc:creator><![CDATA[DirkB]]></dc:creator><pubDate>Sun, 23 Sep 2012 18:57:28 GMT</pubDate></item></channel></rss>