Generisches Datenstrukturen in C

stimmen
2

Ich bin auf der Suche in eine generische BST zu schaffen. Nichts Besonderes, keine COTS, aber ich versuche, die beste Art und Weise zu entscheiden, den Überblick über die Art des void * zu halten. Hier ist die Schnittstelle für den Knoten:

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

Allerdings, wenn ich schreibe hinzufügen / entfernen, werde ich Vergleiche tun müssen, damit werde ich den Überblick über die Art der Daten behalten müssen, dass „Daten“ zeigt auf, nicht wahr?

Grundidee ist, eine ENUM NODE_TYPE und eine Funktion compareTreeNodes zu haben, die die beiden TreeNodes und die Enum als 3. arg erhält. Dies würde es ermöglichen die Funktion zu bestimmen, was die void * zu werfen.

Alle anderen / besseren Gedanken?

Veröffentlicht am 14/10/2010 um 14:35
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
4

Allerdings, wenn ich schreibe hinzufügen / entfernen, werde ich Vergleiche tun müssen, damit werde ich den Überblick über die Art der Daten behalten müssen, dass „Daten“ zeigt auf, nicht wahr?

Schauen Sie , wie qsort()dieses Problem gelöst werden . Auch er muss auf beliebigen Datentypen arbeiten. Grundsätzlich delegieren Sie Vergleich zu den Benutzern durch einen Funktionszeiger.

Beantwortet am 14/10/2010 um 14:38
quelle vom benutzer

stimmen
3

Ich gehe davon aus einem einzigen BST wird nur eine Art von Daten in ihm. In diesem Fall würde ich eine einkapselnde machen , structdie einen Zeiger auf den Wurzelknoten und einen Zeiger auf eine Vergleichsfunktion enthält. Der Benutzer Ihres BST würde eine geeignete Funktion bei der Initialisierung bereitzustellen.

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

Btw, sollte Ihre erste Linie wahrscheinlich sein typedef struct TreeNode {. Sie haben eine typdef'd anonym struct, aber im Innern zu einer nicht vorhandenen getaggten Struktur verweisen. Diese beiden Versionen funktionieren würde:

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

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

Sie können nicht selbstbezüglicher anonym machen structs.

Beantwortet am 14/10/2010 um 14:42
quelle vom benutzer

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