C++ einfach Verkettete Liste erstellen funtioniert nicht wie ICH es will

EueRolando

Cadet 2nd Year
Registriert
Aug. 2014
Beiträge
29
Hallo ComputerBase'ler,

ich bin grade dabei eine Aufgabe zu lösen. Ich soll eine einfach verkettete Liste erstellen. Ich habe mit meinen bisherigen c++ Kenntnissen das folgende zusammengeschustert und dabei Ausgaben und Kommentare der Übersichtlichkeit halber für euch entfernt:

Code:
void ArtC(){
	sBuchEintrag *artc=NULL; //dieser Zeiger wird benötigt, um später auf den Anfang der Liste zu zeigen
	int anzahleinträge=0;	//wird wieder benötigt um das Array zu erstellen

	std::cin>>anzahleinträge;

	for(int i=0; i<anzahleinträge; i++){
	if(i=0) {artc=new sBuchEintrag;}	//der erste Eintrag kann unter dem Zeiger artc angesprochen werden
               artc[i].next = new sBuchEintrag;
	std::cout<<"Eintrag"<<i+2<<"wurde erstellt.\n";
	}
}

und sBuchEintrag sieht so aus:

Code:
struct sBuchEintrag{
               sBuchEintrag *next(NULL);	//Um Fehler zu vermeiden wird der Zeiger next mittels Initialisierungsliste mit NULL initialisiert
	char author[50];
	char titel[50];
	char isbn[50];
	unsigned short bibliotheksnr;
	unsigned int kaufdatum;
};

mekern tut er bei Zeile 9 in dieser Anweisung will ich, dass der Zeiger next (eine Komponente von sBuchEintrag) des aktuellen Elements (Position i) auf das folgende neu erstellte Element zeigt.

Nun meine Frage: Ist dies in dieser Form möglich? Wenn ja wo ist mein Fehler? Und vor allem: Gibt es Gründe es anders zu machen? (habe schon viele andere Beispiele im Internet gefunden will aber meinen Fehler verstehen)

Liebe Grüße
EueRolando
 
Du hast in Zeile 8 bei dem Vergleich = statt == benutzt. Das ist vermutlich schon alles.
Edit: Der Vergleich wird dadurch nämlich immer false ausspucken (i ist ja 0) und in Zeile 9 arbeitest du dann mit einem Nullpointer.
Edit2: Warum initialisierst du artc nicht gleich mit einem Pointer auf einen sBuchEintrag, sondern NULL? Das würde die in meinen Augen unschöne if-Abfrage in der Schleife sparen.
 
Zuletzt bearbeitet:
Hab die Zeilen 8-9 falsch gelsen
 
Zuletzt bearbeitet: (unsinn gelöscht)
Hallo Freezedevil,

naja diese Abfrage habe ich falls man in der Eingabe eine 0 eingibt. Ist erstmal unwichtig, hast recht. Habe es jetzt folgendermaßen geändert:

Code:
void ArtC(){
	sBuchEintrag *artc= new sBuchEintrag; //dieser Zeiger wird benötigt, um später auf den Anfang der Liste zu zeigen
	int anzahleinträge=0;	//wird wieder benötigt um das Array zu erstellen
	sBuchEintrag *eintragsstand=NULL;

	std::cout<<"\n---------EINTR\x8EGE NACH ART C.----------\n";
	std::cout<<"Es wird eine einfach verkettete Liste mit einer von Ihnen vorgegebenen Anzahl an Eintr\x84gen erzeugt.\n";
	std::cout<<"Wie viele Eintr\x84ge nach sollen erzeugt werden?\n";
	std::cin>>anzahleinträge;

	for(int i=0; i<anzahleinträge; i++){
	artc[i].next = new sBuchEintrag;
	std::cout<<"Eintrag"<<i+2<<"wurde erstellt.\n";
	}
}

Fehler bleibt aber weiterhin.

Grüße
 
artc ist kein Array von Zeigern!
Ergänzung ()

artc ist der Einsprungs- oder Startpointer:

- mit new() allokierst du den Speicher und übergibst dann die Adresse an artc
- um auf die nächste Adresse ( die irgendwo im RAM liegen kann zuzugreifen ) müsstest du artc->next verwenden
 
Zuletzt bearbeitet:
artc gibt ein Speicherzugriffsfehler für (i!=0). Es liegt ja nur eine Instanz an dieser Speicheradresse.

Du brauchst ein iterator, um dich durch die liste zu hangeln. Z.b. so:
Code:
for(int i=0; i<anzahleinträge; i++)
{
artc->next = new sBuchEintrag;
artc=artc->next;
}
 
Bin selbst eher Anfänger was C++ angeht, aber Zeile 12 müsste mMn so ausschauen:

artc->next = new sBuchEintrag;
 
^^ artc würde ich nicht manipulieren. Wie findest du sonst den Start der Liste wieder!?
 
Du kannst auf artc auch nicht wie auf ein Array zugreifen, da es nur ein Pointer ist. artc bedeutet im Endeffekt Adresse von artc + i*Größe des Datentyp. Du erzeugst deine Einträge aber "irgendwo" auf dem Heap und hast keine Garantie dafür, dass die schön sauber hintereinander im Speicher liegen.
Du brauchst eher eine Art iterator.
Code:
void ArtC(){
	sBuchEintrag *artc= new sBuchEintrag; //dieser Zeiger wird benötigt, um später auf den Anfang der Liste zu zeigen
	int anzahleinträge=0;	//wird wieder benötigt um das Array zu erstellen
	sBuchEintrag *eintragsstand=NULL;

	std::cout<<"\n---------EINTR\x8EGE NACH ART C.----------\n";
	std::cout<<"Es wird eine einfach verkettete Liste mit einer von Ihnen vorgegebenen Anzahl an Eintr\x84gen erzeugt.\n";
	std::cout<<"Wie viele Eintr\x84ge nach sollen erzeugt werden?\n";
	std::cin>>anzahleinträge;

	for(sBuchEintrag *it = artc, int i=0; i<anzahleinträge; ++i, it=it->next){
		it->next = new sBuchEintrag;
		std::cout<<"Eintrag"<<i+2<<"wurde erstellt.\n";
	}
}
(ungetestet)
 
Vermutlich liegt es daran, dass er sich über gewisse Dinge selber Gedanken machen sollte.
 
Freezedevil schrieb:
artc bedeutet im Endeffekt Adresse von artc + i*Größe des Datentyp. Du erzeugst deine Einträge aber "irgendwo" auf dem Heap und hast keine Garantie dafür, dass die schön sauber hintereinander im Speicher liegen


Vielen Dank diese Erklärung hat mir meinen Fehler sehr gut erklärt. Habe nicht bedacht, dass die Elemente iwo erzeugt werden.

Liebe Grüße
EueRolando
 
Zurück
Oben