void delete(struct node **top,int val)
{
    struct node *cur=(*top);
    while(cur!=NULL&&(cur)->data!=val)
    {
        cur=cur->next;
        if(cur==(*top))
        {
            if((*top)->next!=NULL)
            {
                (*top)=(*top)->next;
                (*top)->prev=NULL;
            }
            else
                (*top)=NULL;
        }
        else
        {
            cur->prev->next=cur->next;
            if(cur->next!=NULL)
                cur->next->prev=cur->prev;
        }
        free(cur);
        printf("deleted %d \n",val);
    }
}

我的问题是:
有什么办法可以减少双链表delete函数中的代码?

最佳答案

这是我的实现,不是较短,但是您可以检查差异。也更干净。 p是头,g是尾节点。

void Container::Remove(int pr)
{
    Node *pDel = p; Node *pNex = p->next;
    while (pDel != NULL){
        if (pDel->item.GetValue() > pr){
            if (p == NULL || pDel == NULL) return;
            if (p == pDel) p = pDel->next;
            if (g == pDel) g = pDel->prev;
            if (pDel->next != NULL)
                pDel->next->prev = pDel->prev;
            if (pDel->prev != NULL)
                pDel->prev->next = pDel->next;
            delete pDel;
        }
        pDel = pNex;
        if(pDel != NULL) pNex = pDel->next;
    }
}

08-17 00:47