Esto no es exactamente una pregunta técnica, ya que conozco C lo suficiente como para hacer las cosas que necesito (es decir, en términos de no 'dejar que el lenguaje se interponga en tu camino '), entonces esta pregunta es básicamente una pregunta' qué dirección tomar '.Implementación de listas enlazadas 'multipropósito' en C
La situación es la siguiente: actualmente estoy tomando un curso avanzado de algoritmos, y para "crecer como programadores", debo usar C pura para implementar las tareas prácticas (funciona bien: casi cualquier pequeño error) lo que haces realmente te obliga a entender completamente lo que estás haciendo para arreglarlo). En el curso de la implementación, evidentemente me topo con el problema de tener que implementar las estructuras de datos 'básicas' desde cero: en realidad no solo listas enlazadas, sino también montones, árboles, etcétera.
Me estoy enfocando en listas en este tema porque normalmente es una estructura que termino usando mucho en el programa, ya sea como una estructura 'principal' o como una estructura 'ayudante' para otras más grandes (por ejemplo, hash tree que resuelve conflictos usando una lista enlazada).
Esto requiere que la lista almacene elementos de muchos tipos diferentes. Supongo que es una premisa que no quiero volver a codificar la lista para cada tipo. Por lo tanto, puedo llegar a estas alternativas:
- Hacer una lista de punteros void (algo poco elegante; más difícil de depurar)
- Hacer sólo una lista, pero tener un unión como 'tipo de elemento', que contiene todos los tipos de elementos que usaré en el programa (más fácil de depurar, desperdicia espacio si los elementos no son del mismo tamaño)
- Usando una macro preprocesador para regenerar el código para cada tipo, en el estilo de SGLIB, 'imitando' El STL de C++ (solución creativa; no desperdicia espacio; los elementos tienen el tipo explícito que son en realidad cuando se devuelven; cualquier cambio i Lista de códigos n puede ser muy dramática)
- Tu idea/solución
Para hacer clara la pregunta: ¿cuál de los anteriores es el mejor?
PD: Como básicamente estoy en un contexto académico, también estoy muy interesado en la opinión de las personas que trabajan con C pura en la industria. Entiendo que la mayoría de los programadores C puros están en el área de dispositivos integrados, donde no creo que este tipo de problema que estoy enfrentando sea común. Sin embargo, si alguien sabe cómo se hace 'en el mundo real', estaría muy interesado en tu opinión.
¿Por qué los punteros void hacen que sea difícil para depurar? Esto es trivial en cualquier tipo de depurador con una evaluación de expresión decente. –
En realidad lo es, y estás justo ahora que lo pienso. Mi profesor anterior de algoritmos forzó esta resistencia a los indicadores de vacío sobre nosotros. Pero aún hace que el código sea un poco difícil de entender por simple lectura. –
Bueno, * debes * evitar el vacío * donde el idioma proporcione facilidades para hacerlo ... pero si quieres polimorfismo en c ... – dmckee