Как рекурсивно переделать список в массив?
Нужно написать функцию, которая принимает одним параметром адрес начала списка а возвращает адрес массива целых длиною на 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;
}