Generiske datastrukturer i C

stemmer
2

Jeg ser inn i å skape en generisk BST. Ikke noe fancy ingen COTS, men jeg prøver å bestemme den beste måten å holde oversikt over hvilken type tomrommet *. Her er grensesnittet for nodene:

typedef struct
{
   void *data;
   struct TreeNode *left;
   struct TreeNode *right;  
} TreeNode;

Men når jeg skriver legg til / fjern, jeg trenger å gjøre sammenligninger, derfor jeg trenger for å holde styr på hvilken type data som data peker på, ikke sant?

Grunnleggende ideen er å ha en enum NODE_TYPE og en funksjon compareTreeNodes som mottar de to TreeNodes og enum som en tredje arg. Dette gir funksjonen til å finne ut hva du skal kaste tomrommet * til.

Eventuelle andre / bedre tanker?

Publisert på 14/10/2010 klokken 13:35
kilden bruker
På andre språk...                            


2 svar

stemmer
4

Men når jeg skriver legg til / fjern, jeg trenger å gjøre sammenligninger, derfor jeg trenger for å holde styr på hvilken type data som "data" peker på, ikke sant?

Se på hvordan qsort()løser dette problemet. Det også, må jobbe med vilkårlige datatyper. I utgangspunktet delegere du forhold til brukerne, gjennom en funksjonspeker.

Svarte 14/10/2010 kl. 13:38
kilden bruker

stemmer
3

Jeg antar at en enkelt BST vil ha bare én type data i den. I så fall vil jeg gjøre et innkapslingsmateriale structsom inneholder en peker til rotnoden og en peker til en sammenligningsfunksjon. Brukeren av din BST måtte gi en passende funksjon ved initialisering.

typedef struct {
    TreeNode *root;
    int (*compar)(const void *, const void *);
} Tree;

Btw, bør den første linjen trolig være typedef struct TreeNode {. Du har en typdef'd anonym struct, men henviser til en ikke-eksisterende merket struct inne. Disse to versjoner ville fungere:

typedef struct TreeNode {
    void *data;
    struct TreeNode *left, *right;
} TreeNode;

typedef struct TreeNode TreeNode;
struct TreeNode {
    void *data;
    TreeNode *left, *right;
};

Du kan ikke lage selvreferer anonym structs.

Svarte 14/10/2010 kl. 13:42
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more