Простая реализация связанного списка в C ++ - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь реализовать простой связанный список, используя c ++.Я, вероятно, где-то делаю глупую ошибку. Благодаря этому я хочу изучать классы и указатели на C ++.Для кода

#include <iostream>
using namespace std;

class node
{
public: 
    node* next;
    int data;

    node(int d);
    void append(int d);
}; 

node::node(int d)
{
    data = d;
    next = NULL;
}


void node::append(int d)
{
    node nw = node(d);
    if(next==NULL)
        next = &nw;
    else
    {
        node *n = next;
        while((*n).next!=NULL)
        {
            n = (*n).next;
        }
        (*n).next = &nw;
    }
}

я получаю 81 как узел рядом с 1.

int main()
{
    node n = node(1);
    n.append(3);
    n.append(2);
    n.append(81);
    n = *(n.next);
    cout<< n.data << '\n';
}

Пожалуйста, помогите мне выяснить, где я делаю ошибку.

Ответы [ 5 ]

6 голосов
/ 17 июня 2011

Могут быть и другие ошибки, но это чрезвычайно опасно: вы создаете локальную переменную для представления нового узла: node nw = node(d);, а затем делаете последний узел в списке, указывающий на nw. Однако, поскольку nw является локальной переменной, она прекратит свое существование, когда функция вернет . Таким образом, указатель next последнего узла теперь указывает на то, что больше не существует. Вам необходимо использовать new node(d) (который возвращает указатель на node), чтобы создать объект, который будет продолжать существовать после возврата функции.

3 голосов
/ 17 июня 2011

Вы ошиблись тем, что создали объект в стеке, а затем сохранили указатель на него.Стек перезаписывается, ваш объект перезаписывается, указатель недействителен.

В вашем случае узел, который содержит 3, в конце перезаписывается узлом, который содержит 81.

1 голос
/ 17 июня 2011

Могу ли я также предложить сделать класс LinkedList отдельно от класса Node? Затем вы можете переместить метод append () в этот класс и заставить его управлять вашими узлами.

0 голосов
/ 06 июля 2013

с помощью

node *nw=new node(d);

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

найти способ создать новый узел, который указывает на другой адрес памяти

мои комментарии заблокированы, поэтому я написал это ответ извините за неудобства

0 голосов
/ 17 июня 2011
void node::append(int d) {
    node *nw = new node(d);
    node *last = this;

    while((*last).next!=NULL) 
        last = (*last).next;

    (*last).next = nw;
}

Да, если ваш объект должен оставаться после завершения функции, вы должны создать его в куче (ключевое слово new ), а не в стеке.

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