我刚刚学习了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循环,因为我不知道如何在循环中命名它们,或者我如何连接它们。
答案 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
不会出现在列表中,如果它不在列表中,那么将n2
与n1
链接到列表中是不会的这是一个好主意。
我的音调行为略有不同,但至少它并没有破坏行为。我建议总是在列表的开头插入第一个节点。如果列表中已经有东西,那就这样吧。它被推到列表的末尾。
在这种情况下,您需要一个额外的占位符来跟踪插入的位置,并且此占位符的值需要在循环的迭代之间保持不变。为了允许它持久化,我们在循环外定义它。
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);
}