C în structuri de date generice

voturi
2

Mă uit în crearea unui BST generic. Nimic chef de nici un COTS, dar am încercat să decidă cel mai bun mod de a ține evidența de tipul void *. Iată interfața pentru nodurile:

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

Cu toate acestea, atunci când am scrie adăuga / elimina, va trebui să fac comparații, prin urmare, am avea nevoie pentru a ține evidența de tipul de date pe care „date“ este îndreptat, nu?

Ideea de bază este de a avea un NODE_TYPE enum și o compareTreeNodes funcție care primește cele două TreeNodes și enum ca arg treia. Acest lucru ar permite funcția de a determina ce să arunce void * la.

Orice alte / gânduri mai bune?

Întrebat 14/10/2010 la 14:35
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
4

Cu toate acestea, atunci când am scrie adăuga / elimina, va trebui să fac comparații, prin urmare, am avea nevoie pentru a ține evidența de tipul de date pe care „date“ este îndreptat, nu?

Uita - te la modul în care qsort()rezolvă această problemă. Este, de asemenea, trebuie să lucreze pe tipuri de date arbitrare. Practic, delega comparație utilizatorilor, printr - un indicator de funcție.

Publicat 14/10/2010 la 14:38
sursa de către utilizator

voturi
3

Presupun un singur BST va avea doar un singur tip de date în ea. În acest caz , aș face un capsulare structcare conține un pointer la nodul rădăcină și un pointer la o funcție de comparație. Utilizatorul BST dvs. ar trebui să ofere o funcție adecvată la initializare.

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

Btw, prima linie ar trebui să fie , probabil typedef struct TreeNode {. Ai un typdef'd anonim struct, ci se referă la un struct etichetat inexistentă în interior. Aceste două versiuni ar funcționa:

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

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

Nu poți face autoreferențial anonim structs.

Publicat 14/10/2010 la 14:42
sursa de către utilizator

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