C语言单链表删除包含某个值的所有节点

/*
    删除包含某个值得所有节点,思路遍历计算出该值 出现的次数,然后写个大循环在里面处理值所在的节点在头部,中间,尾部的情况
*/
struct llist_node* llist_delete(struct llist_node* head, int value)
{
    struct llist_node* tmp = head;
    struct llist_node* ptr = head;
    int number = 0;
    while (ptr)
    {
        if (ptr->value==value)
        {
            ++number;
        }
        ptr = ptr->next;
    }
    while (number--)
    {
        if (tmp->value==value)
        {
            struct llist_node* tmp1 = tmp;
            tmp = tmp->next;
            free(tmp1);
            head = tmp;
        }
        else
        {
            struct llist_node* tmp = head;
            while (tmp)
            {
                if (tmp->next!=NULL)
                {
                    if (tmp->next->value==value)
                    {
                        struct llist_node* tmp1 = NULL;
                        tmp1 = tmp->next->next;
                        free(tmp->next);
                        tmp->next = tmp1;
                        tmp = tmp->next;
                    }
                    else
                    {
                        tmp = tmp->next;
                    }
                }
                else
                {
                    break;
                }
            }
        }
    }
    return head;
}

验证结果:

C语言单链表删除包含某个值的所有节点