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;
您现在要求的是解释而不是代码。
试试这个-忘记把它作为计算机程序来写,而是在纸上画一个链表。只需要三分钟。
你得到了一个数字,你创建了一个节点来存储这个数字,对吧?您必须以某种方式将它挂接到现有节点的列表中。当你得到下一个数字时,你需要另一个节点来存储它,以此类推
与您的原始解决方案形成对比,在该解决方案中,您分配了一个节点,并重新排列了一些指针。得到下一个数字,将其放入相同的节点(丢失前一个值),并重新排列一些指针。
看到区别了吗?自己画出来,值得花时间。你也可以在谷歌上搜索"链接列表"——在维基百科和无数其他地方都有不错的讨论。但是,从你自己的绘画开始!