我正在重构一些 C 代码,有一段时间我一直在解决与链表数据结构相关的问题。请看一下下面的简化片段:
Link apply(Link first, pred_ptr cond)
{
Link t=first->next,p=first;
do{
if(cond(t))
{
p->next=t->next;
free(t);
t=p;
}
p=t;
t=t->next;
}while(t!=first);
//Check the first
if(cond(first))
{
t=first->next;
free(first);
first=t;
p->next=t;
}
return first;
}
函数apply从链表中删除函数cond返回非零值的所有元素。 链接是这样的:
struct node
{
struct node* next;
//Stuff
};
typedef struct node* Link
好吧,我唯一的问题是如何apply删除链表的第一个元素 -first-,看起来像是循环外的额外代码为了评估第一个元素,我无法在没有额外的 if 语句的情况下将此检查放入循环中,也许您可能知道如何从循环中删除额外的代码 - 如果可能 - ,你呢?
谢谢
祝你有美好的一天。
最佳答案
第一个元素是一种特殊情况,因此您的代码与其他情况略有不同也就不足为奇了。因此,您的替代方案是(1)在示例中完成的方式,(2)将特殊情况代码放入主循环中,并在每次迭代中执行 if 比较,或者(3)使用指向指针的指针的不太容易理解的版本。
您应该问自己的第一个问题是:为什么要重构?为了清楚起见还是因为已经证明需要更快的实现?或者...?
关于c - 从链表中删除元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26061132/