#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; }
递归求链表的最大值、节点数、平均值
于 2023-04-01 22:35:02 首次发布