Это не совсем технический вопрос, так как я знаю, что C достаточно для того, чтобы делать то, что мне нужно (я имею в виду, что «не позволяю языку встать на вашем пути» '), поэтому этот вопрос в основном является вопросом «какое направление принять».«Многоцелевой» реализация связанного списка в чистом виде C
Ситуация: В настоящее время я беру курс усовершенствованных алгоритмов, и для того, чтобы «расти как программисты», я должен использовать чистый C для реализации практических заданий (он работает хорошо: в значительной степени любая небольшая ошибка вы заставляете вас полностью понять, что вы делаете, чтобы исправить это). В ходе реализации я, очевидно, сталкиваюсь с проблемой необходимости «базовых» структур данных с нуля: на самом деле не только связанные списки, но также стеки, деревья и т. Д.
Я сосредоточен на списках в этом разделе, потому что это, как правило, структура, в которой я использую много в программе, либо как «основную» структуру, либо как «вспомогательную» структуру для других более крупных (например, хеш-дерево, которое разрешает конфликты, используя связанный список).
Для этого требуется, чтобы в списке хранились элементы множества разных типов. Я предполагаю здесь как предпосылку, что я не хочу перекодировать список для каждого типа. Таким образом, я могу придумать с этими альтернативами:
- Составление списка пустых указателей (своего рода безвкусный; труднее отлаживать)
- Making только один список, но имеющий союз как «тип элемента», содержащий все типы элементов, которые я буду использовать в программе (проще отлаживать: тратить пространство, если элементы не имеют одинакового размера)
- Использование макроса препроцессора для регенерации кода для каждого типа в стиле SGLIB, 'имитация' C++ STL (творческое решение, не пустая трата, элементы имеют явный тип, на самом деле они есть, когда они возвращаются; любое изменение i п список кодов может быть очень драматичным)
- Ваша идея/решение
Для того, чтобы этот вопрос ясный: который один из вышеперечисленных лучше всего?
PS: Поскольку я в основном в академическом контексте, меня также очень интересует мнение людей, работающих с чистым C в этой отрасли. Я понимаю, что большинство чистых программистов C находятся во встроенных областях устройств, где я не думаю, что такая проблема, с которой я столкнулась, является общей. Однако, если кто-то знает, как это делается «в реальном мире», мне было бы очень интересно ваше мнение.
Почему недействительными указатели сделать это трудно отлаживать? Это тривиально в любом типе отладчика с достойной оценкой выражения. –
Это на самом деле, и вы прямо сейчас, когда я задумываюсь об этом. Мои предыдущие алгоритмы профессора вроде принудили это сопротивление к пустотелым указателям на нас. Но это все еще делает код немного трудным для понимания простым чтением. –
Ну, вы * должны * избегать void * везде, где язык предоставляет возможности для этого ... но если вы хотите полиморфизм в c ... – dmckee