Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Listen??? Dringend!!!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.07.2003, 10:56 Uhr
~IronMike
Gast


Hi!

Ich hab gerade ein Problem mit den Listen in c. Kennt ihr gute Tutorials für Listen? Bräuchte es schon dringend, weil ich bis morgen ein Prüfungsprogramm fertig haben soll, aber (noch) nicht ganz durchblicke!

Mfg
IronMike
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2003, 11:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
poste halt etwas code, z.b den Teil wo du Probleme hast, sag uns WO es hakt, also z.b was bedeutet der Parameter blabla da und da, usw...
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2003, 12:38 Uhr
~IronMike
Gast


Also das ist mein Code . Die Funktion wird aufgerufen und der Pointer aus der rufenden Funktion übergeben:

Die Funktion wird von Main aufgerufen, die den auf NULL gesetzten Zeiger anfang übergibt.

C++:
void AddData(LISTE *anfang)  
{
  LISTE *aktuell;
  if(anfang == NULL)
  {
     anfang = CreateListEntry(anfang);
     aktuell = anfang;
  }else
  {
   aktuell = CreateListEntry(anfang);
  }


}
Dann gehts in die CreateListEntry wo das Element angelegt werden soll.

LISTE *CreateListEntry(LISTE *Daten)
{
    if(Daten == NULL)
    {
        Daten = (struct LISTE*)malloc(sizeof(struct LISTE));
        FillData(Daten,0,LIST_TYPE_CASETTE);
        Daten->next = NULL;
    }
    else
    {        
        while(Daten->next != NULL)
            Daten=Daten->next;

        Daten->next = (struct LISTE*)malloc(sizeof(struct LISTE));
        Daten = Daten->next;
        FillData(Daten->next,0,LIST_TYPE_CASETTE);
        Daten->next = NULL;
    }

    return Daten;
}


Und wenn ich das jetzt ausführe funktioniert das Programm zwar, es wird aber immer das erste Element der Liste gefüllt! Warum?


Bearbeitung:
Tags gesetzt - loddab

Dieser Post wurde am 24.07.2003 um 12:42 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.07.2003, 13:53 Uhr
ao

(Operator)



C++:
LISTE *CreateListEntry(LISTE *Daten)
{
    if(Daten == NULL)
    {
        Daten = (struct LISTE*)malloc(sizeof(struct LISTE));
        FillData(Daten,0,LIST_TYPE_CASETTE);
        Daten->next = NULL;
    }
    else
    {        
        while(Daten->next != NULL)
            Daten=Daten->next;

        Daten->next = (struct LISTE*)malloc(sizeof(struct LISTE));

        /* ##################################### */
        Daten = Daten->next; /* DER KNACKPUNKT IST HIER!!!!!!! */
        /* ##################################### */

        FillData(Daten->next,0,LIST_TYPE_CASETTE);
        Daten->next = NULL;
    }

    return Daten;
}



Du bist vorher bis zum Ende der Liste gerannt und hast ein neues Element hintendrangehängt. Dann sagst du

C++:
Daten = Dieses neue Element;
/* paar andere Sachen */
return Daten;


d.h. du gibst nur das neue Element zurück. Der Anfang der Liste (vom ersten bis zum vorletzten) ist verloren -> Speicherleck.

Abhilfe: Wenn LISTE * Daten die gesamte Liste enthält, darfst du diesen Zeiger nicht modifizieren, sondern du brauchst in CreateListEntry einen Laufzeiger:

C++:
LISTE *CreateListEntry(LISTE *Daten)
{
    LISTE * Lauf = Daten;
    /* ab hier nur mit Lauf hantieren und Daten nicht mehr anfassen */
  
    /* am Ende: */
    return Daten;
}



Nochn Tipp: Ich hab das so verstanden, daß der Zeiger Daten für die Funktion CreateListEntry unveränderlich sein soll. Wenn das zutrifft, kannst du das mit dem const-Qualifier kennzeichnen. Du schützt dich damit vor eigenen Programmierfehlern. Der Compiler wird dich mit einer Warnung oder einem Fehler darauf hinweisen, wenn du innerhalb der Funktion das const-Attribut verletzt, indem du den Zeiger manipulierst:

C++:
LISTE *CreateListEntry(LISTE * const Daten) /* der Zeiger ist konstant, aber nicht das, worauf er zeigt */

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.07.2003, 15:30 Uhr
~IronMike
Gast


Danke,Danke,Danke!!!

Jetzt funktionierts!
Und jetzt gehts noch an die Ausgabe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: