listen verkettung

leooo

Grünschnabel
hallo leute!
ich versuche mir gerade die einfach verkettete liste beizubringen, scheitere aber leider immer an der verkettung der einzelnen knoten.
könnt ihr mir bitte weiterhelfen?
hier schonmal der code:
Code:
class Knoten
{
private:
	string inhalt;
	Knoten *next;
	Knoten*erster;
	Knoten *letzter;
public:
	Knoten ()
	{
		erster=NULL;
		letzter=NULL;
	}

	void haengAn(Knoten*& speicher,string wort)
	{	
		Knoten* node=new Knoten;
		this->inhalt=wort;
		this->next=NULL;

		if (erster==NULL)
		{
			this->erster= node;
			this->letzter=node;
		
		
		}
		
		else
		{	speicher= node;
			this->next=speicher;
			this->letzter= speicher;
		}

		
		
	}
};

void main ()
{
	Knoten *speicherA=NULL;
	haengAn(speicherA, "Fischers");
	haengAn(speicherA, "Fritze");

}

zusätzlich kommt immer die fehlermeldung, das haengAn nicht gefunden werden kann... warum nicht? ich hab es doch in public stehen.

ich hasse listen :(

hoffe auf eine schnelle antwort,
liebe grüße
 
Hi.

haengAn ist eine Methode. Du benötigst also eine Instanz der Klasse um für diese Instanz (ein Objekt) die Methode aufrufen zu können.

In deinem Code hast du einen Zeiger angelegt, der auf NULL zeigt. Damit kann man nichts anfangen. Du mußt schon ein Objekt (Instanz einer Klasse) kreieren.

Bsp:
C++:
Knoten k;

k1.haengAn("Fischers");
Dabei müßtest du die Parameterliste der haengAn Methode natürlich ändern.

Gruß
 
hallo!
danke für deine hilfe... ich habe das problem nun so gelöst das ich die haengAn Methode als konstruktor angelegt habe.
nun habe ich das problem, dass bei der ausgabe nur die adresse von speicherA ausgegeben wird... was mach ich in meiner verkettung falsch?

hier der neue "code":
Code:
class Knoten
{
private:
	string inhalt;
	Knoten *next;
	Knoten*erster;
	Knoten *letzter;
public:
	Knoten ()
	{
		erster=NULL;
		letzter=NULL;
	}


	Knoten (Knoten *& speicher, string wort)
	{	
		Knoten* node=new Knoten;
		this->inhalt=wort;
		this->next=NULL;

		if (erster==NULL)
		{
			this->erster= node;
			this->letzter=node;
		
		
		}
		
		else
		{	speicher= node;
			this->next=speicher;
			this->letzter= speicher;
		}

		
		
	}
};

void main ()
{
	Knoten * speicherA=NULL;
	Knoten eins(speicherA, "Fischers");
	Knoten zwei(speicherA, "Fritze");

	cout<<*speicherA;

}

meine liste wird doch in speicherA gespeichert oder nicht****

danke für die hilfe!
 
danke für deine hilfe... ich habe das problem nun so gelöst das ich die haengAn Methode als konstruktor angelegt habe.
Das ist allerdings dann mehr als merkwürdig...

Du kreierst ein Objekt (Konstruktor) wobei du dann dabei ein Objekt kreierst (new Knoten). Die Daten speicherst du in dem ersten Objekt. Da das allerdings nur ein temporäres Objekt ist, sind die Daten danach weg.

Das ist jetzt so durcheinander. Evlt. wäre es besser du fängst nochmal von vorn an (Aufgabenstellung lesen, überlegen, Plan auf Papier machen, Schritt für Schritt).

\edit: Eine Liste ist so ziemlich die einfachste Struktur die es gibt. Sie besteht aus Knoten. Ein Knoten besteht eigentlich nur aus einem next Zeiger und einem Datum.

Gruß
 
Zuletzt bearbeitet:
so habs jetzt nochmal neu gemacht... sieht auch bisher ganz gut aus, außer dass das letzte element nicht ausgegeben wird. warum nicht?
Code:
#include <iostream>
#include <string>
using namespace std;

class Liste
{private:
	Liste *kopf;
	Liste *ende;
	string Film;
	Liste *next;
public:
	

	Liste ()
	{
		kopf=NULL;
		ende=NULL;
		next=NULL;
	}

	void hinzufuegen (string name)
	{
		Liste *neue=new Liste;
		neue->Film=name;
		

		if (ende==NULL)
		{
			kopf=neue;
			ende=neue;
		}
		else
		{
			ende->next=neue;//das next vom alten knoten zeigt nun auf das neue
			ende = neue;//der zeiger ende zeigt nun auf das neue element
			ende->next=NULL;
			
		}
	}

	void anzeigen ()
	{
		Liste *p=kopf;
		
		while (p->next!=0)
		{
			cout<< "Name: "<<p->Film;
			cout<<endl;
		
		p=p->next;
		}
	}

};

void main ()
{
	Liste Filme;
	Filme.hinzufuegen("Harry Potter");
	Filme.hinzufuegen("Star Wars");
	Filme.hinzufuegen("Herr der Ringe");
	Filme.anzeigen();
}
also da steht dann "Harry Potter" und "Star Wars" aber nicht "Herr der Ringe"... ich denkmal dass das irgendwas mit dem ende->next zu tun hat... aber weiß nicht wie ich das sonst schreiben soll.

vielen dank nochmal :)
 
Zuletzt bearbeitet:
Hallo,

das letzte Element wird nicht angezeigt, da beim letzten Durchgang der Schleife "p" auf "p->next" gesetzt wird, wobei "p" eigentlich das letzte Element wäre und "p->next" 0 ist.

So funktioniert es:
C++:
do
{
   cout<< "Name: "<<p->Film;
   cout<<endl;
         
   p = (p->next!=0) ? p->next : 0;
}
while(p!=0);
Die Zeile p = (p->next!=0) ? p->next : 0; setzt p auf p->next, soweit gesetzt, ansonsten auf 0.
Diese Form mit dem Fragezeichen ist eine Kurzform für:
C++:
if ( p->next != 0)
{
  p = p->next;
}
else
{
  p = 0;
}

PS: Danke, dass du die Code-Tags nutzt! Wenn du die speziellen Tags für C++ [code=cpp]Hier dein Code[/code] nutzt, kann man deinen Code noch besser lesen.
 
mh leider funktioniert das so auch nicht... also da steht immer noch harry potter und starwars...
mein code sieht jetzt so aus:
C++:
	void anzeigen ()
	{
		Liste *p=kopf;
		
		while (p->next!=0)
		{
			cout<< "Name: "<<p->Film;
			cout<<endl;
		
			if ( p->next != 0)
			{
				p = p->next;
			}
			else
			{
				 p = 0;
			}
		}
	}
 
aah ich hab schon...
man muss statt
while (p->next!=0)

schreiben:
while (p!=0)

jetzt besteht nur noch die frage wieso?

:D
 
aah ich hab schon...
man muss statt
while (p->next!=0)

schreiben:
while (p!=0)

jetzt besteht nur noch die frage wieso?
Ganz logisch: solange p ein gültiges Listenelement / Knoten ist, gibst du es aus. Wenn nicht nicht.

Und wie gesagt, es würde Sinn machen die Begriffe Liste und Knoten nicht zu vermischen. Jeder deiner "Knoten" ist eine Liste und hat ein kopf, ende, next. Das ist unnötig.

Gruß
 
Zurück