如果链表中有两个与key值相等的元素,怎么才能把两个都删除,而不是只删除第一个与Key值相等的元素

单链表按值删除
如果链表中有两个与key值相等的元素,怎么才能把两个都删除,而不是只删除第一个与Key值相等的元素

//5、屏幕提示后,在以DLList为头指针的线性表中删除这个元素key
//屏幕显示删除成功与否的信息
void del(Node *DLList1,int key)
{
    //删除以DLList1为头结点的单链表中值为key的第一个结点 
    Node *p=DLList1,*q=DLList1->next;
    printf("输入需删除的元素值:\n");
    scanf("%d",&key);
    int flag=0;
    while (q!=NULL&&q->data!=key) {
        p=q;
        q=q->next;
        flag++;
    } //p始终指向q的前一个结点
    if (q->data==key) {
        p->next=q->next;
        free(q);
        flag++;
        printf("删除成功\n比较次数:%d\n",flag);
    }else{
        printf("所要删除的结点不存在!\n");
    }    
    wait();
}

可以在循环里面修改,判断节点值是不是与key相等然后再删除,而不是退出循环


//屏幕显示删除成功与否的信息
void del(Node *DLList1,int key)
{
    //删除以DLList1为头结点的单链表中值为key的第一个结点 
    Node *p=DLList1,*q=DLList1->next;
    printf("输入需删除的元素值:\n");
    scanf("%d",&key);
    int flag=0;
    int count = 0;
    while (q!=NULL) {
        p=q;
        q=q->next;
        if (q->data==key) {//删除所有与key相等的节点
          p->next=q->next;
          free(q);
          q = p->next;
          count++;
          //if(count == 2) break; //可以选择全部删除也可以限定只删除的个数为两个
        }
        flag++;
    } //p始终指向q的前一个结点
    if (count != 0) {
        printf("删除成功%d个%d值\n比较次数:%d\n",count,key,flag);
    }else{
        printf("所要删除的结点不存在!\n");
    }    
    wait();
}