2015-02-12 3 views
1

У меня есть легкий указательный вопрос для эксперта. Эта функция создает копию связанного списка. Последняя строка, это рекурсивный вызов copyLinkedList. Я не могу понять, указав параметр указателя на указатель, куда я положил ???указание параметра указателя в рекурсивном вызове

Как я могу легко понять этот сложный предмет указателя? (По-прежнему трудно для меня)

* Спасибо *

void copyLinkedList(struct Node *node, struct Node **ppNode) 
{ 
    if (node){ 
     *ppNode = new Node; 
     (*ppNode)->data = node->data; 
     (*ppNode)->next = NULL; 
     copyLinkedList(node->next, ??); 
    } 
} 
+0

'& (* ppNode) -> next' будет вашим вторым параметром. И если вы считаете * реальным * глубоким, вы увидите '(* ppNode) -> next = NULL;' не требуется, если вы добавите условие 'else' против' if (node) ', который просто делает' * ppNode = NULL'. – WhozCraig

ответ

1

Ну, вы хотите передать указатель на (*ppNode)->next:

copyLinkedList(node->next, &(*ppNode)->next); 
0

Когда вы передаете указатель (единственный) в функция, она передается по значению. Итак, у вас в основном есть копия указателя, который вы передали в функцию, и если вы его изменяете, он не изменяет исходный указатель, который был передан, - вызывающий не увидит его.

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

В вашем случае * ppNode = новый узел; присваивает новый узел указателю, который прошел пользователь (т. е. указатель, на который указывает указатель на указатель) ... Я знаю, это звучит ужасно, но вы можете его вычеркнуть, и это имеет смысл.

Вы устанавливаете данные и следующее значение этого нового указателя на значение из исходного списка. Теперь вы хотите перейти к следующему элементу. Итак, вы передаете рекурсивному вызову следующий элемент исходного списка и следующий элемент нового списка, который вы создаете. Итак, вы хотите передать указатель на «следующий» указатель только что созданного элемента.

  • Узел, который вы только что создали, - * ppNode (de-referenced the pointer).
  • Следующий узел в списке после * ppNode является членом ->next.
  • Указатель на следующий член - это то, что вы получаете, когда принимаете адрес следующего члена.

Итак, &(*ppNode)->next - @StenSoft уже предоставил полный вызов, хотя.

Смежные вопросы