C++判断链表是否为空
Checking whether a linked list is empty in C++
我想了解 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 而没有引用任何信息或下一个字段时,它究竟检查了什么?
提前致谢
条件 while 语句的计算结果为 true 或 false,具体取决于参数。在这种情况下,我相信如果指针 C 引用空地址,条件将评估为 false。
我假设如果链表确实是 "empty" 那么指针将为空。然后在 if 检查中将 null 值转换为 false。 C->next == 0(可能也应该在这里检查 null)将检查链表的第一个节点是否没有子节点。
链表由节点构成,每个节点指向下一个节点。在一个简单的实现中,最后一个节点简单地指向 null。
如果我们把它写成 Node(val) -> next 然后像
N1(0) -> N2(10) -> N3(3) -> 空
我们本来可以
N1(0) -> 空
并且列表不会为空,但检查 C->next 仍然为空。一个空列表就是
空
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
或 0
但请记住 NULL
通常是 #define 0
或 #define 0ULL
。使用整数 0
作为指针的问题在于......它是一个整数。这可能导致歧义:
void f(int);
void f(char*);
f(0); // which one?
以下代码打印 "world":
#include <iostream>
int main() {
const char* p = nullptr;
if (p)
std::cout << "hello";
p = "world";
if (p)
std::cout << p;
std::cout << "\n";
}
因此在常见的链表实现中,列表末尾用空指针表示,因此可以通过列表的头部作为末尾检测到空指针——即作为 nullptr。
Node* head;
/*...*/
if (head) {
// points to something, list is not empty
}
和结构
for (Node* node = head; node; node = node->next) {
...
}
如果列表为空,将"short circuit":节点最初被赋予head的值。如果 head 为空,第一个测试将失败 ( ... ; node ; ...)
并且不会执行任何迭代。
我想了解 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 而没有引用任何信息或下一个字段时,它究竟检查了什么?
提前致谢
条件 while 语句的计算结果为 true 或 false,具体取决于参数。在这种情况下,我相信如果指针 C 引用空地址,条件将评估为 false。
我假设如果链表确实是 "empty" 那么指针将为空。然后在 if 检查中将 null 值转换为 false。 C->next == 0(可能也应该在这里检查 null)将检查链表的第一个节点是否没有子节点。
链表由节点构成,每个节点指向下一个节点。在一个简单的实现中,最后一个节点简单地指向 null。
如果我们把它写成 Node(val) -> next 然后像 N1(0) -> N2(10) -> N3(3) -> 空
我们本来可以 N1(0) -> 空
并且列表不会为空,但检查 C->next 仍然为空。一个空列表就是 空
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
或 0
但请记住 NULL
通常是 #define 0
或 #define 0ULL
。使用整数 0
作为指针的问题在于......它是一个整数。这可能导致歧义:
void f(int);
void f(char*);
f(0); // which one?
以下代码打印 "world":
#include <iostream>
int main() {
const char* p = nullptr;
if (p)
std::cout << "hello";
p = "world";
if (p)
std::cout << p;
std::cout << "\n";
}
因此在常见的链表实现中,列表末尾用空指针表示,因此可以通过列表的头部作为末尾检测到空指针——即作为 nullptr。
Node* head;
/*...*/
if (head) {
// points to something, list is not empty
}
和结构
for (Node* node = head; node; node = node->next) {
...
}
如果列表为空,将"short circuit":节点最初被赋予head的值。如果 head 为空,第一个测试将失败 ( ... ; node ; ...)
并且不会执行任何迭代。