为啥我得到零而不是1?

Posted

技术标签:

【中文标题】为啥我得到零而不是1?【英文标题】:why i'm getting zero instead of 1?为什么我得到零而不是1? 【发布时间】:2020-03-08 12:11:32 【问题描述】:

这是一个使用递归从链表中搜索数字的程序。

#include <iostream> 

using namespace std; 

class node  
public: 
    int data; 
    node *next; 

    void create(int *,int); 
    int max(node*,int); 
; 

node *first; 

void node::create(int a[],int n)  
    first = new node; 
    first->data = a[0]; 
    first->next = NULL; 
    node *last = first; 
    for (int i = 1; i < n; i++) 
        node *t = new node; 
        t->data = a[i]; 
        t->next = NULL; 
        last->next = t; 
        last = t; 
    
 

int node::max(node *l, int p)  
    if (l->data == p)  
        return 1;
     
    if (l == 0) 
        return 0; 
    else   
        max(l->next, p); 
        return 0;
    
 

int main()  
    int a[5] = 1,2,3,4,5; 
    node m; 
    m.create(a,5); 
    cout << m.max(first, 3); 
    return 0; 

【问题讨论】:

max 函数实际上应该做什么?顾名思义,它会找到一个最大值,但它肯定不会这样做。 虽然有预感,但请仔细查看这两行代码:max(l-&gt;next, p); return 0; 他们到底在做什么,这是您想要的吗? if (l-&gt;data == p) return 1; if (l == 0) return 0; ... 在检查 l == 0 之前你真的应该使用 l-&gt;data 吗?取消引用空指针是未定义的行为,可能会导致时间旅行devblogs.microsoft.com/oldnewthing/20140627-00/?p=633 不要比较指向 0 的指针。与nullptrNULL 进行比较。很明显,l 是它所使用的上下文中的指针。 @NateEldredge 实际上我只是弄错了搜索的标准名称,即我可以写 search() 而不是 max() ?感谢您的宝贵意见 【参考方案1】:

预感。而不是这个:

else   
    max(l->next, p); 
    return 0;

这个:

else   
    return max(l->next, p); 

或者更好的是,让我们修复整个 max 函数以在取消引用 l 之前检查 null。

int node::max(node *l, int p)  
    int result = 0;
    if (l != nullptr) 
       if (l->data == p) 
           result = 1;
       
       else 
          result = max(l->next, p);
       
    
    return result;

【讨论】:

@HarshdeepRaghuwanshi - 如果您发现提供的答案有帮助,请不要忘记投票或将其标记为已接受的答案。

以上是关于为啥我得到零而不是1?的主要内容,如果未能解决你的问题,请参考以下文章

getElementsByTagName 返回零而不是 null 为啥

R如何添加前导零而不是空格[重复]

为啥 Fortran HDF5 的无限最大维度参数 (H5S_UNLIMITED_F) 的计算结果为零而不是 -1?

为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?

Instagram ?__a=1 查询:为啥我得到登录页面而不是 JSON?

为啥我得到 cy.intercept 不是函数?