Это не совсем технический вопрос, так как я знаю, что C достаточно для того, чтобы делать то, что мне нужно (я имею в виду, если бы не "позволить языку встать на вашем пути" ), поэтому этот вопрос в основном "какое направление принять".
Ситуация такова: в настоящее время я беру курс усовершенствованных алгоритмов, и для того, чтобы "расти как программисты", я должен использовать чистый C для реализации практических заданий (он работает хорошо: в значительной степени любая небольшая ошибка вы заставить заставить вас полностью понять, что вы делаете, чтобы исправить это). В ходе реализации я, очевидно, сталкиваюсь с проблемой необходимости "базовых" структур данных с нуля: на самом деле не только связанные списки, но также стеки, деревья и т.д.
Я сосредотачиваюсь на списках в этом разделе, потому что обычно это структура, в которой я использую много в программе, либо как "главную" структуру, либо как "вспомогательную" структуру для других более крупных (например, хеш дерево, которое разрешает конфликты, используя связанный список).
Это требует, чтобы в списке хранились элементы из множества разных типов. Я предполагаю здесь, как предпосылку, что я не хочу перекодировать список для каждого типа. Итак, я могу придумать эти альтернативы:
- Составление списка указателей void (kinda inelegant; сложнее отладка)
- Создание только одного списка, но имеющий union как "тип элемента", содержащий все типы элементов, которые я буду использовать в программе (проще отлаживать; тратить пространство, если элементы не имеют одинакового размера )
- Использование макроса препроцессора для регенерации кода для каждого типа в стиле SGLIB, 'имитация' С++ STL (творческое решение, не теряет пространства, элементы имеют явный тип, который они на самом деле находятся, когда они возвращаются, любое изменение в коде списка может быть действительно драматичным)
- Ваша идея/решение
Чтобы сделать вопрос понятным: какой из вышеперечисленных вариантов лучше?
PS: Поскольку я в основном в академическом контексте, меня также очень интересует мнение людей, работающих с чистым C в этой отрасли. Я понимаю, что большинство чистых программистов C находятся во встроенных областях устройств, где я не думаю, что такая проблема, с которой я столкнулась, является общей. Однако, если кто-то знает, как это делается "в реальном мире", мне было бы очень интересно ваше мнение.