【发布时间】: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