以下代码;
typedef struct chainCell{
int data;
struct chainCell* next;
} chainCell;
bool sameValues (chainCell *x, chainCell *y)
{
if ((x == NULL) & (y == NULL)) return true;
if ((x == NULL) | (y == NULL)) return false;
bool same = true;
chainCell *xp = x, *yp = y; // scan pointers
while ((xp != NULL) & (same == true)) // point A
{
if (xp->data != yp->data) same = false;
xp = xp->next;
yp = yp->next;
if (((xp == NULL) & (yp != NULL)) // point B
| ((xp != NULL) & (yp == NULL)))
same = false;
};
return same;
};
我很困惑为什么循环控件包含(same == true)
?
B点的if语句的目的是什么?我不确定布尔表达式正在检查什么?
任何有助于进一步理解的帮助将不胜感激!
答案 0 :(得分:4)
它检查两个链接列表是否包含相同的值。
显然,如果一个列表较短,则它们不相同(B点)。
注意:我认为在break
/ return
使用会是更好的选择,它会让代码更具可读性。
注2:如评论中所述,那些应该是逻辑运算符。它按原样工作,但有点令人困惑。
注3:您可以在循环内部(while(1)
)之前移动测试,这样就不需要在循环结束时进行测试。
这只是一个丑陋的代码,它应该是大约5行代码,而不是十几行......
bool sameValues (chainCell *x, chainCell *y)
{
while(1) {
if (!x && !y) return true;
if (!x || !y) return false;
if (x->data != y->data) return false;
x = x->next;
y = y->next;
}
return false; //this is just to suppress compiler warning.
};
答案 1 :(得分:0)
函数bool sameValues (chainCell *x, chainCell *y)
检查两个struct chainCell是否具有相同的值,也就是说,x和y之间的chainCell类型的每个字段都相等。
“为什么循环控件包含(相同== true)?”
布尔值same是指示先前检查的字段是否相等的指示符。如果same == false
,则推断x和y的值不相同,而while循环可能会中断。
B点的if语句的目的是什么?
if语句设置两个字段可以相等的条件,仅当两个字段都为null或两者都不为空时。
答案 2 :(得分:0)
紧张形式的@Karoly Horvath的回答:
bool sameValues (chainCell *x, chainCell *y)
{
for( ; x || y; x = x->next, y = y->next) {
if (!x || !y) return false;
if (x->data != y->data) return false;
}
return true;
}
答案 3 :(得分:0)
据我所知,代码是一个循环来检查两个chainCell
对象是否相同。
(相同== true)以使while循环退出。
B点正在检查如果被比较的任何一个chainCell为null而另一个不为null,则比较返回false。
循环的退出是由xp到达它为空的点。
我也同意Shafiks的评论,操作员是按位的,他们应该是合乎逻辑的。