Final Edit: Я понимаю, почему это не сработает сейчас, благодаря всем, кто помог.Конструктор LinkedList, который позволяет пользователю вводить элементы в список
Edit с ответом благодаря Рави, хотя я до сих пор не в полной мере понять, почему память необходимо выделить каждый раз:
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, при вызове дисплея() программа выводит только 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;
}
Pro tip (от непрофессионального :)) - не имеет взаимодействия пользователя внутри структуры данных. – ChiefTwoPencils
@Chief Two Pencils Почему так плохо? Кроме того, это вопрос домашней работы, поэтому я действительно не знаю, как я мог бы это избежать, не меняя способ, которым мой профессор хочет, чтобы я это сделал, есть ли у вас какие-либо предложения? – Austin
Есть две вещи не так, как вы это делаете. Одним из них является привязка ввода/вывода к cin/cout. Если бы вы предоставили io в программе, было бы лучше разрешить пользователю передавать поток.Во-вторых, что, если я хочу список из 100 предметов, и я не хочу вводить их всех в это время, что довольно часто бывает? Да, у вас могут быть ограничения, но вы можете справиться с этим в главном/драйвере; это потребует немного изменений, но стоит усилий. – ChiefTwoPencils