我有双重链接列表的三个元素,我有两个操作:foo()
和bar()
。
基于一些布尔标志,我必须在两个元素的第一个上执行foo()
操作(如果true
),并且bar()
操作(如果false
)on剩下的单个元素。
所以,这是干净的代码,但是错误,因为它对两个元素执行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;
}
但是代码突然变得丑陋。
有没有办法在不使用标志的情况下解决这个问题,并保持代码清洁?
答案 0 :(得分:1)
void NullFunc( void ) {}
void (*operation)(void) = foo;
while( head->next != NULL )
{
if( head->flag == true )
{
operation();
operation = NullFunc;
}
else
{
bar();
}
head = head->next;
}