Как убедиться, что мой узел добавляется в связанный список - PullRequest
0 голосов
/ 01 ноября 2019

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

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

Это функция addNode с узлом * и заголовком в качестве входных данных от основной функции. И для этого я уже заполнил значения A вводом, который функционирует должным образом.

node *A = new node, *ptr = head;
A->costs1=costs;
A->next = nullptr;
ptr = head;
if (head == nullptr)
{
    head = A;
}
else{
    while (ptr->next!=nullptr){
        ptr=ptr->next;
    }
    ptr = A;
}

А вот структура, я сократил количество переменных, чтобы она не стала слишком сложной:

struct node
{
    string costs1;
    node *next;
};

Я могу получить доступ к head-> cost1 просто отлично, и это правильно, но если я попытаюсь получить доступ к head-> next-> cost1, это ничего не даст.

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вам нужно установить ptr->next = A, а не ptr = A. Ваш текущий код не добавляет объект A в список, он просто устанавливает на него указатель ptr, который не используется.

0 голосов
/ 01 ноября 2019

Ответ lxop должен решить проблему, но есть лучший вариант. Я пытался объяснить это в комментариях, но комментарии отстой в объяснении чего-то сложного.

Итак, мы идем:

//set up the new node. 
// Nothing new here.
node *A = new node;
A->costs1=costs;
A->next = nullptr;

// Find the null next pointer (the end of the list)
// head is a pointer to the next node, just like any other next pointer.
// this hides the difference between head and next so we can use the exact 
// same code for both. This reduces the number of cases we need to handle.
// In addition by having a pointer to the next pointer, we are tracking 
// node insertion points, not nodes. When you are tracking the nodes, you're 
// forced to keep track of the current node and the previous node so you 
// can get access to the previous node's next so you can link the new new 
// node to it. With the pointer to pointer, you have a pointer to previous's 
// next, you can assign right to it AND use it as the current node. 
node  **ptr = &head; // get pointer to pointer to next node, the first node 
                     // in this case
while (*ptr != nullptr){ // test that there is a next node, if there isn't 
                         // we've found the end.
    ptr = &(*ptr)->next; // if there is, advance to point at it's next.
}

// link in the new node
// when there are no more nodes to be had, ptr points right at the next node 
// we need to update
*ptr = A; // so we update it.

и вот опять без объяснения:1006 *

//set up the new node
node *A = new node;
A->costs1=costs;
A->next = nullptr;

// Find the null next pointer (the end of the list)
node  **ptr = &head; 
while (*ptr != nullptr){ 

    ptr = &(*ptr)->next; 
}

// link in the new node
*ptr = A; 
...