#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode //单链表结构体
{
int data;
struct Lnode* next;
} LinkNode;
void DispList(LinkNode*L) //输出函数
{
LinkNode*p=L;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void CreatList(LinkNode*&L,int a[],int n) //数组数据建立链表函数尾插法
{
LinkNode*p,*q;
L=(LinkNode* )malloc(sizeof(LinkNode));
q=L;
for(int i=0;i<n;i++)
{
p=(LinkNode * )malloc(sizeof(LinkNode));
p->data=a[i];
q->next=p;
q=p;
}
q->next=NULL;
}
void creat(LinkNode*&L) //单链表创建函数
{
LinkNode*p=(LinkNode*)malloc(sizeof(LinkNode)),*q;
printf("请输入链表数据,输入0结束\n");
scanf("%d",&p->data);
if(p->data==0) //若输入为0
{
L=NULL;
free(p);
return;
}
L=q=p; //先连接首节点
while(1)
{
p=(LinkNode*)malloc(sizeof(LinkNode));
scanf("%d",&p->data);
if(p->data==0)
{
free(p);
break;
}
q->next=p; //尾插
q=p;
}
q->next=NULL;
}
void del(LinkNode*&L,int x) //删除不带头结点单链表第一个值为x的节点
{
LinkNode*p;
if(L==NULL)
{
printf("删除结束\n");
return;
}
else if(L->data==x)
{
p=L;
L=L->next; //传入节点为上一节点既相当于L->next,&引用使得形参跟着实参变,此时实参为上个递归中的L->next,这里修改了L的值即修改了上个递归中的L->next,相当于L->next=L->next->next
free(p);
return;
}
else
del(L->next,x);
}
void delall(LinkNode*&L,int x) //删除不带头结点单链表全部值为x的节点
{
LinkNode*p;
if(L==NULL)
{
printf("删除结束\n");
return;
}
else if(L->data==x)
{
p=L;
L=L->next; //传入节点为上一节点既相当于L->next,&引用使得形参跟着实参变,此时实参为上个递归中的L->next,这里修改了L的值即修改了上个递归中的L->next,相当于L->next=L->next->next
free(p);
delall(L,x); //因为L节点已经前移,所以这里参数为L
}
else
delall(L->next,x);
}
void main()
{
LinkNode*L=NULL,*L1=NULL;
int x;
creat(L);
DispList(L);
printf("请输入要删除的数据x:");
scanf("%d",&x);
del(L,x);
printf("删除第一个x后链表数据为:\n");
DispList(L);
creat(L1);
DispList(L1);
printf("请输入要删除的数据x:");
scanf("%d",&x);
delall(L1,x);
printf("删除全部x后链表数据为:\n");
DispList(L1);
}
数据结构:设有一个不带头结点的单链表L,设计两个递归算法,del(L,x)删除单链表L中第一个值为x的节点,delall(L,x)删除单链表L中的最小节点值。
最新推荐文章于 2023-08-25 07:33:24 发布