Почему следующая функция для определения длины связанного списка возвращает неверное значение?

#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. Это ответило на ваш вопрос?