数据结构—递归运用之遍历输出链表中的各个节点

1.数据结构是递归的

  • 某些数据结构本身具有递归的特性,则它们的操作可递归地描述
  • 例如,对于链表,其结点 LNode的定义由数据域data和指针域next组成,而指针域next是一种指向LNode类型的指针,即 LNode的定义中又用到了其自身,所以链表是一种递归的数据结构。
  • 对于递归的数据结构,相应算法采用递归的方法来实现特别方便。

2.遍历输出链表中各个结点的递归算法

  • 算法步骤
    • ①如果p为NUL,递归结束返回。
    • ②否则输出p>data,p指向后继结点继续递归。
  • 算法描述
// 遍历输出链表中各个结点的递归算法
void TraveList(LinkList p) 
{
	if (p == NULL)
		return;     //递归终止
	else 
	{
		printf("%d ", p->data);   // 输出当前结点的数据域
		TraveList(p->next);    // p指向后继指点继续递归
	}
}

3.代码实现

  • mian.cpp
#include

using namespace std;

//单链表的存储结构
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode, *LinkList;

// 单链表的初始化
int InitList(LinkList &L)
{
	//构造一个空的单链表
	L = new LNode;
	L->next = NULL;

	return 1;
}

//判断链表是否为空
int ListEmpty(LinkList L)
{
	if (L->next)
	{
		return 0;    //非空 
	}
	else
	{
		return 1;   //链表为空 
	}
}

// 获取链表长度
int ListLength(LinkList L)
{
	int length = 0;
	LNode *p;
	p = L->next;

	while (p)
	{
		length++;
		p = p->next;
	}

	return length;
}
//// 遍历单链表
//void TraveList(LinkList L)
//{
//	LNode *p;
//	p = L->next;
//	printf("链表结果如下:\n");
//
//	while (p)
//	{
//		printf("%d ", p->data);
//		p = p->next;
//	}
//
//	printf("\n");
//}


// 遍历输出链表中各个结点的递归算法
void TraveList(LinkList p) 
{
	if (p == NULL)
		return;     //递归终止
	else 
	{
		printf("%d ", p->data);   // 输出当前结点的数据域
		TraveList(p->next);    // p指向后继指点继续递归
	}
}

//后插法创建单链表 
void CreateList(LinkList &L, int n)
{
	L = new LNode;
	L->next = NULL;
	LNode *r;
	r = L;
	printf("请依次输入%d个元素的值:\n", n);

	for (int i = 0; i < n; i++)
	{
		printf("请输入第%d个元素值:", i + 1);
		LNode *p;
		p = new LNode;
		scanf("%d", &p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

int main()
{
	LinkList L;

	InitList(L);
	if (ListEmpty(L))
	{
		printf("链表为空.\n");
	}
	else
	{
		printf("链表非空.\n");
	}

	printf("请输入链表中元素的个数:");
	int n;
	scanf("%d", &n);
	CreateList(L, n);
	printf("链表长度:%d\n", ListLength(L));
	printf("遍历链表:");
	TraveList(L->next);
	printf("\n");
	
	system("pause");

	return 0;
}
  • 运行结果

数据结构—递归运用之遍历输出链表中的各个节点_第1张图片

你可能感兴趣的:(数据结构)