c - 从链表中删除元素

标签 c linked-list

我正在重构一些 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/

相关文章:

C - Malloc 或 calloc ......以及如何?

c++ - 使用#define 声明常量有什么好处?

c - 使用 malloc 创建多维数组时的奇怪行为

c - pthread_mutex_init 上的段错误

c++ - 链表插入问题

c - 我正在制作一个必须交换其顺序的链表

c - 查找数组之间的共同元素(匹配元素)

c++ - 我尝试键入一个函数以在单向链表的末尾添加一个节点,但它不起作用

java - 什么是数组链接结构或节点数组?

c - 双向链表中的结构内部结构