C语言 在带头结点的单链表中删除所有值为X的节点,以及区间节点并释放其空间
算法思想
因为L带头节点所以可以利用节点的前驱节点
来删除节点,用*s遍历整个链表,当找到s的下一个节点
为X值时,删除s的下一个节点
,本算法还可以优化为删除区间节点
,他的核心在于改变判断条件
结构体
typedef struct SqNode {
int data;
struct SqNode * Next;
}SqNode,*SqList;
删除X值函数
SqList DeleteValueElement(SqNode* L, int Value)
{
SqList s;
SqList p;//定义指向待删除的节点
s = L;
while (s!=NULL)
{
if (s->Next->data == Value)//如果s的下一个节点等于X
{
p = s->Next;//记住s的下一节点
s->Next = s->Next->Next;//s指向下下一个节点
free(p);//释放等X的节点
}
s = s->Next;
}
return L;
}
运行截图
优化
删除区间节点
SqList DeleteSectionElement(SqNode* L,int Value1,int Value2)
{
/*
第一个参数:链表的头节点地址
第二个参数:删除节点区间的开始值
第三个参数:删除节点区间的结束值
函数功能:删除[Value1,Value2],区间的节点
*/
SqList p;//指定待删除的节点
SqList s = L;
while (s->Next!=NULL)
{
if (s->Next->data >= Value1 && s->Next->data <= Value2 )//判断节点是否符合条件
{
p = s->Next;
s->Next = s->Next->Next;
free(p);
}
else
{
s = s->Next;
}
}
return L;
}