#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);
}
设计递归和非递归算法删除不带头结点的单链表L中的所有值为x的节点
最新推荐文章于 2024-02-03 17:48:34 发布