【问题标题】:Need advice with logic in the loop需要循环中的逻辑建议
【发布时间】:2013-04-09 18:39:03
【问题描述】:

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

基于一些布尔标志,我必须对两个元素中的第一个执行foo() 操作(如果true),并在剩余的单个元素上执行bar() 操作(如果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;
}

但是代码突然变丑了。

有没有办法在不使用标志并保持代码干净的情况下解决这个问题?

【问题讨论】:

  • 代码对我来说并不难看。也许在你的链表实现中,你可以添加一个bool,如果它是列表的第一个元素,则设置为true,否则设置为false。
  • 我自己的实现
  • 这个函数实际上相当大,标志使它的可读性降低。
  • 是的,头部变量。在此代码中,head 应为“temp”以保持订单,但我希望它更具可读性。
  • 嗯,我认为有一些方法没有标志,既不在循环中,也不在结构内部。但如果没有,我可以用标志来做这个,谢谢。

标签: c++ c coding-style


【解决方案1】:
void NullFunc( void ) {}
void (*operation)(void) = foo;

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

    head = head->next;
}

【讨论】:

  • 这不会在第二个元素true 上调用bar()。 OP 说只有当flag 是false 时,他才想调用bar()。
  • 你是对的......我错过了他只想在false 标志上调用bar()。上面的更正应该可以解决这个问题。
猜你喜欢
  • 1970-01-01
  • 2011-04-21
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多