小组作业--递归实现

题目:已知L为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法:
①求链表中的最大整数;
②求链表的结点个数;
③求链表中所有节点数据的平均值。

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct node* LinkList;
struct node
{
	int data;
	LinkList next;
};
LinkList Intialization();//链表初始化,给链表添加新的节点
int return_max(LinkList L);//返回最大值
int get_length(LinkList L);//返回长度
double get_average(LinkList L,int len);//返回平均值
int main()
{
	LinkList L = Intialization();
	int max = return_max(L);
	cout << "max:" << max << endl;
	int length = get_length(L);
	cout << "length:" << length << endl;
	double average = get_average(L, length);
	cout << "average:" << average << endl;

	return 0;
}
double get_average(LinkList L,int len)
{
//已知链表节点长度,可以直接计算每个节点占平均值的大小,叠加
	if (L->next == NULL) return ((double)L->data)/len;
	//因为一开始定义的data是int类型,所以可以采用强制转换转换成double类型
	else return get_average(L->next,len) + ((double)L->data)/len;
}
int get_length(LinkList L)
{
	if (L->next == NULL) return 1;//当下一个节点为NULL,此时记作第一个节点
	else return get_length(L->next) + 1;//往上回溯过程中每一次++
}
int return_max(LinkList L)
{
	if (L->next == NULL) return L->data;
	else return max(L->data, return_max(L->next));//这里用到max函数,返回较大的一个数
}
LinkList Intialization()
{
//为什么这里不能对于空链表进行正确的反馈呢
//因为在这里头指针指向链表的首元素,当链表为空的时候,L=NULL,此时L->next并没有指向
	LinkList point1 = new node;
	point1->data = 4;
	LinkList point2 = new node;
	point2->data = 5;
	point1->next = point2;
	LinkList point3 = new node;
	point3->data = 7;
	point2->next = point3;
	LinkList point4 = new node;
	point4->data = 6;
	point3->next = point4;
	LinkList point5 = new node;
	point5->data = -3;
	point4->next = point5;
	point5->next = NULL;
	return point1;
}

结果就是这样的
在这里插入图片描述

但后来我们看到老师给的实验知道上说明要考虑空链表的存在
才发现我们之前的代码存在错误
下面是更正后的代码

#include<iostream>
#include<algorithm>
#define Min -1000000
using namespace std;
typedef struct node* LinkList;
struct node
{
	int data;
	LinkList next;
};
LinkList Intialization();
int return_max(LinkList L);
int get_length(LinkList L);
double get_average(LinkList L, int len);
int main()
{
	LinkList L = Intialization();
	int length = get_length(L);
	if (length == 0) {
		cout << "无节点" << endl << "不存在平均值和最大值" << endl;
		exit(0);
	}
	cout << "length:" << length << endl;
	int max = return_max(L);
	cout << "max:" << max << endl;
	double average = get_average(L, length);
	cout << "average:" << average << endl;

	return 0;
}
double get_average(LinkList L, int len)
{
	if (L == NULL) return 0;
	else return get_average(L->next, len) + ((double)L->data) / len;
}
int get_length(LinkList L)
{
	if (L == NULL) return 0;
	else return get_length(L->next) + 1;
}
int return_max(LinkList L)
{
	if (L == NULL) return Min;//定义一个极小值来进行比较
	else return max(L->data, return_max(L->next));
}
LinkList Intialization()
{
	LinkList head = NULL, tail = NULL;
	int k;//输入节点个数
	cin >> k;
	for (int i = 0; i < k; i++)
	{
		LinkList temp = new node;
		cin >> temp->data;
		temp->next = NULL;
		if (head == NULL) head = temp;//尾插法
		else tail->next = temp;
		tail = temp;
	}
	return head;
}

测试结果1
在这里插入图片描述
测试结果2
在这里插入图片描述

测试结果3
在这里插入图片描述

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值