0

这是我的代码:

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) 循环运行它。我想知道为什么我的编码没有遍历所有的 Flechette?作为参考,它应该循环通过 20 个不同的箭,而不仅仅是 4 个箭 'i' 的次数。

我认为这些功能是不言自明的。如果他们不让我知道,我会向你解释。

4

2 回答 2

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中正确初始化成员变量NULLFlechette

于 2013-02-21T04:40:42.080 回答
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;
}
于 2013-02-21T04:54:37.103 回答