1. 程式人生 > >經典C++筆試題目--100(程式設計練習(比C要難)(91-100))

經典C++筆試題目--100(程式設計練習(比C要難)(91-100))


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


98、字串的替換操作replace (String &s, String &t, String &v)是指:

若t是s的子串,則用串v替換串t在串s中的所有出現;若t不是s的子串,則串s不變。例如,若串s為“aabbabcbaabaaacbab”,串t為“bab”,串v為“abdc”,則執行replace操作後,串s中的結果為“aababdccbaabaaacabdc”。試利用字串的基本運算實現這個替換操作。