1. 程式人生 > >單鏈表遞迴求平均值

單鏈表遞迴求平均值

兩種解法:
第一:

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; } }