单链表按值删除
如果链表中有两个与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();
}