这里只贴了函数,该函数依赖于上一篇博文单链表及单链表基本操作的实现
//删除所有等于x的结点
void SingleListRemoveall(SingleList* sl, DataType x) {
assert(sl);
SingleListNode* cur = sl->_head;
SingleListNode* prev = NULL;
SingleListNode* tmp = NULL;
若链表不存在直接返回
if (cur == NULL) {
return;
}
while (cur->_next) {
//若当前结点等于x
if (cur->_data == x) {
//处理结点连续等于x的情况
while (cur->_data == x&&cur->_next) {
tmp = cur;
cur = cur->_next;
prev->_next = cur;
free(tmp);
tmp = NULL;
}
}else if (prev == NULL&&cur->_data==x) {
//处理只有一个结点的情况
free(cur);
cur = NULL;
}else{
//若不相等,则跳过当前结点
prev = cur;
cur = cur->_next;
}
}
if (cur->_data== x) {
free(cur);
prev->_next = NULL;
}
}