Почему эти два указателя на значение узла не равны? - PullRequest
1 голос
/ 28 октября 2019

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

Когда я пытался установить poniter на следующий узел, я хотел изменить значениеследующего узла, указывая на него с первого узла, но когда я пытаюсь показать значение путем прямого доступа к структуре узла, я получаю другой результат, как я могу сделать их равными? Так что, если я изменю один, независимо от того, откуда, узел изменит свое значение.

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


#include <iostream>

struct node
{
    double val;
    node *nxt;
};

int main()
{
    node n1, n2;

    n1.val = 10;
    n1.nxt = new node{n2};

    n1.nxt->val = 20;

    std::cout << "List:\n";
    std::cout << n1.val << "\n"
              << n2.val << "\n";
}

Фактический результат:

Список:

10

1.39065e-309

Ожидаемый результат:

Список:

10

20

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Это потому, что вы фактически выделяете новый node, а не устанавливаете свою nxt ссылку для хранения фактического n2 узла.

Если вы хотите добавить этот узел в связанный список,Вы должны использовать адрес оператора (&):

n1.nxt = &n2;

Имейте в виду, что это не рекомендуется для создания связанных списков таким образом, особенно если вы делаете это в вспомогательной функции, такой как addNode() потому что n2 будет уничтожен после выхода из функции. Таким образом, обычно лучше использовать new или эквивалент для этого, когда вы можете. Это будет выглядеть примерно так:

n1.nxt = new node(/* node constructor parameters */);

Или, если вы хотите сделать копию о существующем node:

n1.nxt = new node{n2};
0 голосов
/ 28 октября 2019

Измените эту строку:

n1.nxt = new node{n2};

на

n1.nxt = &n2;

Причина, по которой вы не работали, заключается в том, что вы создаете копию n2 с new node{n2} (поскольку C ++ определяет неявный конструктор копирования для вашего класса ) и, следовательно, именно эта копияизменил val на 20 .

с помощью оператора адреса [1] (&), вы можете назначить указатель на адрес n2 и, таким образом, можете изменить его значение с помощью n1.nxt->val = 20.

...