Хм. А если расположить массив в обратном порядке и сравнивать
индекс с нулём? От процессора зависит конечно, но часто есть
подходящие инструкции/паттерны. if (! - - index) index=41;
Ну и массиву никто не запрещает
одновременно быть и списком :-)
По сути вопроса: исходные данные для заполнения списка откуда берутся? Нельзя ли их там сразу формировать в нужном виде? Препроцессором можно много всякого сделать, но оно потом плохо читаемо.