Stack/Heap: Pointer usw. Programmieren
-
Hallo!
Folgende Aufgabenstellung:
Stack/Heap: Pointer usw. Programmieren
Stackobjekt zeigt auf Objekt im Heap (Inhalt = 1) -> zeigt auf Objekt im Heap(Inhalt = 2) -> zeigt auf Objekt im Heap (Inhalt = 3).
Nun soll das Stackobjekt so abgeändert werden, dass es auf das Heapobjekt mit dem Wert 2 zeigt. Der Inhalt des Heapobjektes mit dem Inhalt 1 soll ausgegeben werden (Aufruf wie?).#include <iostream>
using namespace std;void main()
{int *heap1 = new int(1);
int *heap2 = new int(2);
int *heap3 = new int(3);int stack = *heap1;
heap1 = heap2;
heap2 = heap3;stack = *heap1;
cout << stack << "\n";
cout << *heap1 << "\n";
cout << *heap2 << "\n";
cout << *heap3 << "\n";
}Soweit, so gut ... Nur wie soll ich jetzt das Heapobjekt mit dem Inhalt 1 ausgeben????? Wäre super wenn mir da jemand helfen kann. Am besten mit kurzer Erklärung.
Ist mein Ansatz vielleicht völlig falsch???
-
Also: Zunächst mal: Das von dir beschriebene Konzept ist eine einfach verkettete Liste (Anfangszeiger zeigt auf Element A, das eins enthält und auf Element B zeigt, das 5 enthält und auf Element C zeigt ...
Bei deinem Ansatz verwendest du aber nur drei Integer Zeiger.
Zeiger A zeigt auf einen Integer mit dem Wert 1.
Zeiger B zeigt auf einen Integer mit dem Wert 2.
...Das ist nicht, was du willst. Du musst eine Datenstruktur anlegen, die dein Element (einen Int) und einen Zeiger auf sich selbst enthält:
struct ListElem { int value; ListElem* pNext; };
Dann musst du deine Element anlegen und an die Liste anfügen, indem du jeweils den Zeiger pNext auf das nächste folgende Element abänderst.
Du musst dir allerdings einen Zeiger (den sogenannten Anker) auf das erste Element der Liste sichern. Wenn du diese Zeiger verlierst, kommst du nie mehr an den Anfang der Liste heran, kannst also auch den Speicher nicht freigeben.
Außerdem musst du aufpassen, daß du beim Ändern der Liste keine Zeiger fallenlässt.
Ich schlage vor, du malst dir die Struktur und die Liste auf, zeichnest pNext wirklich als Pfeil darin ein, und überlegst dir, was du nun tun musst. Dabei musst du alle Element, auf die kein Pfeil zeigt, als verloren ansehen.
Viel Spaß
-
Erstmal danke für die Hilfe...
Wie kann ich auf diese Weise die Pointer mit integer Werten initialisieren?
Und wie kann ich mir den Pointer auf das erste Element merken?Fällt dir vielleicht ein kurzes Beispiel ein?
Habe mir die Datenstruktur aufgezeichnet, kann es mir aber immer noch nicht recht vorstellen, wie du es meinst.
-
So ich habe mal folgendes gemacht und es scheint auch zu funktionieren, ich kann zumindest noch auf alle drei Elemente zugreifen
#include <iostream> using namespace std; int main() { struct a { a *heap; int myint; }; a *stack = new a; stack->myint =1; stack->heap = new a; stack->heap->myint=2; stack->heap->heap = new a; stack->heap->heap->myint=3; /*cout<<"inhalt: "<<stack<<endl; cout<<"adresse: "<<&stack<<endl; cout<<"inhalt: "<<stack->heap<<endl; cout<<"adresse: "<<&stack->heap<<endl; cout<<"inhalt: "<<stack->heap->heap<<endl; cout<<"adresse: "<<&stack->heap->heap<<endl;*/ //drittem heapobjekt den inhalt(adresse des zeigers auf den gezeigt wird) des stackobjekt zuweisen stack->heap->heap->heap = stack; cout << "drittes Heapobjekt zeigt auf erstes " << stack->heap->heap->heap << endl; cout << stack->heap->heap->heap->myint << endl << endl; //stackobjekt den inhalt stack = stack->heap->heap; cout << "stackobjekt zeigt auf das zweite heapobjekt" << stack << endl; cout << stack->heap->heap->myint << endl; //neu cout << "stack zeigt auf drittes " << stack<< endl; cout << stack->myint << endl << endl; return 0; }
Kann man das nun so realisieren oder ist es nur "zufällig" richtig?