-1

以下代码;

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 语句的目的是什么?我不确定布尔表达式正在检查什么?

任何有助于进一步理解的帮助将不胜感激!

4

4 回答 4

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.
};
于 2013-08-14T12:13:59.227 回答
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;
}
于 2013-08-14T12:41:29.513 回答
0

据我了解,代码是检查两个chainCell对象是否相同的循环。

(same == true) 包括在内,如果在 cellChains 中找到不匹配的位置,则导致 while 循环退出。

B 点检查是否有一个被比较的 chainCell 为 null 而另一个不为 null,则比较返回 false。

退出循环将由 xp 到达它为空的点引起。

我也同意 Shafiks 的评论,运算符是按位的,它们应该是合乎逻辑的。

于 2013-08-14T14:55:49.663 回答
0

该函数bool sameValues (chainCell *x, chainCell *y)检查两个struct chainCell 是否具有相同的值,即x 和y 之间的chainCell 类型的每个字段都相等。

“为什么循环控制包含 (same == true) ?”

布尔值same 是先前检查的字段是否相等的指示符。如果same == false,则断定 x 和 y 的值不相同,while 循环可能会中断。

B点的if语句的目的是什么?

if 语句设置了两个字段可以相等的条件,只有当两个字段都为空或都不为空时。

于 2013-08-14T12:21:36.253 回答