Как рекурсивно переделать список в массив?

Нужно написать функцию, которая принимает одним параметром адрес начала списка а возвращает адрес массива целых длиною на 1 больше списка и в первый елемент массива заносит длину этого массива.

Я написал эту функцию с циклами. Покажите, как можно создать такую же функцию применяя только рекурсию?

Вот моя функция:

int *list_to_array(struct list_elem *list)
{
        enum {max_array_size = 128};
        int len = 0;
        struct list_elem *tmp = list;
//Подсчет количества елементов списка:
        while( tmp ){
                len++;
                tmp = tmp->next;
        }
        if(len+1 > max_array_size){
                puts("list is too long");
                return NULL;
        }

//Создание массива и его заполнение:
        int *array;
        array = malloc((len+1)*sizeof(int));
        *array = len;
        for(int i = 1; i <= len; i++){
                *(array+i) = list->data;
                list = list->next;
        }
        return array;
}

Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Раз нельзя передавать дополнительную информацию через параметры функции, будем хранить их в статических переменных. Например накопленную длину списка:

int *list_to_array(struct list_elem *list) {
    static int length = 0;
    int *array;
    if (list == NULL) {
        array = malloc((length + 1) * sizeof(int));
        array[0] = length;
    } else {
        ++length;
        array = list_to_array(list->next);
        --length;
        array[length + 1] = list->data;
    }
    return array;
}
→ Ссылка