Member 12752823 Ответов: 2

Вызов рекурсии связанного списка по ссылке в C


Я практикуюсь со связанными списками, используя C. Я начинающий программист, только две недели назад начал изучать язык Си.

Я очень хорошо понимаю концепцию связанного списка и пытался перевернуть связанный список с помощью рекурсии.

Я знаю, как повернуть его вспять с помощью цикла while, однако с рекурсией я застрял на том, как указать головной указатель на адрес последнего номера вместо начального адреса первого номера после того, как я переверну список.

Ниже приведена моя обратная функция. Голова определена в main, и я вызываю ее по ссылке в свою функцию. Я знаю, что могу решить эту проблему, вызвав ее по значению и просто написав в main() head=reverse(node* head); или определив head в динамической памяти и просто получив доступ к ней прямо из функции. Я не хочу этого делать. Я хочу вызвать его по ссылке из main и функции, чтобы вернуть void.

Вот моя обратная функция:
void reverse(struct node** head)
{   
    struct node* p=*head;


    if(p->link==NULL)
    {  *head=p;
        return;
    }

    reverse(&(p->link));
    p->link->link=p;
    p->link=NULL;


}

Скажем, список таков: 5 6 7 2 3 4 выход, который я получаю после обратного, равен: 5
Спасибо!

Что я уже пробовал:

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

2 Ответов

Рейтинг:
5

Aescleal

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

Задавая себе те требования, которые у вас есть, вы, по сути, пытаетесь решить проблему намеренно неясным и непрактичным способом. Просто потому, что C отлично справляется с манипуляцией адресами, не означает, что это хорошая идея-возиться с необработанной памятью, когда есть более чистый способ сделать это.


Member 12752823

Это правда, я должен быть эффективен со своим кодом. Не нужно делать это непрактичным. Спасибо :)

Рейтинг:
1

Patrice T

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: возьмите лист бумаги и попробуйте сделать это вручную, ваша программа должна использовать ту же процедуру.