2015-11-13 3 views
1

Допустим, у меня есть список, как, например:Понимание добавление к фронту связного списка

[1]-> [2]-> [3]-> [4]-> [5]->NULL 

Если значение 1 является голова, и 5 есть хвост. Я следую пример кода, показанный здесь: https://codereview.stackexchange.com/questions/29784/reversing-a-linked-list-and-adding-removing-nodes

То, что я не понимаю, эта линия (В функции addtoFront)

ptr->value = input; 
ptr->next = head; // Point next value to the previous head 
head = ptr; 

Вот что я получаю. ptr->value = input

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

`ptr->next = head;` 

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

Insert [9] к передней, так:

[9] (new head points to old head) 
[9] -> [1] (9's next pointer points to 1) 

То, что я не получаю эту строку:

head = ptr; 

Читая это смущает меня в том смысле, что я интерпретируя его как установка двух узлов равны друг другу, то есть [1] становится [9], поэтому у нас есть 2 узлов, которые являются [9], [9]->[9]->[2]->[3]->[4]->[5]->NULL

но это явно нет.

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

+0

'head' всегда указывает на первый узел, поэтому, когда вы вставляете новый первый узел, вам нужно сделать головную точку. –

ответ

0

Проблема в том, что вы думаете о указателях в терминах конкретных экземпляров, а не как фактические указатели на ячейки памяти.

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

Код:
голова = PTR

обновляет ячейку памяти, в которой головка точек, в то время как исходное местоположение головы теперь содержится в ptr-> рядом.

Чтобы получить фактическое значение узла головы, вам необходимо разыменования указателя:

*head 

Так, например, учитывая связанный список головы указывая на ячейку памяти 8, который содержит экземпляр узла со значением ' а», и новый вход 'б':

Перед выполнением кода вы указываете: значение головы == 8

  • head->

    1. == 'a'
    2. head-> next = NULL;
    3. PTR == 12 // Это произвольное местоположение памяти выбрал мною быть возвращен из вызова таНос значение
    4. ptr-> == «B»
    5. ptr-> следующая = NULL;

    После того, как блок кода вы выделяете выполняется:

    1. голову == 12
    2. значение head-> == 'б'
    3. head-> следующая = 8;
    4. head-> next-> value == 'a'
    5. head-> next-> next == NULL;
    6. PTR == 12
    7. ptr-> значение == 'B'
    8. ptr-> следующая = NULL;
  • 0

    Допустим, у вас есть связанный список как так:

    H   T 
    [3]->[2]->[1]->NULL 
    

    И мы хотим, чтобы вставить узел с элементом 4 к передней (головной части). Во-первых, мы должны создать новый узел в сторону, на которую указывает ptr:

    ptr  H   T 
    [4]  [3]->[2]->[1]->NULL 
    

    Затем нам нужно связать его с головы списка:

    ptr->next = head 
    
    ptr  H   T 
    [4]---->[3]->[2]->[1]->NULL 
    

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

    head = ptr; 
    
    ptr 
    H    T 
    [4]->[3]->[2]->[1]->NULL 
    

    И престо, вставка завершена.

    0

    Вот деталь:

    Ваши указатели выглядеть следующим образом:

    голова -> далее -> далее -> далее -> хвост

    ptr->value = input; 
    

    Теперь это выглядит следующим образом:

    голова -> следующая -> следующая -> следующая -> хвост -> ноль

    и

    ptr -> null

    Итак, у вас есть в основном два списка на данный момент.

    ptr->next = head; // Point next value to the previous head 
    

    Теперь вы креплени ваши два списка:

    PTR -> голова -> далее -> далее -> далее -> хвост -> NULL

    head = ptr; 
    

    И теперь вы» re, убедившись, что вы называете head, указывает на этот новый блок вместо старого.

    головка (ранее PTR) -> следующая (бывший глава) -> далее -> далее -> далее -> хвост -> нулевой

    И теперь вы вставили, что новое значение в передней части списка.

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