在C++中检查链表是否为空

Checking whether a linked list is empty in C++

本文关键字:是否 链表 检查 C++      更新时间:2023-10-16

我试图理解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,而没有引用任何信息或下一个字段时,它会检查什么?

提前感谢

我假设如果链表真的是"空的",那么指针将为null。然后在if检查中将null值转换为false。C->next==0(可能也应该在这里检查null(将检查链表的第一个节点是否没有子节点。

链接列表由节点组成,每个节点指向下一个节点。在一个简单的实现中,最后一个节点只是指向null。

如果我们把它写成Node(val(->next,那么类似于N1(0(->N2(10(->N3(3(->空

我们本可以N1(0(->空

并且该列表不会为空,但是检查C->next仍然为空。一个空列表就是空

条件while语句的计算结果为true或false,具体取决于参数。在这种情况下,我相信如果指针C引用了一个空地址,则条件将评估为false。

TL;DR:它测试"C"是否被分配了一个非零值。

在C和C++中,当一个语句的求值结果为零(0(时,它是false,否则它的求值结果是true。

#include <iostream>
int main() {
    if (0)
        std::cout << "nevern";
    if (42)
        std::cout << "alwaysn";
    if (0.2)
        std::cout << "al.waysn";
}

因此,当指针指向内存地址0时,其计算结果为false——按照正确性的顺序,通过将其设置为nullptrNULL0来完成,但请记住,NULL通常是#define 0#define 0ULL。使用整数0作为指针的问题是。。。它是一个整数。这可能导致歧义:

void f(int);
void f(char*);
f(0); // which one?

以下代码打印"世界":

#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)

因此,在常见的链表实现中,列表的末尾用一个null指针表示,因此可以通过列表的头作为末尾来检测空,即作为一个nullptr。

Node* head;
/*...*/
if (head) {
    // points to something, list is not empty
}

以及构建

for (Node* node = head; node; node = node->next) {
    ...
}

如果列表为空,将"短路":节点最初被分配了head的值。如果head为null,则第一个测试将失败( ... ; node ; ...),并且不会执行任何迭代。