我正在处理一个链表,并试图初始化两个等于“first”/“head”指针的指针。我试图在for
循环中干净地完成这项工作。所有这一切的重点在于我可以通过链表运行两个指针,一个在另一个后面(这样我就可以根据需要进行修改)......
类似的东西:
//listHead = main pointer to the linked list
for (blockT *front, *back = listHead; front != NULL; front = front->next)
//...//
back = back->next;
我的想法是,我可以提前提前,以便它提前一步,完成工作,而不是递增“返回”直到代码块的底部,以防我需要备份以修改链接列表...
无论这个“为什么”,除了以上我尝试过:
for (blockT *front = *back = listHead; /.../
for (blockT *front = listHead, blockT *back = listHead; /.../
我想避免指向指针。我只需要在循环之前初始化这些吗?
答案 0 :(得分:3)
你接近成功
for (blockT *front = listHead, *back = listHead; front != NULL; front = front->next)
注意,它是语法糖。它实际上就像
一样int x = 0, y = 1;
答案 1 :(得分:2)
语法为:
for ( BlockT* front = listHead, *previous = NULL;
front != NULL;
front = front->next ) {
// ...
previous = front;
}
你需要循环中previous
的特殊情况,以便
测试并避免在列表前面备份。或者,
您可以使用&listHead
代替NULL
,但您需要
用它来玩类型游戏(并确保你不尝试修改任何
成员)。如果您只需要能够插入中间成员
(在front
前面)或删除front
,那么你应该考虑一个
指向指针的指针:
BlockT** previousNext = &listHead;
BlockT* current = listHead;
while ( current != NULL ) {
// ...
previousNext = ¤t->next;
current = current->next;
}
在循环中,您可以通过*previousNext =
¤t->next
从列表中删除当前内容(确保在删除之前提前current
旧元素);插入新元素*previousNext = new BlockT;
previousNext->next = current;
。
答案 2 :(得分:1)
您可以从for:
中取出变量声明blockT *front, *back;
for (front = back = listHead; front != NULL; front = front->next)
但为了您的目的,这将更合乎逻辑:
for (blockT *front = listHead, *back = 0;
front != NULL;
back = front, front = front->next) {
/* if (back != 0) backup */
}
答案 3 :(得分:1)
我将指针的声明放在循环之外:
//listHead = main pointer to the linked list
blockT *front, *back;
for (front = back = listHead; front != NULL; front = front->next) {
//...//
back = back->next;
}
这样你也可以按照你编写的那样执行back = back->next;
行(在循环之外),如果你出于某种原因需要,虽然我想你想要它。在循环中声明变量(当然包括指针)会使它们在它外面不可用。
<强>更新强> 如果您需要仅针对数组的指针,我会选择:
for (blockT *front = listHead, *back = listHead; front != NULL; front = front->next) {
//...//
back = front;
}