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



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

main:

#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;

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

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

你得到了一个数字,你创建了一个节点来存储这个数字,对吧?您必须以某种方式将它挂接到现有节点的列表中。当你得到下一个数字时,你需要另一个节点来存储它,以此类推

与您的原始解决方案形成对比,在该解决方案中,您分配了一个节点,并重新排列了一些指针。得到下一个数字,将其放入相同的节点(丢失前一个值),并重新排列一些指针。

看到区别了吗?自己画出来,值得花时间。你也可以在谷歌上搜索"链接列表"——在维基百科和无数其他地方都有不错的讨论。但是,从你自己的绘画开始!

相关内容

  • 没有找到相关文章

最新更新