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

#include <stdio.h>
#include <stdlib.h>
struct DLB
{
	int data;
	struct DLB *next;   //指向下一个结点的指针
};
struct DLB *Create();
void Shu(struct DLB *L);
struct DLB *Shan(struct DLB *L);
void Ss(struct DLB *p,int x);
int main()
{
	struct DLB *L;
	L=Create();   //创建L链表
	printf("链表初始元素如下:\n");
	Shu(L);       //检查链表是否创建成功

	//非递归算法
	L=Shan(L);    //删除链表值为x的元素,与输入一样,因为要对链表做改动然后返回链表,所以函数都是定义的单链表类型
	printf("非递归算法删除结果如下:\n");
	Shu(L);       //检查删除是否成功

	//递归算法
	int x;
	printf("请输入要删除的元素值:");
	scanf("%d",&x);
	Ss(L,x);
	printf("递归算法删除结果如下:\n");
	Shu(L);       //检查删除是否成功

	return 0;
}
struct DLB *Create()   //创建链表
{
	struct DLB *head=NULL,*p,*p1;
	p=(struct DLB *)malloc(sizeof(struct DLB));
	printf("请输入单链表元素,输入-1回车结束:");
	scanf("%d",&p->data);
	p->next =NULL;
	while(p->data !=-1)
	{
		if(head==NULL)
		{
			head=p;
			p1=p;
		}
		else
		{
			p1->next =p;
			p1=p;
		}
		p=(struct DLB *)malloc(sizeof(struct DLB));
	    scanf("%d",&p->data);
	    p->next =NULL;
	}
	return head;
}

void Shu(struct DLB *L)    //输出链表
{
	struct DLB *p;
	p=L;
	while(p->next !=NULL)
	{
		printf("%3d",p->data );
		p=p->next ;
	}
	printf("%3d\n",p->data );      //因为虽然它指向的下一个结点为空,但是它这个结点本身还是存有元素
}


//非递归算法删除单链表元素
struct DLB *Shan(struct DLB *L)
{
	int x;
	printf("请输入要删除的元素值:");
	scanf("%d",&x);
	struct DLB *head,*p,*p1;
	head=(struct DLB *)malloc(sizeof(struct DLB));
	head->next =L;     //这里我用它指向头结点,便于出现头结点需要删除的情况
	p=head;
	p1=L;
	
	while(p1->next !=NULL)
	{
		if(p1->data ==x)
			p->next =p1->next ;
		else
		{
		p=p->next ;
		}
		p1=p1->next ;
	}
	if(p1->data ==x)    //这里跟之前的输出是一个道理,需要判断剩余的最后一个元素是否需要删除,如果需要删除的话直接让它的上一个结点指向NULL。
		p->next =NULL;
		return head->next ;

}

//递归算法删除单链表元素
void Ss(struct DLB *L,int x)
{
	struct DLB *p;
	if(L==NULL)
		return;  //链表删除结束,结束函数递归
	if(L->data ==x)
	{
		p=L;
		L=L->next ;
		free(p);
		Ss(p,x);
	}
	else
		Ss(L->next ,x);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值