LinkedList构造函数,允许用户输入列表中的元素

时间:2014-11-08 04:22:14

标签: c++ linked-list

最终编辑:我理解为什么它现在不起作用,感谢所有帮助过的人。

感谢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):此构造函数方法创建一组新的大小 通过提示用户输入键盘上的设置的大小元素来整数。

截至目前,如果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;
}

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

现在,你要求的是解释而不是代码。

试试这个 - 忘了把它写成计算机程序,而是在纸上画一个链表。这只需要三分钟。

你有一个号码,你创建了一个存储该号码的节点,对吧?而且你必须以某种方式将它挂钩到现有节点列表中。当您获得下一个号码时,您需要另一个节点来存储它,依此类推。

将其与原始解决方案进行对比,在该解决方案中,您分配了一个节点,并重新排列了一些指针。得到你的下一个号码,将它放入相同的节点(丢失之前的值),然后重新安排一些指针。

看到区别?把它抽出来你自己,这是值得的。你也可以谷歌“链表” - 在维基百科上有无数其他地方的讨论。但是,从你自己的绘画开始!