Как уже упоминалось выше, я попытался использовать подход MACROS для создания функций манипулирования списком.
Легко создать подпрограмму операции INSERT, но сложно создать операции удаления и перемещения. Далее следует структура списка и подпись подпрограммы INSERT:
#define LIST_DEFINE(type) \
struct list_node_##type \
{ \
type *data; \`
struct list_node_##type *next; \
};
LIST_INSERT(&ListHead,&Data, DataType);
Где:
ListHead
- заголовок связанного списка
Data
- Данные, для которых будет создан новый узел, и данные будут вставлены в узел
DataType
- тип данных передаваемых данных
К вашему сведению, я выделяю память в функции и копирую все данные, переданные во вновь созданный узел, и они добавляют этот узел в связанный список.
Теперь, когда создается подпрограмма LIST_DELETE
, узел, который необходимо удалить, будет идентифицирован с использованием уникального идентификатора в данных. Этот идентификатор также передается в подпрограмме MACRO
как ключ, который будет заменен в расширении MACRO
. Обычная подпись может быть:
LIST_DELETE(&ListHead, DataType, myvar->data->str, char*);
Где:
ListHead
- Глава связанного списка
DataType
- тип данных данных
myvar->data->str
- Уникальный ключ
char*
- Тип ключа
Теперь, когда ключ раскрыт, этот же ключ нельзя использовать для сравнения, как если бы мы написали
if((keytype)ListHead->data->key == (keytype)key)
Расширяется до
ListHead->data->myvar->data->str == myvar->data->str
А здесь нет такой переменной, как: ListHead->data->myvar->data->str
Таким образом, этот подход не может работать для записи подпрограмм удаления, и поскольку процедуры обхода и поиска также используют уникальный ключ, с ними также столкнется та же проблема.
И, на несвязанном замечании, как определить логику сопоставления для уникального ключа, поскольку уникальный ключ может быть чем угодно.