ERLEDIGT
NEIN
NEIN
ANTWORTEN
12
12
ZUGRIFFE
239
239
EMPFEHLEN
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
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
-
06.10.11 13:40 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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:Dabei müßtest du die Parameterliste der haengAn Methode natürlich ändern.Code cpp:1 2 3
Knoten k; k1.haengAn("Fischers");
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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 :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
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!
-
06.10.11 14:07 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
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ßGeändert von deepthroat (06.10.11 um 14:29 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
so habs jetzt nochmal neu gemacht... sieht auch bisher ganz gut aus, außer dass das letzte element nicht ausgegeben wird. warum nicht?
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.Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
#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(); }
vielen dank nochmal
Geändert von leooo (06.10.11 um 15:15 Uhr)
-
06.10.11 15:22 #6
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:
Die Zeile p = (p->next!=0) ? p->next : 0; setzt p auf p->next, soweit gesetzt, ansonsten auf 0.Code cpp:1 2 3 4 5 6 7 8
do { cout<< "Name: "<<p->Film; cout<<endl; p = (p->next!=0) ? p->next : 0; } while(p!=0);
Diese Form mit dem Fragezeichen ist eine Kurzform für:
Code cpp:1 2 3 4 5 6 7 8
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++ [cpp]Hier dein Code[/cpp] nutzt, kann man deinen Code noch besser lesen.mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
mh leider funktioniert das so auch nicht... also da steht immer noch harry potter und starwars...
mein code sieht jetzt so aus:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
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?
-
06.10.11 15:48 #9
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
06.10.11 15:55 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
07.10.11 17:15 #11
Danke, meiner Meinung nach geht es aber (für Anfänger) deutlicher hervor, das wenn p->next nicht gesetzt ist, 0 zugewiesen wird.
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
-
08.10.11 08:30 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Meiner Meinung nach verkompliziert das nur den Code. Warum sollte man eine unnötige Fallunterscheidung machen?!
Im Grunde bedeutet es das gleiche wie:
In Zeile 2 kann man natürlich p->next direkt durch den Wert von p->next ersetzen, da man ihn vorher geprüft hat. Viel schlauer ist es allerdings, zu erkennen, dass sich die Fälle gar nicht unterscheiden und man die Fallunterscheidung gleich ganz weglassen kann.Code c:1 2 3 4
if (p->next == 0) p = p->next; else p = p->next;
Außerdem finde ich die Formulierung ob p->next "gesetzt" ist, gar nicht gut. p->next ist immer "gesetzt", eine Variable hat immer einen Wert. Das ist also nicht die Frage.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
08.10.11 09:29 #13
Naja, war ja nur für den Beispielcode gedacht.
Ich meinte man könnte es besser erkennen, vielleicht habe ich mich da geirrt.
Aber ich würde meinerseits nicht so viel Wert darauflegen, ob jetzt erstere oder zweitere Variante dort steht.
Da hast du Recht!Außerdem finde ich die Formulierung ob p->next "gesetzt" ist, gar nicht gut. p->next ist immer "gesetzt", eine Variable hat immer einen Wert. Das ist also nicht die Frage.
Den Ausdruck habe ich vielleicht von PHP, wo isset() false bei NULL zurückliefert
mfg ComFreek
Falls ich dir geholfen habe, würde ich mich über ein DANKE freuen!
Kenn mich am besten aus in C++, WEB-Sprachen (PHP, HTML, JavaScript) und vllt. mehr
[PHP] Überprüfen, ob Website erreichbar • Sicherheit in PHP-Codes schaffen • Google Chrome-Extension für tutorials.de • json_compress()
Ähnliche Themen
-
Doppelte Verkettung
Von stiffy im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 4Letzter Beitrag: 27.11.07, 23:37 -
indesign - verkettung von textrahmen
Von corbstuhl im Forum Desktop Publishing (DTP)Antworten: 1Letzter Beitrag: 25.01.05, 21:23 -
Problem mit Verkettung
Von Trash im Forum PHPAntworten: 8Letzter Beitrag: 31.12.04, 12:19 -
Verkettung abspeichern
Von mike_abc im Forum C/C++Antworten: 5Letzter Beitrag: 02.05.04, 11:47 -
DLL Listen- Absturz, Listen übergeben
Von haemmer im Forum C/C++Antworten: 0Letzter Beitrag: 05.02.04, 21:00





Zitieren


Login






