这是我的代码:
void setUpEachFlechette(int numFlechettes){
int i = 0;
int totalNum = 0;
Flechette* next;
Flechette* head;
Flechette* pEnd;
Flechette* temp;
while(numFlechettes != i){
double x = getRandomNumberX();
double y = getRandomNumberX();
double z = getRandomNumberZ();
if(i != 0)
temp = next;
next = new Flechette;
next->setXYZ(x, y, z);
if(i == 0)
head = next;
else
next->link = temp;
i++;
next->display();
}
cout<<"\nThe total number of flechettes is "<<totalNum<<endl<<endl;
char yes = NULL;
cout<<"Ready? ";
cin>>yes;
i = 0;
next->link = NULL;
next = head;
while(next != NULL){
next->display();
next = next->link;
i++;
}
}
出于某种原因,当我循环遍历链表时,它只显示列表中的前4个节点,并继续重复前四个节点。我也无法让它在null上正确结束,所以我可以通过while(next!= null)循环运行它。我想知道为什么我的编码不会遍历所有的Flechettes?作为参考,它应该循环通过20个不同的flechettes,而不仅仅是4个flechettes'i'次。
我认为这些功能非常自我解释。如果他们不'告诉我,我会向你解释。
感谢您的所有帮助
P.S。我现在正在学习指针和链接列表,所以请光临我。
答案 0 :(得分:1)
在打印之前,您没有修改变量totalNum
。另外我认为代码应该是这样的
void setUpEachFlechette(int numFlechettes){
int i = 0;
int totalNum = 0;
Flechette* next;
Flechette* head;
Flechette* pEnd;
Flechette* temp;
srand (time(NULL));
while(numFlechettes != i){
int x = rand();
int y = rand();
int z = rand();
if(i != 0)
temp = next;
next = new Flechette;
next->setXYZ(x, y, z);
if(i == 0)
head = next;
else
temp->link = next;
i++;
next->display();
}
totalNum = numFlechettes;
cout<<"\nThe total number of flechettes is "<<totalNum<<endl<<endl;
char yes;
cout<<"Ready? ";
cin>>yes;
i = 0;
next->link = NULL;
next = head;
while(next != NULL){
next->display();
next = next->link;
i++;
}
}
在原始代码中head
节点将是最后一个节点,head->next
将是NULL
我希望您在link
的构造函数中使用NULL
正确初始化成员变量Flechette
答案 1 :(得分:0)
有两种方法可以处理简单的单链表。一种是总是添加到列表的头部,这是最简单的方法:
struct Node
{
Node* next;
Node()
: next(nullptr) // Make sure the `next` pointer is not pointing anywhere
{}
};
Node* head = nullptr;
while (add_one_more_node())
{
Node* newNode = new Node;
// Make the `next` point to the old head
newNode->next = head;
// Make the head point to the new node
head = newNode;
}
第二种方法是跟踪列表中的最后一个节点,并在最后插入。这有点棘手:
// Assume `Node` structure as in above example
Node* head = nullptr;
Node* tail = nullptr;
while (add_one_more_node())
{
Node* newNode = new Node;
if (tail == nullptr)
{
// List is empty
head = tail = newNode;
}
else
{
// List is not empty
// Make the current tails next link point to the new node
tail->next = newNode;
// Make the new node the next tail
tail = newNode;
}
}
使用两种方法,您可以使用相同的循环迭代列表:
// Loop over the list
for (Node* node = head; node != nullptr; node = node->next)
{
// ...
}
要释放列表,您需要一个更复杂的循环,因此在获得下一个指针之前不要释放节点:
for (Node* node = head, *next; node != nullptr; node = next)
{
// Next node to iterate to
next = node->next;
// Free the current node
delete node;
}