删除所有值是date的结点:
思路:找到所有date的值(即按值查找),类似头删一样删除值是date的结点,注意,第一个结点值是date时,头节点得变化;最后一个结点值是date时尾结点得变化(即头删,尾删)。
//删除节点的所有date值
int DeleteAllDate(SHead* s,SListDataType date) {
//边界判断
//1.链表不存在
assert(s != NULL);
//2.链表为空
assert(s->first != NULL);
//注意分情况讨论:第一个结点是date ,头节点改变;
//最后一个结点是date,尾结点改变,就是头删尾删,
//找date值得所有结点
//这就是按值查找
SListNode* cur = s->first;
SListNode* arr;
while (cur->next!=NULL) {
//第一个结点数据是date——头删
if (cur->value==date) {
cur = cur->next;
free(s->first);
s->first = cur;
continue;
}
//最后一个节点数据是date——尾删
if (cur->next->value==date&&cur->next==NULL) {
cur->next = NULL;
free(cur->next);
}
//其他节点删除情况
if (cur->next->value==date) { //找到值是date的结点,但是这时候cur还是在值是date的上一个结点。
arr = cur->next; //arr代表值是date的结点
cur->next = arr->next; //date的上个结点指向date的下一个结点
free(arr);
}
else {
cur = cur->next; //没找到继续找
}
}
return 0;
}