2014-11-08 3 views
0

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; 
} 
+3

Pro tip (от непрофессионального :)) - не имеет взаимодействия пользователя внутри структуры данных. – ChiefTwoPencils

+0

@Chief Two Pencils Почему так плохо? Кроме того, это вопрос домашней работы, поэтому я действительно не знаю, как я мог бы это избежать, не меняя способ, которым мой профессор хочет, чтобы я это сделал, есть ли у вас какие-либо предложения? – Austin

+0

Есть две вещи не так, как вы это делаете. Одним из них является привязка ввода/вывода к cin/cout. Если бы вы предоставили io в программе, было бы лучше разрешить пользователю передавать поток.Во-вторых, что, если я хочу список из 100 предметов, и я не хочу вводить их всех в это время, что довольно часто бывает? Да, у вас могут быть ограничения, но вы можете справиться с этим в главном/драйвере; это потребует немного изменений, но стоит усилий. – ChiefTwoPencils

ответ

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 
} 

Вы не выделяя никакого пространства для нового узла в этом цикле, а вы просто наиважнейший первый value.And это почему вы печатаете только последнее значение.

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

cursor->next = 0; 
+0

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

0

Вы просите объяснения, а не код, теперь.

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

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

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

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

+0

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

Смежные вопросы