Я получаю ошибку сегмента из следующего кода. Я думаю, это как-то связано с моим вызовом функции? - PullRequest
0 голосов
/ 02 февраля 2020

Этот код должен подсчитывать все узлы, используя функцию-обертку. Это для круглого связанного списка, поэтому я указываю на задний -> следующий с темпом, а затем перемещаюсь с временным, пока темп == задний.

int count_all(node *rear) {
    int count = 0;
    if (!rear)
        return 0;
    if (rear == rear->next)
        return 1;
    return recursive_count_all(rear,count);
}

int recursive_count_all(node *rear,int &count)  {
    if (!rear)
        return 0;

    node * temp = rear->next; 

    if (rear == temp)
        return 1;
    else
        temp = temp->next;

    return recursive_count_all(rear->next, ++count);
}

1 Ответ

2 голосов
/ 02 февраля 2020

В результате вы получаете бесконечную рекурсию, потому что ваш условный возврат

if (rear == temp)
    return 1;

сравнивает ваш предыдущий узел со следующим узлом и поэтому не вернется для #nodes> 1. Вы должны прервать рекурсию условный, как только вы доберетесь до самого первого узла, с которого вы начали.

Так что-то вроде этого

int count_all(node *rear) {
    int count = 0;
    if (!rear)
        return 0;
    if (rear == rear->next)
        return 1;
    return recursive_count_all(rear,rear,count);
}

int recursive_count_all(node* n0, node *rear,int &count)  {
    if (!rear)
        return 0;

    node * temp = rear->next; 

    if (n0 == temp)
        return 1;
    else
        temp = temp->next;

    return recursive_count_all(n0, rear->next, ++count);
}
...