Generic datastructures w C

głosy
2

Szukam do tworzenia rodzajowego BST. Nic nadzwyczajnego nie łóżeczka dla dzieci, ale staram się zdecydować, najlepszy sposób, aby śledzić tego typu void *. Oto interfejs dla węzłów:

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

Jednak, gdy piszę dodać / usunąć, będę musiał robić porównań, stąd Muszę śledzić typu danych, że „dane” jest skierowana do, prawda?

Podstawowym założeniem jest to, aby mieć NODE_TYPE enum a compareTreeNodes funkcyjne, które odbiera dwa TreeNodes i enum jako 3rd arg. Pozwoliłoby to funkcja celu ustalenia, co do oddania void * na.

Wszelkie inne / lepsze myśli?

Utwórz 14/10/2010 o 14:35
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
4

Jednak, gdy piszę dodać / usunąć, będę musiał robić porównań, stąd Muszę śledzić typu danych, że „dane” jest skierowana do, prawda?

Spójrz, jak qsort()rozwiązuje ten problem. To też musi pracować na dowolnych typów danych. Zasadniczo, można powierzyć porównania użytkownikom, poprzez wskaźnik funkcji.

Odpowiedział 14/10/2010 o 14:38
źródło użytkownik

głosy
3

Zakładam pojedynczy BST będą mieć tylko jeden typ danych w nim. W tym przypadku chciałbym zrobić Encapsulating structktóry zawiera wskaźnik do węzła głównego i wskaźnik do funkcji porównania. Użytkownik swojej BST musiałby zapewniać odpowiednią funkcję w inicjalizacji.

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

Btw, to pierwsza linia powinna prawdopodobnie typedef struct TreeNode {. Masz typdef'd anonimowy struct, ale odnoszą się do nieistniejącego znakowanego struktury wewnątrz. Te dwie wersje będą pracować:

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

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

Nie można zrobić własny referential anonimowy structs.

Odpowiedział 14/10/2010 o 14:42
źródło użytkownik

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