递归求链表的最大值、节点数、平均值

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define minnum -9999999//定义一个足够小的数
typedef int Elemtype;
//链表的结构体类型
typedef struct LinkNode {
	Elemtype data;
	struct LinkNode* next;
}LinkNode,*LinkList;
//头插法创建链表
void creatLinkList(LinkList &L) {
	L = (LinkNode*)malloc(sizeof(LinkNode));
	L->next = NULL;
	int num;
	while (scanf("%d", &num) && num < 99999) {
		LinkNode* pnode = (LinkNode*)malloc(sizeof(LinkNode));
		pnode->data = num;
		pnode->next = L->next;
		L->next = pnode;
	}
}
//输出链表中元素(方便检查链表创建是否正确)
void printLinkList(LinkList L) {
	LinkNode* pnode = L->next;
	while (NULL != pnode) {
		printf("%d ", pnode->data);
		pnode = pnode->next;
	}
}
//递归求链表最大值
int getmax(LinkNode *pcur ) {
	if (NULL == pcur) {
		return minnum;//空表,无最大值
	}
	int temp = getmax(pcur->next);//递归求解pcur后的子链的最大值
	return temp > pcur->data ? temp : pcur->data;//返回重pcur出发子链的最大值
}
//求链表节点数
int getnodes(LinkNode* pcur) {
	if (pcur == NULL) {//空表节点数为0
		return 0;
	}
	//pcur后子链的长度+当前该节点=pcur出发的子链节点数
	return getnodes(pcur->next) + 1;
}
//递归求和
double getsum(LinkNode* pcur) {
	if (pcur == NULL) {//空表,和为0
		return 0;
	}
	//pcur后的子表的和+pcur的值=pcur开始的子表的和
	return getsum(pcur->next) + pcur->data;
}
int main() {
	LinkList L = NULL;
	creatLinkList(L);
	LinkNode* pcur = L->next;
	int maxnum = getmax(pcur);//求最大值
	int nodes = getnodes(pcur);//求节点数
	double ave = getsum(pcur) / (double)nodes;//求平均值
	printf("%d %d %.2f", maxnum,nodes,ave);
	//printLinkList(L);
	return 0;
}
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会注意回答问题。关于你的问题,递归算法可以实现以下三个操作: ① 链表的最大整递归链表节点开始,每递归到一个节点就和当前最大值比较,更新最大值并继续递归下一个节点直到链表节点。 代码如下: int getMax(Node* head) { if (head == NULL) { return -1; // 链表为空返回-1 } if (head->next == NULL) { return head->data; // 已经到达链表末尾,返回当前节点值 } int maxVal = getMax(head->next); // 继续向下递归 return max(head->data, maxVal); // 返回较大的值 } ② 链表的结点个递归链表节点开始,每递归到一个节点就将计器加1,继续递归下一个节点直到链表节点。 代码如下: int countNodes(Node* head) { if (head == NULL) { return 0; // 链表为空,节点为0 } return 1 + countNodes(head->next); // 继续向下递归并累加计器 } ③ 所有整平均值递归链表节点开始,每递归到一个节点就将节点值加到累加器,并统计节点,继续递归下一个节点直到链表节点。当到达链表节点时,计算累加器除以节点平均值。 代码如下: double getAvg(Node* head, double sum, int count) { if (head == NULL) { return 0; // 链表为空,平均为0 } sum += head->data; // 累加节点值 count++; // 计算节点 if (head->next == NULL) { return sum / count; // 已经到达链表节点,计算平均 } return getAvg(head->next, sum, count); // 继续向下递归 }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值