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 - 按照正确性顺序,将其设置为 nullptrNULL0 但请记住 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";
}

(http://ideone.com/iy5GcX)

因此在常见的链表实现中,列表末尾用空指针表示,因此可以通过列表的头部作为末尾检测到空指针——即作为 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 ; ...) 并且不会执行任何迭代。