#include<stdio.h>
#include<stdlib.h>
/*
* 设计一个递归算法,删除不带头结点的单链表L中的所有值为x的结点
*/
typedef struct LNode //嵌套定义结点
{
int data;
struct LNode* next;
}LNode,*Linklist;
Linklist CreateLinklist(Linklist &L1) //尾插法创建链表
{
int x;
L1 = (Linklist)malloc(sizeof(LNode));
LNode* s;
LNode* r = L1;
scanf("%d", &x); //读入数据 0 1 4 3 4 99
while (x != 99)
{
s = (LNode*)malloc(sizeof(LNode)); //申请一个新结点
s->data = x;
r->next = s; //把结点s的地址放到头结点的next域
r = s; //把指针r指向新的表尾结点
scanf("%d", &x); //输入第2个元素,以此往复
}
r->next = NULL; //注意把最后一个元素的next域置空
return L1;
}
Linklist DeleteElem(Linklist& L1, int x)
{
LNode* p;
if (L1 == NULL)
return 0;
if (L1->data == 4)
{
p = L1;
L1 = L1->next;
free(p);
DeleteElem(L1, 4);
}
else
{
DeleteElem(L1->next, 4);
}
}
void PrintList(Linklist L1) //打印链表
{
L1 = L1->next; //让头结点指向第一个元素
while (L1 != NULL)
{
printf("%4d", L1->data);
L1 = L1->next;
}
printf("\n");
}
int main()
{
Linklist L1;
CreateLinklist(L1);
DeleteElem(L1,4);
PrintList(L1);
return 0;
}