tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
12
ZUGRIFFE
239
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    leooo leooo ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    Code cpp:
    1
    2
    3
    
    Knoten k;
     
    k1.haengAn("Fischers");
    Dabei müßtest du die Parameterliste der haengAn Methode natürlich ändern.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    leooo leooo ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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!
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von leooo Beitrag anzeigen
    danke für deine hilfe... ich habe das problem nun so gelöst das ich die haengAn Methode als konstruktor angelegt habe.
    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.

  5. #5
    leooo leooo ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    so habs jetzt nochmal neu gemacht... sieht auch bisher ganz gut aus, außer dass das letzte element nicht ausgegeben wird. warum nicht?
    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();
    }
    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.

    vielen dank nochmal
    Geändert von leooo (06.10.11 um 15:15 Uhr)
     

  6. #6
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    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:
    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);
    Die Zeile p = (p->next!=0) ? p->next : 0; setzt p auf p->next, soweit gesetzt, ansonsten auf 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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  7. #7
    leooo leooo ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    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;
                }
            }
        }
     

  8. #8
    leooo leooo ist offline Rookie
    Registriert seit
    Aug 2011
    Beiträge
    9
    aah ich hab schon...
    man muss statt
    while (p->next!=0)

    schreiben:
    while (p!=0)

    jetzt besteht nur noch die frage wieso?

     

  9. #9
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von leooo Beitrag anzeigen
    aah ich hab schon...
    man muss statt
    while (p->next!=0)

    schreiben:
    while (p!=0)

    jetzt besteht nur noch die frage wieso?
    Ganz logisch: solange p ein gültiges Listenelement / Knoten ist, gibst du es aus. Wenn nicht nicht.

    Und wie gesagt, es würde Sinn machen die Begriffe Liste und Knoten nicht zu vermischen. Jeder deiner "Knoten" ist eine Liste und hat ein kopf, ende, next. Das ist unnötig.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von ComFreek Beitrag anzeigen
    Die Zeile p = (p->next!=0) ? p->next : 0; setzt p auf p->next, soweit gesetzt, ansonsten auf 0.
    Äh...
    Code cpp:
    1
    
    p = p->next;
    macht das auch.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  11. #11
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

  12. #12
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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:
    Code c:
    1
    2
    3
    4
    
    if (p->next == 0)
      p = p->next;
    else
      p = p->next;
    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.

    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.

  13. #13
    Avatar von ComFreek
    ComFreek ComFreek ist offline [x] Let it be logic!
    tutorials.de Moderator
    Registriert seit
    Jun 2009
    Beiträge
    2.358
    Blog-Einträge
    4
    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.


    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.
    Da hast du Recht!
    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 erreichbarSicherheit in PHP-Codes schaffenGoogle Chrome-Extension für tutorials.dejson_compress()

Ähnliche Themen

  1. Doppelte Verkettung
    Von stiffy im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 4
    Letzter Beitrag: 27.11.07, 23:37
  2. indesign - verkettung von textrahmen
    Von corbstuhl im Forum Desktop Publishing (DTP)
    Antworten: 1
    Letzter Beitrag: 25.01.05, 21:23
  3. Problem mit Verkettung
    Von Trash im Forum PHP
    Antworten: 8
    Letzter Beitrag: 31.12.04, 12:19
  4. Verkettung abspeichern
    Von mike_abc im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 02.05.04, 11:47
  5. DLL Listen- Absturz, Listen übergeben
    Von haemmer im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 05.02.04, 21:00