Inhaltsverzeichnis - Funktion (Frage)
-
Folgendes habe ich bzgl. Zeiger verstanden:
Mit ihnen kann man auf andere bereitsdeklarierte Variablen (Können auch wieder Zeiger sein) in dem Arbeitsspeicher (explizit der Arbeitsspeicherzelle mit ihrer Adresse) zeigen. Das heißt das man indirekt auf eine Variable zugriff hat und sie zb. über den Zeiger neu initialisieren kann. Bbitte berichtet mich, sofern ich falsch liege.
Nun würde ich die im Anhang gegebene Aufgabe gerne lösen, weiss jedoch nich wie ich das was ich bzgl. Zeiger gelernt habe hier anwenden soll. Deshalb meine Frage zunächst: Was ist das für ein Parameter der die Funktion zugelifert wird? Ich meine damit kapitel*start. Was soll das darstellen und kann man sich das bildlich darstellen?
Vielen dank im vorraus!
Anhang:
In dieser Aufgabe soll ein Inhaltsverzeichnis realisiert werden. In einem ersten Schritt handelt es sich dabei lediglich um eine Liste der Kapitelüberschriften. Diese sind in einer verketteten Liste zu speichern. Die Datenstruktur der einzelnen Elemente lautet:
struct kapitel { string titel; // Kapitelueberschrift kapitel* next; // Zeiger auf naechstes Element };a) Schreiben Sie die Funktion void Loesche(kapitel* vorgaenger), welche aus einer bereits existierenden Liste das Element nach vorgaenger aus der Liste und aus dem Speicher löscht. Beachten Sie auch den Fall, dass vorgaenger keinen Nachfolger besitzt.
-
Amplitude schrieb:
Folgendes habe ich bzgl. Zeiger verstanden:
Mit ihnen kann man auf andere bereitsdeklarierte Variablen (Können auch wieder Zeiger sein) in dem Arbeitsspeicher (explizit der Arbeitsspeicherzelle mit ihrer Adresse) zeigen. Das heißt das man indirekt auf eine Variable zugriff hat und sie zb. über den Zeiger neu initialisieren kann. Bbitte berichtet mich, sofern ich falsch liege.
Das stimmt.
Nun würde ich die im Anhang gegebene Aufgabe gerne lösen, weiss jedoch nich wie ich das was ich bzgl. Zeiger gelernt habe hier anwenden soll. Deshalb meine Frage zunächst: Was ist das für ein Parameter der die Funktion zugelifert wird? Ich meine damit kapitel*start. Was soll das darstellen und kann man sich das bildlich darstellen?
Das ist ein Zeiger namens start, der auf ein Objekt vom Typ kapitel zeigt. Nach dem was du oben über Zeiger gesagt hast, müsstest du das eigentlich gewusst haben

[Aufgabe geschnippt]
Was du oben gesagt hast, ist zwar grundsätzlich richtig, aber zu wenig, um die Aufgabe zu lösen. Du brauchst dazu noch Wissen über Nullzeiger und dynamischen Speicher bzw. new/delete.
-
Ich meinte eigentlich
void Loesche(kapitel* vorgaenger)Mir war diese Schreibweise nicht bekannt. In diesem Fall heißt der Zeiger, welcher der Funktion zugeliefert wird also Vorgänger und zeigt dabei auf das Objekt Kapitel. Etwas zurückgegeben wird nicht, da vor der Funktion ein void steht richtig`?
Und nun soll ich folgendes lösen (Kurz ausgedrückt): "Element nach vorgaenger aus der (verketteten wahrscheinlich) Liste löschen. " Was soll bitte ein Element nach dem vorgänger sein. Ist das nicht die derzeitige Position ?
Bzgl. dem von dir genannten was ich mir noch durchlesen soll werde ich das machen. Kannst du mir aber sagen was ein buffer ist, weil sowas in der Musterlösung vorkommt und ich nichts passendes im Internet dazu finde. Soll das ein Befehl sein?
Hier mal die Musterlösung:
void Loesche(kapitel* vorgaenger) { if (vorgaenger->next == NULL) return; [1] kapitel* buffer = vorgaenger->next; [1] vorgaenger->next = buffer->next; [1] delete buffer; [1] }Danke nochmals!
Edit: Was heißt eigentlich der Pfeil? Soll das ein Zeiger sein?
-
Amplitude schrieb:
Kannst du mir aber sagen was ein buffer ist, weil sowas in der Musterlösung vorkommt und ich nichts passendes im Internet dazu finde. Soll das ein Befehl sein?
...
Was heißt eigentlich der Pfeil? Soll das ein Zeiger sein?Trolle woanders weiter.
-
Amplitude schrieb:
void Loesche(kapitel* vorgaenger)Mir war diese Schreibweise nicht bekannt.
Doch, ich glaube schon. Wenn du Funktionen und Zeiger kennst, dann musst du diese Schreibweise verstehen.
In diesem Fall heißt der Zeiger, welcher der Funktion zugeliefert wird also Vorgänger und zeigt dabei auf das Objekt Kapitel.
kapitel ist ein Typ, nämlich die Struktur kapitel aus deinem ersten Posting. Kein Objekt.
Etwas zurückgegeben wird nicht, da vor der Funktion ein void steht richtig`?
Ja.
Und nun soll ich folgendes lösen (Kurz ausgedrückt): "Element nach vorgaenger aus der (verketteten wahrscheinlich) Liste löschen. " Was soll bitte ein Element nach dem vorgänger sein. Ist das nicht die derzeitige Position ?
Es gibt keine "derzeitige" Position. Man übergibt einen Zeiger auf den Vorgänger des zu löschenden Elementes, das ist durch den Aufbau einer verketteten Liste halt erforderlich.
Bzgl. dem von dir genannten was ich mir noch durchlesen soll werde ich das machen. Kannst du mir aber sagen was ein buffer ist, weil sowas in der Musterlösung vorkommt und ich nichts passendes im Internet dazu finde. Soll das ein Befehl sein?
Ein Puffer (buffer) ist ein Zwischenspeicher. Das hat nicht unbedingt eine besondere technische Bedeutung. Demjenigen, der die Musterlösung geschrieben hat, ist wohl bloß kein besserer Name eingefallen (Vorschlag: temp).
void Loesche(kapitel* vorgaenger) { if (vorgaenger->next == NULL) return; [1] kapitel* buffer = vorgaenger->next; [1] vorgaenger->next = buffer->next; [1] delete buffer; [1] }OK.
Edit: Was heißt eigentlich der Pfeil? Soll das ein Zeiger sein?
Der Pfeil ist eine Abkürzung,
vorgaenger->nextbedeutet das gleiche wie(*vorgaenger).next.
-
Danke schön Bashar. Das mit dem Buffer habe ich noch nicht verstanden werde mich jedoch mal bei diesem temp einlesen? So habe ich das wohl verstanden.
Bezüglich dem Zeiger. Ich habe dazu gefunden, dass wenn man zum Beispiel ein Listenkopf einer verketteten Liste erstellt man mithilfe dem Zeiger -> dann dem Listenkopf mit Daten belegen kann. Diese Daten wurden zuvor mithilfe des Befehls struct vorgegeben.
Heißt das nun ich verwende den Pfeil -> im Sinne von Daten zuschreiben?
-
Wutz schrieb:
Trolle woanders weiter.

-
Amplitude schrieb:
Danke schön Bashar. Das mit dem Buffer habe ich noch nicht verstanden werde mich jedoch mal bei diesem temp einlesen? So habe ich das wohl verstanden.
Da gibt es nicht viel zu verstehen. Das ist einfach ein Name für eine Variable, die zwischenzeitlich (temporär -- das kannst du nachschlagen, im Duden) einen Wert aufnimmt und sonst keine weitere Bedeutung hat.
Bezüglich dem Zeiger. Ich habe dazu gefunden, dass wenn man zum Beispiel ein Listenkopf einer verketteten Liste erstellt man mithilfe dem Zeiger -> dann dem Listenkopf mit Daten belegen kann. Diese Daten wurden zuvor mithilfe des Befehls struct vorgegeben.
Heißt das nun ich verwende den Pfeil -> im Sinne von Daten zuschreiben?
Das ist totaler Unsinn, von vorne bis hinten. Lies ein Buch und hör auf einzelne Begriffe zu googeln, das bringt nichts.
-
Dann werde ich das wohl machen müssen^^.
Kannst du mir eventuell eins vorschlagen?
-
Nicht wirklich, ich hoffe hier ist was dabei: http://www.c-plusplus.net/forum/310212
Ich hatte allerdings gehofft, dass derjenige, der die Aufgabe gestellt hat, auch Literaturtipps geben kann.
-
Stimmt, da müsste ich noch einmal nachfragen. Danke nochmals! Das wärs dann.
