#recursion #data-structures #linked-list #static #singly-linked-list
#рекурсия #структуры данных #связанный список #статический #single-linked-list
Вопрос:
Пожалуйста, определите ошибку в логике. Почему следующая функция для определения длины связанного списка возвращает неверное значение?
int getCount(struct Node* head){
static int count =0;
Node* ptr = head;
if(ptr==NULL)
return count;
else
{
count ;
getCount(ptr->next);
}
}
Комментарии:
1. Какое неверное значение вы получаете? Какой требуемый результат и ваш результат?
Ответ №1:
Поскольку подпись вашей функции указывает, что она должна возвращать количество узлов, else
блок проблематичен: он никогда ничего не возвращает.
Кроме того, вам действительно не нужно count
. Лучше использовать возвращаемое значение и добавить к нему 1. Проблема в static count
том, что тогда вы можете получить правильный результат только для одного основного (нерекурсивного) вызова getCount
. Если вы вызовете ее снова для другого (или даже того же) списка, она не будет перезапущена с 0, и поэтому даст неверные результаты.
Итак:
int getCount(struct Node* head){
Node* ptr = head;
if(ptr==NULL)
return 0;
else
{
return 1 getCount(ptr->next);
}
}
Также обратите внимание, что переменная ptr
на самом деле не служит цели. Просто обойдитесь без этого:
int getCount(struct Node* head){
if(head==NULL)
return 0;
else
return 1 getCount(head->next);
}
Комментарии:
1. Спасибо за ответ. Я обновил рассматриваемый код. не могли бы вы проверить, почему она возвращает неверное значение? (количество является статическим)
2. Пожалуйста, не меняйте код в вопросе. Это делает мой ответ неуместным.
3. Хорошо, отменил изменение. но можете ли вы мне помочь. если я заменю «getCount (ptr-> next)» на «return getCount (ptr-> next)». это должно работать, поскольку счетчик статичен. но это не работает. Не могу понять.
4. Смотрите дополнение к моему ответу во втором абзаце. С
static count
иreturn getCount
это работает правильно только в первый раз.5. Это ответило на ваш вопрос?