Конструктор LinkedList, который позволяет пользователю вводить элементы в списке

0

Final Edit: Я понимаю, почему это не сработает сейчас, благодаря всем, кто помог.

Измените ответ с помощью ravi, хотя я до сих пор не совсем понимаю, почему память должна быть выделена каждый раз:

for (int i = 1; i < size; i++)
{
    cin >> input;
    newNode = new Node; //added this to make it work properly
    newNode->info = input;
    newNode->next = cursor;
    cursor = newNode;
}

Оригинальный вопрос:

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

Возникает вопрос: IntegerSet (int size): этот метод конструктора создает новый набор целых чисел, предлагая пользователю вводить элементы размера для набора на клавиатуре.

На данный момент, если размер был равен 3, а пользователь вводил 1, 2, 3, при вызове display() программа выводит только 3, а затем заканчивает. Я прокомментировал в коде конструктора то, что, как я думаю, должно произойти, что, очевидно, не ведет себя так, как я думаю. Если бы кто-нибудь мог объяснить мне, какая часть (или, может быть, я полностью отключена), я беспорядочна, я был бы признателен.

Вот мой заголовок:

#include <iostream>
using namespace std;

template <class T>
class IntegerSet
{
private:
    class Node
    {
    public:
        T info;
        Node *next;
    };
    typedef Node *nodePtr;
    nodePtr first;
public:
    IntegerSet(int size);
    void display();
};
template <class T>
IntegerSet<T>::IntegerSet(int size)
{
    nodePtr newNode = new Node;
    int input;
    cout << "Enter " << size << " elements" << endl;
    cin >> input;
    newNode->info = input; //sets newNodes first element to input
    newNode->next = 0; //sets newNodes next to null
    nodePtr cursor = newNode; //make a cursor = to newNode, which should be input then 0
    for (int i = 1; i < size; i++)
    {
        cin >> input;
        newNode->info = input; //sets newNodes first element to a new input
        newNode->next = cursor; //sets newNodes next to cursor
        cursor = newNode; //sets cursor = to newNode, so after the first run through of the loop
                          //if the user entered 1 then 2, cursor would be 2->1->0
    }
    cursor->next = 0; //this is only here because it isn't working right in the first place.
                      //If this wasn't here then the program just infinitely loops with the last
                      //element entered when display is called
    first = cursor;
}

template <class T>
void IntegerSet<T>::display()
{
    nodePtr cursor = first;
    if (isEmpty())
    {
        cout << "There are no elements in the set" << endl;
        return;
    }
    while (cursor != 0)
    {
        cout << cursor->info << " ";
        cursor = cursor->next;
    }
    cout << endl;
}

главный:

#include "header.h"

int main()
{
    IntegerSet<int> list(3);
    list.display();

    return 0;
}
  • 3
    Совет профессионала (от непрофессионала :)) - Не взаимодействуйте с пользователем внутри структуры данных.
  • 0
    @Chief Two Pencils Почему это плохо? Кроме того, это домашний вопрос, так что я не знаю, как я мог бы этого избежать, не меняя при этом того, как мой профессор хочет, чтобы я это делал. У вас есть какие-нибудь предложения?
Показать ещё 1 комментарий
Теги:
linked-list

2 ответа

0
Лучший ответ
for (int i = 1; i < size; i++)
{
    cin >> input;
    newNode->info = input; //sets newNodes first element to a new input
    newNode->next = cursor; //sets newNodes next to cursor
    cursor = newNode; //sets cursor = to newNode, so after the first run through of the loop
                      //if the user entered 1 then 2, cursor would be 2->1->0
}

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

Также удалите последнюю строку: -

cursor->next = 0;
  • 0
    Я думаю, это то, что я не понимаю, хотя. Даже если бы я переопределил первое значение, я подумал -> следующий указывает на курсор, в котором была бы сохранена вся информация из предыдущего нового узла. Я также попытался удалить newNode и переопределить его в цикле каждый раз, когда он запускается, если это то, что вы имеете в виду, выделяя пространство, но в итоге получился тот же результат.
0

Теперь вы запрашиваете объяснение, а не код.

Попробуйте это - Забудьте о написании его как компьютерной программы, вместо этого нарисуйте связанный список на бумаге. Это займет всего три минуты.

У вас есть номер, вы создали узел для хранения этого номера, не так ли? И вам пришлось каким-то образом подключить его к списку существующих узлов. Когда вы получите следующий номер, вам нужен другой узел для его хранения и т.д.

Сравните это с вашим оригинальным решением, в котором вы выделили узел, и перегруппировали некоторые указатели. Получил ваш следующий номер, поместил его в тот же узел (потеряв предыдущее значение) и перестроил некоторые указатели.

Увидеть разницу? Сделайте это сами, это того стоит. Вы также можете "связанный список" Google - там есть достойная дискуссия по википедии, среди бесчисленных других мест. Но начните с собственного рисунка!

  • 0
    Да, это имеет гораздо больше смысла, когда ты так говоришь, и рисовать это намного проще, чем пытаться визуализировать все это перестановку в моей голове. Спасибо за помощь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню