C++ einfach verkettete Liste wird nicht vollständig erstellt

EueRolando

Cadet 2nd Year
Dabei seit
Aug. 2014
Beiträge
29
Hi,

folgender Quelltext soll mir eine einfach verkettete Liste mit "anzahleinträge" an Elementen erstellen:

Code:
	for(unsigned int i=1; i<=anzahleinträge; i++){

		if (i==1){
			artc = new sBuchEintrag;		
			anker = artc;
			anker->bibliotheksnr=1;
			}
		else{
			anker->next = new sBuchEintrag;
			anker = anker->next;
			anker->bibliotheksnr=i;
			if (i=anzahleinträge) {
				anker->next=artc->next;
				}
			}
		}
Es werden aber nur zwei Elemente erstellt. Die Schleife wird aber entsprechend "anzahleinträge" mehrmals durchlaufen. Das next des ersten Elements (stets durch artc referenziert) zeigt auch richtigerweise auf das zweite Element. Ist i=anzahleinträge wird auch das letzte if entsprechend der Bedingung richtig ausgeführt. (In diesem Fall zeigt der next referenziert durch anker dann auf sich selbst) Also meine Frage ist wieso nur zwei Elemente erstellt werden?

Viele Grüße
EueRolando
 

slashmaxx

Cadet 3rd Year
Dabei seit
Okt. 2006
Beiträge
47
in Zeile 12 macht du folgendes:

if (i=anzahleinträge)

sollte aber eher wohl "if (i==anzahleinträge)" heißen

Du machst hier eine Zuweisung, so dass beim zweiten Element i auf anzahleinträge gesetzt wird und somit die Schleife danach beendet wird.
 

EueRolando

Cadet 2nd Year
Ersteller dieses Themas
Dabei seit
Aug. 2014
Beiträge
29
Im Debugger sind nur zwei Elemente sinnvoll erzeugt. Bzw. sieht es so aus, also ob zumindest die Zeile 10 nicht ausgeführt wird. Schon möglich, dass Elemente irgendwo im Speicher erzeugt werden, aber dann gleich "verschütt" gehen. Also nicht durch "anker" referenziert werden.

Grüße
EueRolando
Ergänzung ()

in Zeile 12 macht du folgendes:

if (i=anzahleinträge)

sollte aber eher wohl "if (i==anzahleinträge)" heißen

Du machst hier eine Zuweisung, so dass beim zweiten Element i auf anzahleinträge gesetzt wird und somit die Schleife danach beendet wird.
Schei**!! Anfängerfehler. Danke!! Ich hab mich schon dumm und dusselig gesucht!

Dankend
EueRolando
 
Zuletzt bearbeitet: (Beitrag wiederhergestellt)

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Bei Vergleichen über den ==-Operator empfiehlt es sich, den konstanten Operanden auf der linken Seite des Vergleichs zu halten. Dann kann so ein Versehen nicht passieren, denn einer Konstanten kann man keinen Wert zuweisen ... der Compiler hätte sich also gleich beir dir beschwert, und du hättest dir jede Menge Zeit (und Nerven) gespart.
In deinem konkreten Beispiel gab es nun in dem Vergleich zwar keine Konstante, ich wage aber zu behaupten, daß du aus der Variablen anzahleinträge leicht eine Konstante machen könntest:

Code:
const unsigned int anzahleinträge = /* ... hier Wertzuweisung einfügen */;
Dann hättest du anzahleinträge auf die linke Seite des Vergleichs stellen können:

Code:
if (anzahleinträge==i) /* ... */
Wenn du dann aus Versehen = statt == geschrieben hättest, hätte sich dein Compiler sofort bei dir beschwert: "FEHLER: Kann einer Konstanten keinen Wert zuweisen!" ... oder so was in der Art.

Übrigens, ich würde es vermeiden, Bezeichner mit Umlauten zu verwenden.
 

stwe

Lieutenant
Dabei seit
Feb. 2011
Beiträge
654
Bei Vergleichen über den ==-Operator empfiehlt es sich, den konstanten Operanden auf der linken Seite des Vergleichs zu halten. Dann kann so ein Versehen nicht passieren, denn einer Konstanten kann man keinen Wert zuweisen ... der Compiler hätte sich also gleich beir dir beschwert, und du hättest dir jede Menge Zeit (und Nerven) gespart.
Ich finde das aber unglaublich schlecht zu lesen. Gute Compiler sollten zumindest vor sowas warnen. z.B. der gcc mit -Wall:
test.c:5:5: Warnung: Um Zuweisung, die als Wahrheitswert verwendet wird, werden Klammern empfohlen [-Wparentheses]
 
Top