Hallo Reaper,
zu 1. und 2. kann ich helfen.
- ich will eine lange liste aus
elementen haben, am besten indem ein
element einen zeiger auf das nächste hat.
nun haben die elemente aber verschiedene
typen. wie kann ich das elegant
realisieren?
Dies könntest Du über Unions realisieren, oder mittels Type-Casting.
Wenn Du Unions nimmst, dann ist das ganze etwas sauberer, es fällt nicht sehr auf, daß die Elemente verschiedene Typen haben. Der Nachteil ist, daß jede Variable immer so groß ist wie die größte Variable in der Union:
union NumericType
{
char cValue;
int iValue;
long lValue;
};
Hier würde also immer Platz für ein long reserviert werden.
Wenn Du Typecasting benutzt, dann kannst Du das umgehen. Du legst ein „leer“-Struct an, in dem nur der Zeiger auf das nächste Element steht und der Typ als Integer-Zahl (oder Enum).
Dann legst Du für jeden unterschiedlichen Typ ein Struct an, daß gleich anfängt, aber
dann unterschiedlich weitergehen kann.
Anhand der Typen-Nummer kannst Du dann entscheiden, wie der Rest behandelt werden kann. Sieh’ Dir am besten mal das folgende Beispiel an:
#include
struct LEER
{
LEER *lpNext;
int iType; // = 0
};
struct BEISPIEL1
{
LEER *lpNext;
int iType; // = 1
int iBeispiel1;
};
struct BEISPIEL2
{
LEER *lpNext;
int iType; // = 2
char cBeispiel2;
};
LEER *lpStart;
void CreateList()
{
BEISPIEL1 *lpNew1 = new BEISPIEL1;
LEER *lpNewLeer = new LEER;
BEISPIEL2 *lpNew2 = new BEISPIEL2;
lpNew1->lpNext = (LEER *)lpNewLeer;
lpNewLeer->lpNext = (LEER *)lpNew2;
lpNew2->lpNext = NULL;
lpNew1->iType = 1;
lpNewLeer->iType = 0;
lpNew2->iType = 2;
lpStart = (LEER *)lpNew1;
}
void DeleteList()
{
LEER *lpCur,*lpNext;
lpCur = lpStart;
while (lpCur!=NULL)
{
lpNext = lpCur->lpNext;
delete lpCur;
lpCur = NULL;
lpCur = lpNext;
}
}
void main()
{
BEISPIEL1 *lpBsp1;
BEISPIEL2 *lpBsp2;
LEER *lpLeer;
LEER *lpCur;
CreateList();
lpCur = lpStart;
while (lpCur!=NULL)
{
switch(lpCur->iType)
{
case 1:
lpBsp1 = (BEISPIEL1 *)lpCur;
printf(„Eintrag ist vom Typ BEISPIEL1\n“);
break;
case 2:
lpBsp2 = (BEISPIEL2 *)lpCur;
printf(„Eintrag ist vom Typ BEISPIEL2\n“);
break;
default:
lpLeer = lpCur;
printf(„Eintrag ist vom Typ LEER oder unbekannt\n“);
break;
}
lpCur = lpCur->lpNext;
}
DeleteList();
}
- Was ist eigentlich die Bessere Lösung,
einen Array aus Elementen zu definieren,
oder ein Element, das wiederum einen
Zeiger auf ein weiteres Element enthält,
so wie ich es vorhatte?
Das kommt darauf an, was Du machen möchtest. Wenn Du häufig ungeordnet auf verschiedene Elemente zugreifen mußt (random access), dann ist ein Array besser, weil Du eben direkt über den Index auf ein Element zugreifen kannst. Der Prozessor kann die Adresse leicht über Index*Struct-Größe errechnen.
Bei einer verketteten Liste dagegen muß man immer am Anfang anfangen und sich dann weiterbewegen, bis man das gesuchte Element gefunden hat. Das ist natürlich wesentlich aufwendiger.
Allerdings kann man bestimmte Sachen, wie z. B. Sortieren, Löschen und Einfügen von Einträgen bei Linked Lists leichter machen, da man nur die Pointer ändern, nicht aber die ganzen Structs kopieren muß.
Bei 3. und 4. kann ich leider nicht helfen. Aber wo bekommt man den Half-Life Source?
–Mathias Ricken