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

时间:2015-07-06 20:29:23

标签: c++ linked-list singly-linked-list

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

提前致谢

3 个答案:

答案 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 - 按正确性顺序完成,将其设置为nullptrNULL或{{1}但请注意0通常是NULL#define 0。使用整数#define 0ULL作为指针的问题是......它是一个整数。这可能导致含糊不清:

0

以下代码打印“world”:

void f(int);
void f(char*);

f(0); // which one?

http://ideone.com/iy5GcX

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