struct in verketteter liste

FJK

Erfahrenes Mitglied
Hallo

Borland C++ 0.5 win xp

Hab noch eine frage will sie aber lieber in einen zweiten Thema erstellen

Ich Habe eine Verkettete Lieste geschrieben
wo ich als Daten einen AnsiString habe.
Ich brauche aber ein struct.

wie kann ich das anstellen
 
Zuletzt bearbeitet:
Hi,
versuchs doch mal so:

Code:
struct MyStringData{

        string data1;
        string data2
};

struct Liste{

        MyString* element; //Zeiger auf die Datenstruktur (Datenteil der Liste)
        Liste* next; //Zeiger auf den Rest der Liste
};

Gruß

RedWing
 
Hallo

kannst du mir nochmal genau erklären
was dieser Zeiger soll bzw worauf er zeigt


MyString* element; //Zeiger auf die Datenstruktur (Datenteil der Liste)
 
Zuletzt bearbeitet:
FJK hat gesagt.:
Hallo

kannst du mir nochmal genau erklären
was dieser Zeiger soll bzw worauf er zeigt


MyString* element; //Zeiger auf die Datenstruktur (Datenteil der Liste)

guten leitwert flo

Klar element ist ein Zeiger auf die Struktur MyStringData, sprich wenn du ihn füllen willst
musst du Speicherplatz für ein MyStringData Objekt allokalisieren.

Könnte ungefähr so aussehen:

Code:
void insert(Liste* l, const string& element1, const string& element2){

        //Kreire neue Liste 
        if(l == NULL){

                l = new Liste;
                //Fülle den Datenteil
                l->element = new MyStringData;
                l->element->data1 = element1;
                l->element->data2 = element2;
                //Lasse next auf NULL zeigen
//edit
       //         l->element->next = NULL;

                l->next =  NULL;
        }
        else
                //laufe liste entlang
}

Gruß

RedWing
 
Zuletzt bearbeitet:
ok

ich schreibe einen Zeiger der auf die Struktur Zeigt

wie schreibe ich denn eine Funktion die die Daten Zurückliefert
spricht ein struct als rückgabewert
oder muss ich den Zeiger als Rückgabe Wert nehmen
 
Zuletzt bearbeitet:
Hallo,
wenn du der entsprechenden Funktion einen Zeiger auf die Struktur übergibst,
brauchst du keinen Wert mehr zurückgeben, da die Funktion dann mit einer
Referenz auf das Originalobjekt arbeitet und dein Original(Aufruf) Objekt nach dem
Funktionsaufruf die gewünschten Änderungen besitzt.

Aber:
Wenn du das dennoch willst, definiere dir eine Funktion folgendermaßen:
Code:
MyStringData* createNewDataBlock(const string& elem1, const string& elem2){
  MyStringData* d = new MyStringData;
  d->data1 = elem1;
  d->data2 = elem2;
  return d;
}
Aufruf:
Code:
MyStringData* test = createNewDataBlock("init", "init");

Aber dann darfst du nicht vergessen test nach Verwendung via delete wieder
freizugeben

Gruß

RedWing
 
Hallo

also so:

Code:
class TListe
{
  public:
    TListe (void);
    TListe (TSolarInfo *neueDaten);
    ~TListe(void);

   void FrontAdd (TSolarInfo *neueDaten);
   void Clear (int Nr);
   void Exchange (int Zahl1, int Zahl2);
   int Count (void);

 

  private:
   TListenelement *Wurzel;
   
};

Code:
class TListenelement
{
  friend class TListe;

  public:
   TListenelement (TSolarInfo *neueDaten, TListenelement *next = NULL);
   ~TListenelement(void);
   int GetDaten(int Nr);

  private:
   TSolarInfo *Daten;
   TListenelement *naechster;

struct TSolarInfo
 {
  AnsiString Name;
  int x, y, z;
 };
};

irgendwie fkt das nicht kannst du mir mal bei der deklation helfen
 
Zuletzt bearbeitet:
Hallo,
das sieht doch schonmal ganz gut aus, außer das die struct wohl nicht in jedem File(*.h)
bekannt ist. Ich habs jetzt mal so auseinandergenommen:

tlistenelement.h:
Code:
#ifndef T_LISTENELEMENT_H
#define T_LISTENELEMENT_H

struct TSolarInfo
{
   AnsiString Name;
   int x, y, z;
};

class TListenelement
{

  public:

   TListenelement (TSolarInfo *neueDaten, TListenelement *next = NULL);
   ~TListenelement(void);
   int GetDaten(int Nr);

 private:
   TSolarInfo *Daten;
   TListenelement *naechster;

};
#endif

tliste.h
Code:
#ifndef T_LISTE
#define T_LISTE

class TSolarInfo; //forward declaration
class TListe
{
  public:
    TListe (void);
    TListe (TSolarInfo *Daten1);
    ~TListe(void);

   void FrontAdd (TSolarInfo *neueDaten);
   void Clear (int Nr);
   void Exchange (int Zahl1, int Zahl2);
   int Count (void);

 

  private:
   TListenelement *Wurzel;
   
};
#endif

Wenns dann an die entsprechenden Implementierungen geht (*.cpp) musst du die
entsprechenden *.h Files natürlich includen. Man sollte mit der includierung immer nur da
wo wirklich nötig ist includieren(*.cpp) da so der Übersetzungprozess verkürzt werden kann,
deswegen meine Forward deklarationen...
Die Makros "#ifndef ... #endif" schützen davor falls du ein Headerfile zwei mal ausversehen
inkludieren solltest, das keine Doppeldeklarationen der Klassen auftritt.

Gruß

RedWing
 
Zuletzt bearbeitet:
ah danke

aber eine Frage muss ich noch stellen

Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UListe.h"
#include "UListenelement.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//================================================================
TListe::TListe (void)
{
 Wurzel = NULL;
}
//================================================================
TListe::TListe (TSolarInfo *neueDaten)
{
 Wurzel = new TListenelement(TSolarInfo *neueDaten, NULL);
}
//================================================================

ich bekomme folgende fehler:

[C++ Fehler] UListe.cpp(21): E2108 Ungültige Verwendung von typedef 'TSolarInfo'

[C++ Fehler] UListe.cpp(21): E2285 Keine Übereinstimmung 'TListenelement::TListenelement(undefined,int)' gefunden




ich versuche ein Konstrucktor zu schreiben der einen ersten daten satz erstellt

danke im voraus
 
Zuletzt bearbeitet:
FJK hat gesagt.:
ah danke

aber eine Frage muss ich noch stellen

Code:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UListe.h"
#include "UListenelement.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

//================================================================
TListe::TListe (void)
{
 Wurzel = NULL;
}
//================================================================
Liste::TListe (TSolarInfo *neueDaten)
{
 Wurzel = new TListenelement(TSolarInfo *neueDaten, NULL);
}
//================================================================

ich bekomme folgende fehler:

[C++ Fehler] UListe.cpp(21): E2108 Ungültige Verwendung von typedef 'TSolarInfo'

[C++ Fehler] UListe.cpp(21): E2285 Keine Übereinstimmung 'TListenelement::TListenelement(undefined,int)' gefunden




ich versuche ein Konstrucktor zu schreiben der einen ersten daten satz erstellt

danke im voraus

guten leitwert flo


Solange die struct wie oben beschrieben in "UListenelement.h" definiert ist sollte
es eigentlich keine Probleme geben.
Aber versuch mal folgendes:

Code:
TListe::TListe (struct TSolarInfo *neueDaten)
{
 Wurzel = new TListenelement(TSolarInfo *neueDaten, NULL);
}
 
Zurück