我试图理解while条件while(C)
中的语句如何检查单个链表是否为空。
node* remove(nodo*C, int y){
FIFO F;
while(C){
if(C->info==y) {
node* p=C;
C=C->next;
delete p;
}
else {
F=metti_fondo(F,C);
C=C->next;
}
}
if(F.fine)
F.fine->next=0;
return F.primo;
使用的数据类型是:
struct node{int info; node* next; node(int a=0, node* b=0){info=a; next=b;}};
我不理解的是节点C的简单引用如何足以检查列表是否为空。不应该是while(C->next == 0)
或类似的东西吗?我查了一下,我的版本没有用,而前面显示的代码运行良好。
当我只引用节点C而没有引用信息或下一个字段时,它会准确检查什么?
提前致谢
答案 0 :(得分:0)
条件while语句的计算结果为true或false,具体取决于参数。在这种情况下,我相信如果指针C引用空地址,则条件将评估为false。
答案 1 :(得分:0)
我认为如果链表真的是“空”那么指针就是空的。然后在if检查中将null值转换为false。 C-> next == 0(可能应该在这里检查null)将检查链表的第一个节点是否没有子节点。
链表由节点构成,每个节点指向下一个节点。在一个简单的实现中,最后一个节点只指向null。
如果我们把它写成Node(val) - >然后是类似的东西 N1(0) - > N2(10) - > N3(3) - >空
我们可以 N1(0) - >空
并且列表不会为空,但检查C-> next仍然是null。一个空列表就是这样 空
答案 2 :(得分:0)
TL; DR:它测试“C”是否被赋予非零值。
在C和C ++中,当一个语句的计算结果为零(0)时它是假的,否则它的计算结果为真。
#include <iostream>
int main() {
if (0)
std::cout << "never\n";
if (42)
std::cout << "always\n";
if (0.2)
std::cout << "al.ways\n";
}
因此指针在指向内存地址0时评估为false
- 按正确性顺序完成,将其设置为nullptr
,NULL
或{{1}但请注意0
通常是NULL
或#define 0
。使用整数#define 0ULL
作为指针的问题是......它是一个整数。这可能导致含糊不清:
0
以下代码打印“world”:
void f(int);
void f(char*);
f(0); // which one?
因此,在常见的链表实现中,列表末尾用空指针表示,因此空白可以被列表的头部检测到 - 即为nullptr。
#include <iostream>
int main() {
const char* p = nullptr;
if (p)
std::cout << "hello";
p = "world";
if (p)
std::cout << p;
std::cout << "\n";
}
构造
Node* head;
/*...*/
if (head) {
// points to something, list is not empty
}
如果列表为空,将“短路”:节点最初被赋值为head。如果head为null,则第一个测试将失败for (Node* node = head; node; node = node->next) {
...
}
,并且不会执行任何迭代。