设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点(C语言实现)

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点(C语言实现)

这个代码网上基本都是直接照搬的王道,但是由于某些院校是明确要求用C语言实现,你那个C++的引用符号&根本用不了,所以笔者这里用C语言实现一下该代码,代码具体思路网上也是一大堆。主要还是看看C语言如何实现。

//设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
//链表3,2,5,1,4,9,2,7,2,8
void del_x(LinkList* L, int x) {
	if ((*L) == NULL) {//递归跳出条件
		return;
	}
	if ((*L)->data == x) {//当前链头元素为x,可以直接把首结点扔了
		LNode* p = (*L);//用p遍历链表
		(*L) = (*L)->next;//舍弃当前的首结点
		free(p);//原先的首结点释放掉
		del_x(L, x);//遍历舍去首结点的链表
	}
	else {//首结点data不为x
		LinkList* s = &((*L)->next);
		//我们这里的L是LinkList*类型,对它解引用才是链表
		//然后链表的下一个子链表,取地址赋给LinkList*类型的s
		del_x(s, x);//对子链表进行递归(传参的s是子链表的地址)
	}
	
}
int main()
{
	LinkList L = NULL;
	InitList1(&L);//初始化一个不带头结点的链表1,2,2,3,3,3,4,4,4,4
	printf("初始链表为:");
	print1(L);

	printf("\n");

	del_x(&L, 2);//把链表中的2删除
	printf("删除2后的链表为");
	print1(L);

	printf("\n");

	del_x(&L, 3);//把链表中的2删除
	printf("删除3后的链表为");
	print1(L);

	printf("\n");

	del_x(&L, 4);//把链表中的2删除
	printf("删除4后的链表为");
	print1(L);
}

设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点(C语言实现)_第1张图片
ps:不带头结点链表的初始化,及打印函数

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//单链表定义
//链表结点
int A[10] = { 1,2,2,3,3,3,4,4,4,4 };
typedef struct {//定义单链表结点类型
	int data;//数据域
	struct LNode *next;//指针域
}LNode, *LinkList;

//不带头结点初始化-尾插法
void InitList1(LinkList* L) {
	(*L) = (LNode*)malloc(sizeof(LNode));
	LNode* rear = (*L);//标记表尾
	int i = 0;
	for (i = 0;i < 10;i++) {
		if (i == 0) {
			(*L)->data = A[i];
		}
		else {
			LNode*p = (LNode*)malloc(sizeof(LNode));//创建一个新结点
			p->data = A[i];//新结点赋值
			rear->next = p;//接到链表上
			rear = p;//rear放到表尾
		}
	}
	rear->next = NULL;
}

void print1(LinkList L) {//打印不带头结点的链表
	LNode* i = L;//用i指针遍历整个链表
	while (i != NULL) {
		printf("%d ", i->data);
		i = i->next;
	}
}

你可能感兴趣的:(数据结构代码汇总,算法,c语言,递归,链表)