Doppelt verkettete Liste
-
Hacker schrieb:
Hä? Kennst du nicht die STL-Algorithmen oder was?
Doch, die meisten kenne ich. Aber da er gerade lernt mit Listen zu hantieren kann er das ruhig mal selber implementieren.
Hacker schrieb:
Um sicherzustellen, dass eine Liste von jedem Element nur eines besitzt, gibt es verschiedene Wege, der ist am einfachsten:
list.sort(); list.unique();Ja, so kann man das natuerlich machen.
Hacker schrieb:
Sonst einfach einen assoziativen Container (speziell map, set) verwenden, wenn das für dich nach jedem Einfügen sichergestellt werden soll.
Lies mal seinen ersten Satz.
-
icarus2 schrieb:
Hacker schrieb:
Hä? Kennst du nicht die STL-Algorithmen oder was?
Doch, die meisten kenne ich. Aber da er gerade lernt mit Listen zu hantieren kann er das ruhig mal selber implementieren.
Das hat doch nichts mit verketteten Listen zu tun, das ist ein sehr allgemeiner Algorithmus. Außerdem beschränkst du dich hier auch
std::listund seine Methoden. Aber eig. hast du Recht, selber implementieren zu Lernzwecken ist natürlich immer gut. :schland:icarus2 schrieb:
Hacker schrieb:
Sonst einfach einen assoziativen Container (speziell map, set) verwenden, wenn das für dich nach jedem Einfügen sichergestellt werden soll.
Lies mal seinen ersten Satz.
Ich habs aber schöner gesagt
:p
-
Okay,
meine doppelt verkettete Liste sieht wiefolgt aus (darum keine Memberfunktionen vorhanden):
// in main DLink *myList = new DLink(-1); myList->input(myList); // Konstruktor von DLink DLink::DLink(int iAContent) : iContent(iAContent), pre(NULL), suc(NULL) { }darum wie gesagt keine Memberfunktionen.
bin jetzt auf diesem Stand:
// meine input() Funtkion sieht so aus: void DLink::input(DLink* myList) { int iNumber = 1; cout << "Please add as many integer as you wish: " << endl; while(iNumber != 0) { cin >> iNumber; if(!has(myList, iNumber)) { myList->insert(new DLink(iNumber)); } else { cout << "Integer already exists!" << endl; } } } // und meine has-Funktion sieht so aus: bool DLink::has(const DLink* myList, int iValue) { for(int i = 0; i != myList->getLength(); i++) { if (i == iValue) { return true; } return false; } }Problem ist: wie genau bestimmte ich jetzt die Länge meiner Liste?
Weiß halt nicht, was meine getLength()-Funktion returnen soll...^^
Aber schonmal vielen Dank für die Antworten
Edit:
neue Membervariable iLength, welche nach jedem erfolgreichen Aufruf der instert-Funktion um 1 erhöht wird.
Müsste ja funktionieren oder?^^
Nur klappt das immer noch nicht so richtig, wenn ich 1, 1, 1, 1, 3, 5 eingebe gibt er mir alle Zahlen aus, auch alle eingegebenen 1en...^^
d.h. irgendwas in der has-Funktion ist falsch, weiß jemand was?^^
-
Sie kann natürlich nur wissen, wie lang sie ist, wenn du auch schön brav mitzählst, wie viele "push-backs" du gemacht hast.
struct List{ private: // int size; public: // inline int get_size() const {return size;} inline void increment_size() { size++} };Jetzt klarer?

gruß
syntax
-
inlinekannst du (wie du wissen solltest :tadel:) weglassen.Syntax_error schrieb:
inline void increment_size() { size++}
Ach komm, das ist jetzt ein wenig überflüssig
, auch wenn es natürlich geinlined wird.
-
Hacker schrieb:
inlinekannst du (wie du wissen solltest :tadel:) weglassen.Klar weiß ich das, aber was spricht gegen so eine schreibweise?
gruß
syntax
-
EDIT:
Hatte hier schon einen Roman geschrieben...^^ Derzeit siehts so eigentlich ganz gut aus...
Allerdings gibt er nur eine Fehlermeldung aus, wenn ich den Wert eingebe, mit dem ich die Liste initialisiert habe (hier 1), wenn ich 2, 2, 2 eingebe, gibt er keine Fehlermeldung aus und addet sie trotzdem...
Jemand eine Idee?
// In Main int iNumber = 0; DLink *myList = new DLink(1); cout << "Please add as many integer as you wish: " << endl; do { cin >> iNumber; myList->input(myList, iNumber); } while(iNumber != 0); // in der Funktion Input if(!has(myList, iNumber)) { myList->insert(new DLink(iNumber)); } else { cout << "Integer was not added since it's already in the list!" << endl; } // in der Funktion has DLink* linkElement = myList; while(linkElement != NULL) { if (linkElement->getContent() == iValue) { return true; linkElement = linkElement->suc; } return false; }
-
DLink* linkElement = myList; while(linkElement != NULL) { if (linkElement->getContent() == iValue) { return true; linkElement = linkElement->suc; } //wenn du hier schon retarn false schreibst, wird es schon immer beim allerersten schleifendurchgang aufgerufen, es wird also immer nur das erste element geprüft. } return false;
-
return true; linkElement = linkElement->suc;Sowas ist natürlich auch Blödsinn, das weitergehen in linkElement wird nie ausgeführt - warum steht es überhaupt da drin...?
-
Ich schätze mal es stand im if-Block und nicht in der While-Schleife, weil spät und ich doof gestern Nacht

Nee, jetzt wo du das sagst seh ich das auch sofort...-.-''
Danke für den Hinweis^^

Edit:
bool DLink::has(DLink* myList, int iValue) { DLink* linkElement = myList; while(linkElement != NULL) { if (linkElement->getContent() == iValue) { return true; } linkElement = linkElement->suc; } return false; }und es funktioniert direkt^^
Manchmal braucht man eben 4 Augen um so dumme Fehler zu finden

Thread kann closed undso^^
