-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

2 つのリンクされたリストに同じ値が含まれていることを確認します。

明らかに、1 つのリストが短い場合、それらは同一ではありません (ポイント B)。

break注: ここで/を使用する方が良いと思いますreturn。コードが読みやすくなります。

注2:コメントに記載されているように、それらは論理演算子でなければなりません。そのままで動作しますが、少し混乱します。

注 3: ループ内のループの前にテストを移動することができます ( while(1))。これにより、ループの最後にテストする必要がなくなります。

これは単なる醜いコードです。12 行ではなく、約 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

私が理解しているように、コードは2つのchainCellオブジェクトが同じかどうかを確認するためのループです。

(same == true) は、一致しない cellChains 内の位置が見つかった場合に while ループを終了させるために含まれています。

ポイント B は、比較される chainCells のいずれかが null で、もう一方が null でない場合、比較が false を返すことを確認しています。

ループからの終了は、xp が null になるポイントに到達することによって発生します。

Shafiks のコメントにも同意します。演算子はビット単位であり、論理的でなければなりません。

于 2013-08-14T14:55:49.663 に答える
0

この関数bool sameValues (chainCell *x, chainCell *y)は、2 つの構造体 chainCell が同じ値を持つかどうか、つまり、x と y の間の chainCell タイプのすべてのフィールドが等しいかどうかをチェックします。

「ループ コントロールに (same == true) が含まれているのはなぜですか?」

ブール値 same は、以前にチェックされたフィールドが等しいかどうかを示す指標です。の場合same == false、x と y の値が同じではないと結論付けられ、while ループが壊れる可能性があります。

ポイント B の if ステートメントの目的は何ですか?

if ステートメントは、2 つのフィールドが両方とも null であるか、両方とも null でない場合にのみ、2 つのフィールドが等しいという条件を設定します。

于 2013-08-14T12:21:36.253 に答える