分析:如下图所示
代码如下:
struct Node * Del(struct Node *head,int nodeData){
struct Node *p1,*p2; //p1指向待删除的节点,p2指向p1前面的节点
int flag = 0; //定义一个标志,如果是1 则已经找到要删除的节点 如果是0 则没找到
p1 = head; //p1先指向头结点,从头开始找
while(p1 && !flag){ //如果链表还没找完,或者还没有找到给定的值 那么就一直往后找
if(p1->data == nodeData){ //找到给定值了将flag置为1
flag = 1;
if(p1 == head) //如果直接是头结点就是要删除的节点 那么把头结点的地址向后移动一位
head = head->next;
else //如果要删的不是头结点,那么就把p1前面的p2指向p1后面的节点
p2->next = p1->next;
free(p1); //最后释放p1
}
else{ //如果没有找到指定值
p2 = p1; //那么就用p2指向p1,用来保存p1
p1 = p1->next; //p1向后移动一位 这是p2就永远是p1的前一个节点
}
}
if(flag == 0){
printf("no data in list\n");
}
return head;
}
运行结果: