王道p40 1.设计一个递归算法,递归删除单链表L中所有值为x的结点(c语言)

视频讲解在这里:

p40 第1题 王道数据结构课后代码题c语言代码实现_哔哩哔哩_bilibili 

本题代码如下

void delete(linklist* L,int x)//递归删除x
{
	if((*L)->next!= NULL)
	{
		if ((*L)->next->data == x)//找到x
		{
			lnode* p = (*L)->next;
			(*L)->next = p->next;
			free(p);
			delete(&(*L), x);
		}
		else
		{
			delete(&(*L)->next, x);
		}
	}
}

完整测试代码

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 4;
int a[4] = { 1,2,2,4 };
void buildlinklist(linklist* L)//建立单链表
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	int i = 0;
	lnode* s = *L, * r = *L;
	for (i = 0; i < n; i++)//头插法建立单链表
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void delete(linklist* L,int x)//递归删除x
{
	if((*L)->next!= NULL)
	{
		if ((*L)->next->data == x)//找到x
		{
			lnode* p = (*L)->next;
			(*L)->next = p->next;
			free(p);
			delete(&(*L), x);
		}
		else
		{
			delete(&(*L)->next, x);
		}
	}
}
void print(linklist* L)//输出单链表
{
	lnode* p = (*L)->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}
int main()
{
	linklist L;
	buildlinklist(&L);
	printf("原始链表为:");
	print(&L);
	delete(&L, 2);
	printf("删除后的链表为:");
	print(&L);
	return 0;
}

你可能感兴趣的:(王道课后习题单链表,算法,c语言,数据结构)