您的位置:首页 > 编程语言 > C语言/C++

C++经典面试题(十一)

2015-06-28 16:46 381 查看
94.已知A
为整数数组,试写出实现下列运算的递归算法:
(1) 求数组A中的最大整数。
(2) 求n个整数的和。
(3) 求n个整数的平均值。

【参考答案】
#include <iostream.h>
class RecurveArray
{
//数组类声明
private:
int *Elements;		//数组指针
int ArraySize;		//数组尺寸
int CurrentSize;		//当前已有数组元素个数 public :
RecurveArray ( int MaxSize =10 ) :
ArraySize ( MaxSize ), Elements ( new int[MaxSize] ) { }
~RecurveArray ( )
{
delete [ ] Elements;
}
void InputArray();		//输入数组的内容
int MaxKey ( int n );		//求最大值
int Sum ( int n );		//求数组元素之和
float Average ( int n );	//求数组元素的平均值
};

void RecurveArray :: InputArray ( )
{
//输入数组的内容
cout << "Input the number of Array: \n";
for ( int i = 0; i < ArraySize; i++ )
cin >> Elements[i];
}

int RecurveArray :: MaxKey ( int n )
{
//递归求最大值
if ( n == 1 )
return Elements[0];
int temp = MaxKey ( n - 1 );
if ( Elements[n-1] > temp )
return Elements[n-1];
else
return temp;
}
int RecurveArray :: Sum ( int n )  			//递归求数组之和
{
if ( n == 1)
return Elements[0];
else
return Elements[n-1] + Sum (n-1);
}
float RecurveArray :: Average ( int n )  			//递归求数组的平均值
{
if ( n == 1)
return (float) Elements[0];
else
return ( (float) Elements[n-1] + ( n - 1) * Average ( n - 1 ) ) / n;
}
int main ( int argc,  char* argv [ ] )
{
int size = -1;
cout << "No. of the Elements : ";
while ( size < 1 )
cin >> size;
RecurveArray ra ( size );
ra.InputArray();
cout<< "\nThe max is:  " << ra.MaxKey ( ra.MaxSize ) << endl;
cout<< "\nThe sum is:  " << ra.Sum ( ra.MaxSize ) << endl;
cout<< "\nthe avr is:  " << ra.Average ( ra.MaxSize ) << endl;
return 0;
}


95.已知f为单链表的表头指针, 链表中存储的都是整型数据,试写出实现下列运算的递归算法:

(1) 求链表中的最大整数。

(2) 求链表的结点个数。

(3) 求所有整数的平均值。

【标准答案】

#include <iostream.h>		//定义在头文件"RecurveList.h"中
class List;
class ListNode  					//链表结点类
{
friend class List;
private:
int data;			//结点数据
ListNode *link;		//结点指针
//构造函数
ListNode ( const int item ) : data(item), link(NULL)
{

}
};
class List  			//链表类
{
private:
ListNode *first, current;
int Max ( ListNode *f );
int Num ( ListNode *f );
float Avg ( ListNode *f,  int& n );
public:
List ( ) : first(NULL), current (NULL) 		//构造函数
{

}
~List ( ) 					//析构函数
{

}
ListNode* NewNode ( const int item );	//创建链表结点, 其值为item
void NewList ( const int retvalue );	//建立链表, 以输入retvalue结束
void PrintList ( );			//输出链表所有结点数据
int GetMax ( )
{
return Max ( first );  //求链表所有数据的最大值
}
int GetNum ( )
{
return Num ( first );  //求链表中数据个数
}
float GetAvg ( )
{
return Avg ( first );  //求链表所有数据的平均值
}
};

ListNode* List :: NewNode ( const int item )  			//创建新链表结点
{
ListNode *newnode = new ListNode (item);
return newnode;
}
void List :: NewList ( const int retvalue )  		//建立链表, 以输入retvalue结束
{
first = NULL;
int value;
ListNode *q;
cout << "Input your data:\n";		//提示
cin >> value;			//输入
while ( value != retvalue )
{
//输入有效
q = NewNode ( value );	//建立包含value的新结点
if ( first == NULL )
first = current = q;//空表时, 新结点成为链表第一个结点
else
{
current->link = q;   //非空表时, 新结点链入链尾
current = q;
}
cin >> value;			//再输入
}
current->link = NULL;			//链尾封闭
}
void List :: PrintList ( )
{
//输出链表
cout << "\nThe List is : \n";
ListNode *p = first;
while ( p != NULL )
{
cout << p->data << '  ';
p = p->link;
}
cout << ‘\n’;
}

int List :: Max ( ListNode *f )
{
//递归算法 : 求链表中的最大值
if ( f ->link == NULL )
return f ->data;	//递归结束条件
int temp = Max ( f ->link );		//在当前结点的后继链表中求最大值
if ( f ->data > temp )
return f ->data;	//如果当前结点的值还要大, 返回当前检点值
else
return temp;		//否则返回后继链表中的最大值
}
int List :: Num ( ListNode *f )
{
//递归算法 : 求链表中结点个数
if ( f == NULL )
return 0;	//空表, 返回0
return 1+ Num ( f ->link );		//否则, 返回后继链表结点个数加1
}
float List :: Avg ( ListNode *f , int& n )
{
//递归算法 : 求链表中所有元素的平均值
if ( f ->link == NULL ) 		//链表中只有一个结点, 递归结束条件
{
n = 1;
return ( float ) (f ->data );
}
else
{
float Sum = Avg ( f ->link, n ) * n;
n++;
return ( f ->data + Sum ) / n;
}
}

#include "RecurveList.h"			//定义在主文件中
int main ( int argc, char* argv[ ] )
{
List test;
int finished;
cout << “输入建表结束标志数据 :”;
cin >> finished;			//输入建表结束标志数据
test.NewList ( finished );		//建立链表
test.PrintList ( );			//打印链表
cout << "\nThe Max is : " << test.GetMax ( );
cout << "\nThe Num is : " << test.GetNum ( );
cout << "\nThe Ave is : " << test.GetAve () << '\n';
printf ( "Hello World!\n" );
return 0;
}


未完。。。待续(*^_v_^*)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c c++ 面试题