代码:
void Del_X_3(LinkList &L,ElemType x)
{
LNode *p; //p指向待删除结点,
if(L==NULL) //递归出口
return ;
if(L->data==x)
{
p=L;
L=L->next; //删除L,并让L指向下一结点
free(p);
Del_X_3(L,x);
}else
{
Del_X_3(L->next,x);//递归调用
}
}
详细代码:
#include <stdio.h>
#include <stdlib.h>
//定义单链表结构体
typedef struct LNode {//定义单链表结点类型
int data;//数据域
struct LNode* next;//指针域
}LNode, * LinkList;
//尾插法建立无头结点的单链表
void List_TailInsert(LinkList *L) {
int x;//要插入的元素
LNode *s,*r;//s为要插入的节点,r为表尾指针
printf("请输入单链表的元素(输入9999并按回车键表示输入结束):\n");
scanf("%d", &x);
while (x != 9999) {
s = (LNode *)malloc(sizeof(LNode));
s->data = x;
s->next = NULL;
if (NULL == *L) {
*L = s;//如果链表为空,将新结点置为首结点也是尾结点
r = *L;
} else {
r->next = s;
r = s;//新结点置位尾结点
}
scanf("%d", &x);
}
}
//递归删除不带头结点的单链表L中所有值为x的结点
void Del_X_3(LinkList &L,int x)
{
LNode *p; //p指向待删除结点,
if(L==NULL) //递归出口
return ;
if(L->data==x)
{
p=L;
L=L->next; //删除L,并让L指向下一结点
free(p);
Del_X_3(L,x);
}else
{
Del_X_3(L->next,x);//递归调用
}
}
//链表输出
void List_Print(LinkList L) {
while (L) {
printf("%d ", L->data);
L = L->next;
}
printf("\n");
}
int main() {
int x;
LinkList L = NULL;//空链表初始化
List_TailInsert(&L);//不带头结点尾插法
printf("原链表内容为:\n");
List_Print(L);//链表打印
printf("请输入你想要删除的数:");
scanf_s("%d", &x);
Del_X_3(L,x);
printf("删除数据后链表内容为:\n");
List_Print(L);//链表打印
return 0;
}
运行结果:
请输入单链表的元素(输入9999并按回车键表示输入结束):
23 454 92 78 6 9999
原链表内容为:
23 454 92 78 6
请输入你想要删除的数:92
删除数据后链表内容为:
23 454 78 6
请按任意键继续. . .