Связанный список добавить новый корневой элемент - PullRequest
2 голосов
/ 18 июня 2019

Я пытаюсь добавить новый корневой элемент в свой связанный список.Я уже знаю правильный ответ, но я не понимаю, почему существует двойной указатель на текущий корневой элемент.Вот правильный код:

void elementAsRoot(Element **oldRoot, Element *newRoot){
  newRoot -> next = *oldRoot;
  *oldRoot = newRoot;
}

Ответы [ 3 ]

2 голосов
/ 18 июня 2019

Я почти уверен, что вы можете просто удалить двойной указатель, поскольку в конце вы разыменовываете двойной указатель.

void elementAsRoot(Element *oldRoot, Element *newRoot) {
  newRoot->next = oldRoot;
  oldRoot = newRoot;
}
1 голос
/ 19 июня 2019
void elementAsRoot(Element **oldRoot, Element *newRoot){
  newRoot -> next = *oldRoot;
  *oldRoot = newRoot;
}

Эта функция должна вызываться следующим образом:

Element *list = ...some linked list...;
elementAsRoot(&list, ...some new element...);
// now 'list' points to the new first element, not the old one (which is now second)

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

1 голос
/ 18 июня 2019

Я отвечу вам, комментируя. Вот что происходит внутри elementAsRoot.

oldRoot - указатель на местоположение / адрес переменной, которая хранит корень списка в вызывающей функции. Вы хотите изменить этот корень внутри elementAsRoot, и именно поэтому вы передаете адрес указателя.

void elementAsRoot(Element **oldRoot, Element *newRoot){

сначала вы инициализируете newRoot для указания на старый корень

  newRoot -> next = *oldRoot;

затем вы изменяете старый корень (определенный снаружи для этой функции), чтобы указывать на новый добавленный узел.

  *oldRoot = newRoot;

}

Вызывающая функция выглядит примерно так:

Element *root, *newroot;
....  
newroot = malloc(sizeof Element);
// here your list look like root=A => rest .
// This call will mutate root to be new.
elementAsRoot(&root, new);
// here your list look like root=new => A => rest
...