Hilfe bei Freigabe von Dynamischen Speicher und Zeigern
-
Hallo erstmal

Ich hätte da ein problem mit der Freigabe von Speicher, mit dem delete-Befehl, in einem Programm das ich momentan für ein Projekt in der Uni schreiben muss.
Hier ist schonmal das Programm, das ich bis jetzt hinbekommen hab:
#include "stdafx.h" #include <iostream> #include <string> using namespace std; struct myFriend { string name; string nickname; unsigned int freindSince; myFriend *nextFriend; }; int _tmain(int argc, _TCHAR* argv[]) { int choice ; myFriend *firstfriend = nullptr; myFriend *lastfriend = nullptr; myFriend *aFriend; string tempString; myFriend *tempPointer; do { cout << "\n-1- Add a friend \n"; cout << "-2- Show friends \n"; cout << "-3- Delete \n"; cout << "-4- End \n"; cout << "Your choice: \n"; cin >> choice; switch(choice) { case 1: aFriend = new myFriend; cout << "Name :"; cin >> aFriend->name; getline (cin, tempString); cout << "Nickname :"; cin >> aFriend->nickname; getline (cin, tempString); cout << "Friend´s since :\n"; cin >> aFriend->freindSince; if(firstfriend == nullptr) { firstfriend = aFriend; lastfriend = aFriend; aFriend->nextFriend = nullptr; } else { lastfriend->nextFriend = aFriend; aFriend->nextFriend = nullptr; lastfriend = aFriend; } break; case 2: cout << "Your Friends \n \n"; lastfriend = firstfriend; while (lastfriend != nullptr) { cout << "Name : " << lastfriend->name; cout << "\n Nickname : " << lastfriend->nickname; cout << "\n Friend since : " << lastfriend->freindSince << endl; lastfriend = lastfriend->nextFriend; } break; case 3: { string name; cout << "Name of friend to delete: "; cin >> name; if (firstfriend == nullptr) break; else if (firstfriend->name == name) { tempPointer = firstfriend; firstfriend = firstfriend->nextFriend; delete tempPointer; tempPointer = nullptr; } } break; case 4: { system("pause"); return 0; } } } while(choice != 4); { } }Friend-Database:
Das Programm soll in erster linie name, spitzname und datum des Kennenlernens speichern(case1) und danach auf Wunsch die bisherigen Eingaben auflisten (case 2).
Soweit funktioniert das auch (mit hilfe meines Scripts und Internet
)Jetzt kommt mein Problem: Im case 3 soll dann ein Name ausgewählt werden um ihn aus der Liste zu löschen und um den belegten Speicher wieder freizugeben.
Der Code der jetzt da steht ist von meiner Dozentin zur Hilfestellung vorgegeben und lässt bei der Ausführung immer nur den ersten in der Liste löschen anstatt den eingegebenen Namen.(Wäre ja auch zu einfach gewesen
)Ich steh da jetzt aber auf dem Schlauch ,da ich nicht weiß wie ich das am besten anstelle.Dazu finde ich auch nichts in meinem Script zur Vorlesung oder Internet. Einen Tipp hab ich dazu noch gelesen, man könnte den ausgewählten freund ausgrenzen indem man die Zeiger in der Struktur umordnet.
Wie genau das aber aussieht kann ich mir noch nit vorstellenIch hab erst vor 1 1/2 Monaten c++ kennengelernt und bin noch ein extremer frischling und hoffe jemand kann mir nen hilfreichen tipp zum weiterprogrammieren geben.

-
Naja was du dir da gebaut hast ist ja eine Linked List. Also ein Element hat jeweils immer einen Zeiger auf das nächste Element oder eben einen nullptr wenn nichts mehr kommt.
Wenn du nun einen Freund anhand des Namens löschen willst musst du die gesamte Liste durchgehen (ähnlich wie in Fall 3) und dann löschen. Wie man das erste Element löscht ist ja schon vorgegeben. Prinzipiell läuft es bei den anderen Elementen auch so ab. Wenn du den Freund an Position n löschen willst musst du eigentlich nur dafür sorgen, dass der Freund an Position n-1 direkt auf Position n+1 zeigt, also quasi Freund n übersprungen wird. Dann ist Freund n aus der Liste entfernt und du kannst den Pointer mit delete freigeben.
-
Du hast da eine sog. einfach verkettete Liste.
Wie die funktionieren kannst du an unzähligen Stellen im Internet nachlesen.Du musst dir dann einfach überlegen welche Zeiger wie angepasst werden müssen damit nachher wieder alles stimmt.
Was die Sache etwas lästig macht sind diefirstFriendundlastFriendZeiger. Da musst du dir halt überlegen welche Sonderfälle es alles gibt und wie du diese behandeln kannst.Was hier gefragt ist einfach "algorithmisch denken können". Besonders viele Vorkenntnisse oder Erfahrung brauchst du dazu nicht. Und das, also "algorithmisch denken können", wirst du einfach lernen müssen. Ist das um & auf des Programmierens. Wenn wir dir jetzt hinschreiben wie dein Beispiel geht, oder auch nur in Deutschen Sätzen genau erklären was du alles machen musst, dann hättest du nix davon. Denn es geht nunmal genau darum dass du selbst die Lösung findest.