Datastructures generici in C

voti
2

Sto cercando nella creazione di un BST generico. Niente di speciale non COTS, ma sto cercando di decidere il modo migliore per tenere traccia del tipo di void *. Ecco l'interfaccia per i nodi:

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

Tuttavia, quando scrivo aggiungere / rimuovere, avrò bisogno di fare confronti, quindi avrò bisogno di tenere traccia del tipo di dati che i dati punta a, giusto?

idea di base è quella di avere un NODE_TYPE enum e un compareTreeNodes funzione che riceve i due TreeNodes ed enum come un terzo arg. Ciò consentirebbe la funzione per determinare che cosa di esercitare la void * a.

Eventuali altri / migliori pensieri?

È pubblicato 14/10/2010 alle 14:35
fonte dall'utente
In altre lingue...                            


2 risposte

voti
4

Tuttavia, quando scrivo aggiungere / rimuovere, avrò bisogno di fare confronti, quindi avrò bisogno di tenere traccia del tipo di dati che "i dati" punta a, giusto?

Guardate come qsort()risolve questo problema. E ', inoltre, ha bisogno di lavorare sui tipi di dati arbitrari. In sostanza, si delega confronto agli utenti, attraverso un puntatore a funzione.

Risposto il 14/10/2010 a 14:38
fonte dall'utente

voti
3

Ho assumere un singolo BST avrà un solo tipo di dati in essa contenuti. In quel caso avrei fatto un incapsulante structche contiene un puntatore al nodo radice e un puntatore a una funzione di confronto. L'utente del BST avrebbe dovuto fornire una funzione adatta a inizializzazione.

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

Btw, la prima linea dovrebbe probabilmente essere typedef struct TreeNode {. Si dispone di un typdef'd anonima struct, ma rivolgersi ad una struttura con tag inesistente all'interno. Queste due versioni avrebbero funzionato:

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

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

Non si può fare auto-referenziale anonima structs.

Risposto il 14/10/2010 a 14:42
fonte dall'utente

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