Generieke datastructuren in C

stemmen
2

Ik ben op zoek naar het creëren van een generieke BST. Niets bijzonders geen COTS, maar ik ben op zoek naar de beste manier om bij te houden van het type van de leegte * houden beslissen. Hier is de interface voor de knooppunten:

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

Echter, wanneer ik schrijf toevoegen / verwijderen, zal ik moeten vergelijkingen doen, dus zal ik nodig om bij te houden van het type gegevens dat data verwijst naar, rechts houden?

Basisidee is om een ​​enum NODE_TYPE en een functie compareTreeNodes dat de twee TreeNodes ontvangt en de enum als een 3e arg hebben. Dit zou de functie om te bepalen wat de leegte * moeten uitbrengen.

Alle andere / betere gedachten?

De vraag is gesteld op 14/10/2010 om 14:35
bron van user
In andere talen...                            


2 antwoorden

stemmen
4

Echter, wanneer ik schrijf toevoegen / verwijderen, zal ik moeten vergelijkingen doen, dus zal ik nodig om bij te houden van het type gegevens dat "data" verwijst naar, rechts houden?

Kijk hoe qsort()lost dit probleem. Ook zij dient te werken aan willekeurige data types. Kortom, u delegeren vergelijking met gebruikers, door middel van een functie pointer.

antwoordde op 14/10/2010 om 14:38
bron van user

stemmen
3

Ik neem aan dat een enkele BST zal slechts één type gegevens in te hebben. In dat geval zou ik een inkapselend maak structeen pointer naar het hoofdknooppunt en een pointer naar een vergelijkingsfunctie bevat. De gebruiker van uw BST zou hebben om een passende functie te geven bij de initialisatie.

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

Btw, moet uw eerste lijn waarschijnlijk typedef struct TreeNode {. Je hebt een typdef'd anoniem struct, maar verwijzen naar een niet-bestaande gelabelde structuur binnen. Deze twee versies zou werken:

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

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

Je kunt niet zelf-referentiële anoniem te maken structs.

antwoordde op 14/10/2010 om 14:42
bron van user

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