1

双方向リストの 3 つの要素があり、2 つの操作があります:foo()bar().

いくつかのブール値フラグに基づいて、2 つの要素の最初の要素に対して操作 (if ) を実行し、残りの 1 つの要素に対して操作foo()(if ) を実行する必要があります。truebar()false

したがって、これはきれいなコードですが、両方の要素に対して foo() を実行するため、間違っています。

while(head->next != NULL)
{
   if(head->flag == true)
   { 
      foo();
   }
   if(head->flag == false)
   {
      bar();
   }
   head = head->next;
}

リスト要素はランダムな順序で来る可能性があるため、A、C、B、または B、A、C になる可能性があります (どちらの場合も操作が必要な A と B としましょうfoo())。

私の問題は、A と B が最初に来る場合、両方で foo() 関数を呼び出すことです (上記のようにできません)。

実際、もう一度分析すると、どの場合でもこの関数が 2 回呼び出されることがわかります。

私が思いついた解決策は次のとおりです。

int flag = 0;
while(head->next != NULL)
{
   if(head->flag == true && flag == 0)
   { 
      foo();
      flag = 1;
   }
   if(head->flag == false)
   {
      bar();
   }
   head = head->next;
}

しかし、コードは突然醜くなります。

フラグを使用せずにコードをきれいに保つ方法はありますか?

4

1 に答える 1

1
void NullFunc( void ) {}
void (*operation)(void) = foo;

while( head->next != NULL )
{
    if( head->flag == true )
    {
         operation();
         operation = NullFunc;
    }
    else
    {
        bar();
    }

    head = head->next;
}
于 2013-04-09T18:47:30.227 に答える