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;
}
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;
Теперь вы запрашиваете объяснение, а не код.
Попробуйте это - Забудьте о написании его как компьютерной программы, вместо этого нарисуйте связанный список на бумаге. Это займет всего три минуты.
У вас есть номер, вы создали узел для хранения этого номера, не так ли? И вам пришлось каким-то образом подключить его к списку существующих узлов. Когда вы получите следующий номер, вам нужен другой узел для его хранения и т.д.
Сравните это с вашим оригинальным решением, в котором вы выделили узел, и перегруппировали некоторые указатели. Получил ваш следующий номер, поместил его в тот же узел (потеряв предыдущее значение) и перестроил некоторые указатели.
Увидеть разницу? Сделайте это сами, это того стоит. Вы также можете "связанный список" Google - там есть достойная дискуссия по википедии, среди бесчисленных других мест. Но начните с собственного рисунка!