为啥我得到零而不是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->next, p); return 0;
他们到底在做什么,这是您想要的吗?
if (l->data == p) return 1; if (l == 0) return 0; ...
在检查 l == 0
之前你真的应该使用 l->data
吗?取消引用空指针是未定义的行为,可能会导致时间旅行devblogs.microsoft.com/oldnewthing/20140627-00/?p=633
不要比较指向 0
的指针。与nullptr
或NULL
进行比较。很明显,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 为啥
为啥 Fortran HDF5 的无限最大维度参数 (H5S_UNLIMITED_F) 的计算结果为零而不是 -1?
为啥我得到 1、10、110、1110 等而不是 1、10、100、1000 等?