链接列表没有正确循环

时间:2013-02-21 04:29:59

标签: c++ list

这是我的代码:

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。我现在正在学习指针和链接列表,所以请光临我。

2 个答案:

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