最终编辑:我理解为什么它现在不起作用,感谢所有帮助过的人。
感谢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;
}
答案 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)
现在,你要求的是解释而不是代码。
试试这个 - 忘了把它写成计算机程序,而是在纸上画一个链表。这只需要三分钟。
你有一个号码,你创建了一个存储该号码的节点,对吧?而且你必须以某种方式将它挂钩到现有节点列表中。当您获得下一个号码时,您需要另一个节点来存储它,依此类推。
将其与原始解决方案进行对比,在该解决方案中,您分配了一个节点,并重新排列了一些指针。得到你的下一个号码,将它放入相同的节点(丢失之前的值),然后重新安排一些指针。
看到区别?把它抽出来你自己,这是值得的。你也可以谷歌“链表” - 在维基百科上有无数其他地方的讨论。但是,从你自己的绘画开始!