递归法求链表的平均值C语言
时间: 2024-10-27 10:04:40 浏览: 12
《数据结构》实验报告:链表与二叉树
在C语言中,递归法求链表的平均值主要是通过遍历整个链表,累加所有节点的值,并计算总节点数。由于链表本身没有内置的长度获取方法,我们需要辅助一个计数器来记录节点数。以下是简单的递归实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 计算单个节点值加上前一个节点平均值
double addNodeAverage(ListNode* node, double average) {
if (node == NULL) {
return average;
} else {
// 递归结束条件,当前节点为空,返回上一节点的平均值
double nextAverage = addNodeAverage(node->next, average);
// 更新平均值并返回当前节点的贡献
return (node->val + nextAverage) / 2;
}
}
// 主函数,初始化链表并调用递归函数
double findListAverage(ListNode* head) {
if (head == NULL) {
return 0; // 空链表,平均值为0
} else {
// 初始化平均值为第一个节点的值
double average = head->val;
// 使用递归法计算整体平均值
return addNodeAverage(head->next, average);
}
}
// 创建和初始化链表示例
ListNode* createList(int values[], int size) {
ListNode* head = malloc(sizeof(ListNode));
head->val = values[0];
head->next = NULL;
for (int i = 1; i < size; i++) {
ListNode* newNode = malloc(sizeof(ListNode));
newNode->val = values[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
int main() {
int values[] = {1, 2, 3, 4, 5};
int size = sizeof(values) / sizeof(values[0]);
ListNode* listHead = createList(values, size);
double average = findListAverage(listHead);
printf("链表的平均值是: %.2f\n", average);
free(listHead); // 释放内存
return 0;
}
```
注意,这个例子假设链表已经创建好并且输入数组`values`包含了所有的链表元素。递归过程会终止当遇到链表末尾的`NULL`节点。
阅读全文