2010-10-28 42 views
3

所以我很難找出如何克服這個問題。對其他類型重複使用相同的c ADT

舉個例子,我有一個紅黑樹的實現與項目工作:

typedef unsigned long int Key; 
struct rbt_node{ 
    Item item; 
    int color; 
    Key key; 
    struct rbt_node* parent; 
    struct rbt_node* left; 
    struct rbt_node* right; 
}; 

然後在Item.hi定義我將要使用的結構,例如:

typedef struct _something* Item; 

這樣我就可以從樹實現中解耦物品了。如果我想重用其他類型的ADT,則會出現問題。

此刻我將不得不定義一個Item2.h,並將rbt.c/rbt.h複製到rbt2.c/rbt2.h並將它們更改爲使用Item2.h並更改函數名稱。沒有更清潔的方法嗎?

我發現這個C double linked list with abstract data type,但它似乎有一些問題,取決於結構的體系結構和大小,我不是非常瞭解。

我在尋找這種用法:
rbt_insert(rbt_of_something, something);
rbt_insert(rbt_of_somethingElse, somethingElse);

感謝

+1

有了一些頭文件和預處理器,你可以模仿模板。 – leppie 2010-10-28 09:57:13

+1

在與您鏈接的問題的最後一個答案中,找到了關於如何在Linux內核中完成這些操作的鏈接。我認爲這是這類策略的一個很好的解讀。 – 2010-10-28 10:10:10

+0

@Jens Gustedt它看起來很有趣,也是一個非常好的資源,我得看一看。謝謝 – GriffinHeart 2010-11-02 01:23:58

回答

2

使項目成員void*。然後定義用於分配/讀取項目以執行所需演員表的功能或宏。例如

FILE* rbt_fileFromNode(struct rbt_node* node); 

如果你想成爲真正的聰明,你有一個類型的固定數量的你想擺在那裏,添加一個枚舉rbt_node或rbt_tree存儲項目的類型。

+0

我結束了這個解決方案。用空洞實現rbt,然後用宏製作.h以處理每種類型所需的類型。 – GriffinHeart 2010-11-02 01:22:44

3

你可以把你所有的項目定義在一個單獨的頭文件,並使用預處理程序選擇正確的一個:

#ifdef SOMETHING 
typedef struct _something* Item; 
#elif SOMETHINGELSE 
typedef struct _somethingElse* Item; 
#else 
#error no definition for Item. Use -D flag to specify Item definition. 
#endif 

然後編譯時,只需使用-D參數來定義這些宏之一。

+0

您可能希望使用push/pop宏,以便在編譯時使用多於1種類型。 – leppie 2010-10-28 10:23:17

+0

我不明白這是如何讓我在同一個文件中爲兩種不同類型的項目使用相同的rbt實現。你能詳細說明一下嗎? – GriffinHeart 2010-10-28 10:26:21

+0

@GriffinHeart:使用push/pop宏,或者在包含標題後使用'#undef',然後定義下一個,依此類推。 – leppie 2010-10-28 10:27:28

相關問題