Рекурсивная функция связанных списков, которая удаляет нечетные значения из списка. (C) - PullRequest
0 голосов
/ 28 января 2020

Рассматривая список вроде 1-> 2-> 3-> 4-> 5
Tlist сделан так:

typedef struct node{
    int info;
    struct node *link;
}Tnode;

typedef Tnode *Tlist;

Я получил функцию listDeleteOdd, которая построена следующим образом

Tlist listDeleteOdd(Tlist list) {  

    if (list == NULL) 
        return NULL;

    if (list->info % 2 == 1) {
        Tnode *node = list->link;
        DeleteNode(list);
        return listDeleteOdd(node);
    }
    Tnode *node = listDeleteOdd(list->link);
    list->link = node;
    return list;
};

Удалить узел просто освобождает память данного узла на c. Кстати я не понимаю, как значение узла Tnode * после второго, если изменится. Как будто это должно быть NULL, так как цикл возвращает NULL, когда прототип «список» достигает конца. После завершения цикла происходит то, что происходит с узлом, а в конце - «список возврата»; что это возвращает ??

Я изучал рекурсию несколько месяцев go, и теперь все это так запутанно. Есть кто-то, кто может объяснить мне, как вся функция работает должным образом, потому что я вроде понимаю, как она работает, но я думаю, что есть некоторые шаги, которые мне не совсем понятны. Спасибо за терпение заранее.

1 Ответ

0 голосов
/ 28 января 2020

Ключ определяет, что делает listDeleteOdd(). Он возвращает указатель на список узлов, который либо пуст, либо содержит только четные значения - «чистый список».

Внутренне он делает это в трех разных операциях:

  1. Список ввода пуст (NULL); return NULL (базовый случай).
  2. Первый узел в списке нечетный; захватить следующий узел, удалить текущий узел; recurse для возврата чистого списка, начиная со следующего узла.
  3. По исключении первый узел в списке является четным. Захватить список четных значений, начиная со следующего узла (recurse). Сделайте так, чтобы следующий указатель текущего узла (link) указывал на чистый список и возвращал текущий узел в качестве начала (теперь чистого) списка.
...