设计一个递归算法,删除不带头结点的单链表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);

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

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

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

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;idata=a[i];
		ListInsert_L(L,p,s);
        p=p->next;

	}
	cout<<"删除之前"<next,5);

	cout<<"删除之后"<

执行效果如下:

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




转载于:https://www.cnblogs.com/raby/p/5886714.html

你可能感兴趣的:(设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点)