带有for循环c ++的双向链表

时间:2018-04-18 22:52:07

标签: c++ for-loop nodes doubly-linked-list

我刚刚学习了c ++中的指针,我的讲师告诉我创建一个带有for循环的双向链表。但是,我给出的唯一例子是

    Node *n1 = new Node(1);
    Node *n2 = new Node(2);
    Node *n3 = new Node(3);
    Node *n4 = new Node(4);
    Node *n5 = new Node(5);
    DL_List mylist;
    if (mylist.empty())
        mylist.insert(n1, mylist.head);
    mylist.insert(n2, n1);
    mylist.insert(n3, n2);
    mylist.insert(n4, n3);
    mylist.insert(n5, n4);
    mylist.display();

我不知道如何为此设置for循环,因为我不知道如何在循环中命名它们,或者我如何连接它们。

2 个答案:

答案 0 :(得分:1)

名称,标识符,毫无意义。他们只是占位符。我们使用好名字,因为它使人类大脑更容易理解变量的用途。电脑不关心。它尽快删除名称,并用地址,地址或硬件寄存器的偏移量替换它。

您不能在同一范围内使用相同的标识符,但循环的范围以循环结束结束,如果循环需要另一次迭代,则重新开始重新创建任何标识符。

循环中有什么?显然我们需要创建一个Node并插入节点,但我们还需要跟踪插入下一个节点的位置。这导致了教师提供的示例中的半错误:

DL_List mylist;
if (mylist.empty()) // list better not be constructed with pre-existing nodes
    mylist.insert(n1, mylist.head); // because this doesn't happen if it isn't empty
mylist.insert(n2, n1); // and where is n1, Hmmm? We might not have added it.

n1不会出现在列表中,如果它不在列表中,那么将n2n1链接到列表中是不会的这是一个好主意。

我的音调行为略有不同,但至少它并没有破坏行为。我建议总是在列表的开头插入第一个节点。如果列表中已经有东西,那就这样吧。它被推到列表的末尾。

在这种情况下,您需要一个额外的占位符来跟踪插入的位置,并且此占位符的值需要在循环的迭代之间保持不变。为了允许它持久化,我们在循环外定义它。

Node * where_to_insert = mylist.head;
for (int count = 1; cows.not_home(); count++)
{
    Node * n = new Node(count);
    mylist.insert(n, where_to_insert);
    where_to_insert = n;
}

以上将循环并添加节点,直到奶牛回家。希望他们会在计数溢出之前回家,但是通过使用更相关的循环终止条件可以避免这种可能性。

答案 1 :(得分:0)

我真的不明白mylist.insert(a,b)是做什么的?将节点a插入到位置b?通常,为了做你所说的,我们使用如下代码:

for (size_t i = 0; i < number_of_nodes_you_want_to_insert; ++i) {
    Node *n = new Node(i);
    mylist.insert(n);
}