1

我有双向链表的三个元素,我有两个操作:foo()bar()

基于一些布尔标志,我必须对两个元素中的第一个执行foo()操作(if ),并对剩余的单个元素执行操作(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() 函数(我不能如上所述)。

实际上,当我再次分析它时,我发现在每种情况下我都会调用这个函数两次。

我想出的解决方案是:

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 回答