设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
话不多说直接上代码!
#include<stdio.h>
#include<stdlib.h>
/**
设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
*/
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}LNode,*LinkList;
//头插法建立单链表
//生成链表中元素顺序和输入元素顺序相反
LinkList createLinkListHead(LinkList &L){
int n;
Elemtype x;
L = (LNode *)malloc(sizeof(LNode));
if(L==NULL){
printf("申请空间失败");
}
L->next = NULL;
printf("输入单链表的个数:\n");
scanf("%d",&n) ;
printf("输入结点的值:\n");
for (int i = 0; i<n; i++)
{
LNode *p; //要插入的结点
p = (LNode *)malloc(sizeof(LNode));
scanf("%d", &x);
p->data = x;
p->next = L->next;
L->next = p;
}
return L;
}
//尾插法建立单链表
//生成链表中元素顺序和输入元素顺序相同
LinkList createLinkListStern(LinkList &L){
//从表头到表尾正向建立单链表L,每次均在表尾插入元素
int n;
Elemtype x;
L=(LinkList)malloc(sizeof(LNode));
printf("输入单链表的个数:\n");
scanf("%d",&n) ;
printf("输入结点的值:\n");
LNode *s,*r=L;//r为表尾指针
// scanf("%d",&x);//输入结点的值
for (int i = 0; i<n; i++)
{
scanf("%d",&x);//输入结点的值
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r=s; //r指向新的表尾结点
}
r->next=NULL;//尾结点指针置空
return L;
}
void deleteElem(LinkList &L,Elemtype x)
{
LNode *p;//p指向待删除的结点
if(L==NULL){//递归出口
return;
}
if(L->data==x){//若 L所指结点的值为x
p=L;//删除*L,并让L指向下一结点
L=L->next;
free(p);
deleteElem(L,x);//递归调用
}else{//若L所指向的结点均不为x
deleteElem(L->next,x);//递归调用
}
}
//输出链表的值
void display(LinkList &L)//遍历
{
LNode *p;
printf("输出单链表:\n");
for (p=L->next; p!=NULL;p =p->next)
{
printf("元素:%d ", p->data);
}
}
int main()
{
LinkList L1,L2;
//头插法建立单链表
printf("*************************头插法建立单链表*******************\n ");
createLinkListHead(L1);
printf("原始链表:\n");
display(L1);
deleteElem(L1,3);
printf("删除后:\n");
display(L1);
//尾插法建立单链表
printf("**************************尾插法建立单链表*****************\n ");
createLinkListStern(L2);
printf("原始链表:\n");
display(L2);
deleteElem(L2,3);
printf("删除后:\n");
display(L2);
return 0;
}
实验结果: