Как добавить узел в конце связанного списка в C - PullRequest
0 голосов
/ 21 мая 2019

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

void addToLevels(Levels* levels, Levels* newLevel){
      if (!levels)
          levels = newLevel;
      else { 
          Levels* endFinder = levels;
          while (endFinder->nextLevel)
               endFinder = endFinder->nextLevel;
          endFinder->nextLevel = newLevel;
      }
}

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

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

Возможно, ваш текущий вызывающий код имеет такой код:

Levels *head = NULL;
...
addToLevels(head, newLevel);

, и проблема в том, что после функциивызов, переменная head по-прежнему NULL.

У вас есть два варианта получения head обновлено.

1) Передайте головной узел как двойной указатель, чтобы он мог быть изменен внутрифункция:

void addToLevels(Levels** levels, Levels* newLevel){
      if (*levels == NULL)
          *levels = newLevel;
      else { 

и вызовите его следующим образом:

addToLevels(&head, newLevel);

2) Верните указатель уровня и всегда позволяйте вызывающему абоненту назначить его заголовку:

Levels* addToLevels(Levels* levels, Levels* newLevel){
      if (!levels)
          levels = newLevel;
      else {
        ...
        ...
      }

      return levels;
}

и назовите это как:

head = addToLevels(head, newLevel);
0 голосов
/ 21 мая 2019

Возможно, функция вернула новый заголовок, когда старый (аргумент levels) был нулевым?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...