Повторное использование того же c ADT для других типов - PullRequest
3 голосов
/ 28 октября 2010

Так что у меня возникли проблемы с определением, как это преодолеть.

Возьмите, к примеру, у меня есть реализация красного черного дерева, которая работает с элементами:

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;
};

, затем в элементе.hi определите структуру, которую я буду использовать, например:

typedef struct _something* Item;

Таким образом, я отделяю Предмет, содержащийся в реализации дерева.Проблема возникает, если я хочу повторно использовать ADT для других типов.

В данный момент мне нужно будет определить Item2.h и скопировать rbt.c / rbt.h в rbt2.c / rbt2.hи измените их, чтобы использовать Item2.h и измените имена функций.Разве нет более чистого способа?

Я нашел этот C двойной связанный список с абстрактным типом данных , но, похоже, есть некоторые проблемы в зависимости от архитектуры и размера структур, которыеЯ не очень хорошо осведомлен.

Я ищу такой способ использования:
rbt_insert(rbt_of_something, something);<br> rbt_insert(rbt_of_somethingElse, somethingElse);

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 октября 2010

Вы можете поместить все определения элементов в один заголовочный файл и использовать препроцессор, чтобы выбрать правильное:

#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 для определения одного из этих макросов.

2 голосов
/ 28 октября 2010

Сделать предмет членом void*. Затем определите функции или макросы, которые вы используете для назначения / чтения элементов для выполнения необходимых приведений. например,

FILE* rbt_fileFromNode(struct rbt_node* node);

Если вы хотите быть по-настоящему умным, и у вас есть фиксированное количество типов, которые вы хотели бы добавить туда, добавьте enum к rbt_node или rbt_tree, чтобы сохранить тип элемента.

...