Согласно постановке задачи, отображаемые значения - от первого до последнего ввода. Сначала идет «5», затем «4» ...
Это определяет, как ведет себя рекурсивная функция. Сначала он сам себя вызывает или в конце? В вашем случае значения заголовка должны быть обработаны в первую очередь, поэтому рекурсивный вызов должен выполняться после обработки числа. В конце.
Тогда ваш тест if (ptr != NULL)
должен влиять только на рекурсивный вызов, а не на все тело.
Оператор ^
является исключающим ИЛИ в C ... Вероятно не то, что вы хотите (хотя можно использовать, но не так). Чтобы проверить, является ли число нечетным, просто проверьте его первый бит (с помощью & 1
) или проверьте, соответствует ли N % 2
> 0
.
Поскольку номер обрабатывается и отображается раньше (потому что рекурсивный вызов находится в конце), вы можете переносить сумму с помощью вызовов.
Я предполагаю, что отображаемая сумма должна начинаться с текущего числа (или, в качестве упражнения, просто отложите суммирование ... ).
Пример кода, который должен работать
int checkSumOfOdds(struct list *ptr, int sum) {
int isodd = ptr->value & 1;
if (isodd) sum += ptr->value;
printf("%d[%d](%s) ", ptr->value, sum, isodd ? "Yes":"No");
return ptr->next ? checkSumOfOdds(ptr->next, sum) : sum;
}
для вызова
checkSumOfOdds(headOfList, 0);
printf("\n");