單鏈表遞迴求平均值
阿新 • • 發佈:2019-01-04
兩種解法:
第一:
double getAverage_List(LinkList L, double sum, int i){
if (L->next != NULL){
sum = sum + L->data;
return getAverage_List(L->next, sum, i+1);
}else{
double ave = (sum + L->data)/(i+1);
return ave;
}
}
第二:
以1,2,3為例,計算次序為3;(3*1+2)/2=2.5;(2.5*2+1)/3=2;
int count_LNode(LinkList L){ //統計節點個數,傳入連結串列首地址
if (L == NULL)return 0; //遞迴結束條件,遞迴到尾節點的下一個節點,直接返回
else return count_LNode(L->next) + 1; //否則繼續指向下一個節點,表長加1
}
n = count_LNode(L)
double getAverage_List(LinkList L,int n){//遞迴計算平均值
if (!L->next)return L->data;
else{
double ave = getAverage_List(L->next, n - 1);
return (ave*(n - 1) + L->data) / (n+1);
}
}
完整程式碼:
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct LNode
{
int data; //結點的資料域
struct LNode *next; //結點的指標域
}LNode, *LinkList; //LinkList為指向結構體LNode的指標型別
void create_List(LinkList &L, int n){ //法1:遞迴初始化建立n個節點
if (n == 0)return;//建立n個節點
else{ //此時傳進來的是第一個節點的指標
L = new LNode; //指標指向新生成的節點
cin >> L->data; //輸入資料,將其壓棧
L->next = NULL; //尾插法,先將下一個指標域賦為NULL
create_List(L->next, n - 1); //遞迴建立n個節點
}
}
Status Creat_LinkList(LinkList &L){ //法2:建立連結串列,當輸入數字為-1時,令當前指標為空
int num;
cout << "請每行輸入一個數據元素並按回車(直到-1退出):";
cin >> num;//輸入資料
if (num == -1){ L = NULL; return OK; } //結束
else{
L = new LNode; //申請新的節點,指標指向結構體
L->data = num; //先將資料放到資料域
return Creat_LinkList(L->next); //遞迴建立節點
}
}
double getAverage_List(LinkList L, double sum, int i){
if (L->next != NULL){
sum = sum + L->data;
return getAverage_List(L->next, sum, i+1);
}else{
double ave = (sum + L->data)/(i+1);
//cout << sum << i;
return ave;
}
}
int main(){
LinkList L;
if (Creat_LinkList(L))
cout << "成功建立單鏈表" << endl;
else
cout << "建立單鏈表失敗" << endl;
if (L->next == NULL)
cout << "當前連結串列為空" << endl << endl;
else{
//int n = count_LNode(L);
cout << "此時表中元素總和的平均值是";
cout << getAverage_List(L,0,0) << endl << endl;
}
}