设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点

代码如下:

void Del_X_3(LinkList &L,ElemType x)
{
	LNode *p;
	if(L==NULL)
		return ;
	if(L->data==x)
	{
		p=L;
		L=L->next;
		free(p);
		Del_X_3(L,x);//位置1

	}else 
	{
		Del_X_3(L->next,x);//位置2
	}
}

我们的疑点是递归操作中好像只进行了删除操作,而没有改变被删除结点的前驱,使其指向被删除结点的下一个结点。

例如p指向要删除的结点,q为该结点的前驱,那么要实现删除结点,代码为:q->next=p->next;


理解说明:

1、函数的递归调用时,总会再调用前将现有函数中的变量压入堆栈进行保存。

2、例如为了简便起见,我们定义一个单链表,且只含有三个数据:1,5,6.我们要删除的数据 为5。函数在执行时,走到位置2处,将L->next作为参数,传递到了函数Del_X_3中,这里传入的参数是引用类型,进入函数体后:

		p=L;  
		L=L->next; //这里L为调用该函数的外层L->next,故这里实现了L->next=L-next->next,如下图
		free(p);
		Del_X_3(L,x);


为了更好的理解编写工程运行一下,主函数如下:

(我们可以进行单步调试,看一下程序的执行流程,这里略)

typedef int ElemType ;
#include "lianbiaohead.h"
#include "lianbiaoname.h"
#include "lianbiaostruct.h"

void Del_X_3(LinkList &L,ElemType x)
{
	LNode *p;
	if(L==NULL)
		return ;
	if(L->data==x)
	{
		p=L;
		L=L->next;
		free(p);
		Del_X_3(L,x);

	}else 
	{
		Del_X_3(L->next,x);
	}
}

int main()
{
	const int NUM=3;
	ElemType a[NUM]={1,5,6};

	LinkList L;
	InitList(&L);
	LinkList p=L;
        LNode* p1=L;

	for(int i=0;i<NUM;i++)
	{
		LinkList s=(LinkList)malloc(sizeof(LNode));
		s->data=a[i];
		ListInsert_L(L,p,s);
        p=p->next;

	}
	cout<<"删除之前"<<endl;
	ListTraverse(L);

	Del_X_3(L->next,5);

	cout<<"删除之后"<<endl;
    ListTraverse(L);
	return 0;
}

执行效果如下:





  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值