用递归算法以及循环算法,删除不带头结点的单链表L中所有值为x的结点(C语言)

递归算法:(传入的是二级指针变量)

思想:执行删除操作后递归自己当前指针,不执行删除操作时递归自己当前指针的指针域next

可以根据下图结合代码加以理解:

int Del_elems(Link *L, int e) {//不带头结点
	Link p;
	if ((*L)->data == e) {
		p = *L;
		*L = (*L)->next;
		free(p);
		Del_elems(L, e);//如果销毁,下次传入的指针是修改后的自己
	}
	else if ((*L)->next == NULL)
	{
		return OK;
	}
	else
	{
		Del_elems(&(*L)->next, e);//如果不销毁,下次传入的指针是自己的next指针,并且next指针也会根据上面的if自动判断是否更改next自己本身的值
	}
	return OK;
}

循环算法:(传入的是二级指针变量)

思想:首先一直循环当前指针,直到确定自己当前指针所指向的data值不是所要删除的值;至此传入的原指针不要再发生改变,剩下的交给临时指针完成。

临时指针:

p:前锋指针,负责探明自己所在位置的值是不是要删除的元素

q:p的影子,永远跟在p的前一位,确保p当前值为要删除的元素时,更改q自己的next值使其指向要删元素的下一位

r:替死鬼,p遇到要删的值时出现,代替p当前位置,p继续向前,r留在原地被释放。。。

代码如下:

int Del_elems_2(Link* L, int e) {
	Link p, q, r;
	while ((*L)->data == e) {
		(*L) = (*L)->next;
	}
	p = (*L)->next;
	q = *L;
	while (1) {
		if (p->data == e) {
			r = p;
			p = p->next;
			q->next = p;
			free(r);
		}
		else if (!p->next) {
			return OK;
		}
		else {
			q = p;
			p = p->next;
		}
	}
	
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值