// 第九章练习题.cpp: 主项目文件。
//第一题:
//1 没有定义析构函数,没有销毁p指针
//2 默认构造函数没有初始化p指针
//看到答案以后,自己还是想得太少了
/*#include <iostream>
using namespace System;
using namespace std;
class CBadClass
{
private:
int len;
char* p;
public:
CBadClass(const char* str = 0):len(0)
{
if(p) //判断是否存在p指针
{
len = strlen(str); //开度
p = new char[len+1]; //创建指针
strcpy_s(p, len+1, str); //复制内容到新的指针上
}
}
};
int main(array<System::String ^> ^args)
{
CBadClass pClass("Xlc");
system("pause");
return 0;
}
*/
//第二题:
//这是一个可以合理的CHawk类可以从CBird继承,但是COStrich不行,因为鸵鸟不能飞
//一个更好的类层次结构为代表鸟,让让鸵鸟,企鹅不会飞的鸟
//一个单独的类来表示,下面的层次结构允许
/*class CBird
{
protected:
int wingSpan; //翼展的类型
int eggSize; //蛋的大小
};
//不会飞类型的飞的类
class CFilightlessBird : public CBird
{
};
//代表可以飞的鸟类基类也是从CBird继承的
class CFlyingBird : public CBird
{
protected:
int airSpeed;
int altitued;
public:
virtual void fly(){
altitued = 100;
}
};*/
//第三题
//抽像类,因为virtual void Print() const =0,为一个纯虚函数
/*#include <iostream>
using namespace System;
using namespace std;
class CBase
{
protected:
int m_anInt;
public:
CBase(int n):m_anInt(n){ cout<<"Base constructor"<<endl; }
virtual void Print() const = 0;
virtual ~CBase(){
cout<<"CBase 析构函数"<<endl;
}
};
class MCBase : public CBase
{
private:
char* p;
int len;
public:
MCBase(char* str, int n):CBase(n), len(0)
{
if(p){
len = strlen(str);
p = new char[len+1];
strcpy_s(p, len+1, str);
}
}
virtual void Print() const
{
cout<<"m_anInt:"<<m_anInt<<endl;
cout<<"p:"<<*p<<endl;
}
~MCBase(){
cout<<"MCBase 析构函数"<<endl;
delete p;
}
};
int main(array<System::String ^> ^args)
{
//MCBase mcbase = new MCBase("xlc", 55);
MCBase* pbase;
MCBase mcbase("Xlc", 55);
mcbase.Print();
pbase = &mcbase;
pbase->Print();
system("pause");
return 0;
}*/
//第四题
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib> //For rand_s function
using namespace System;
using namespace std;
class CBinaryTree
{
private:
//定义一个嵌套类
class CNode
{
public:
//构造函数
CNode(int n):value(0),m_pLeft(0), m_pRight(0){}
//指出节点的值
void listNode()
{
//如果左边的指针不为空值
if(m_pLeft != 0){
m_pLeft->listNode(); //传到的值中去
}
cout<<setw(12)<<endl; //显示12空格
if(++listCount % 5 == 0){
cout<<endl; //显示一换行
}
if(m_pRight != 0){ //右边指针
m_pRight->listNode();
}
}
int value; //值
CNode* m_pLeft;//左边的指针
CNode* m_pRight;//右边的指针
static int listCount; //一个静态函数
};
CNode* m_pRoot; //定义一个首指针CNode
public:
//构造函数
CBinaryTree() : m_pRoot(0){}
//声明添加函数
void add(int n);
//两个参数的添加函数
//相对于一个给定的节点添加一个值
void add(int n, CNode* pNode);
//列出所有列表
void listNodes()
{
CNode::listCount = 0;
if(m_pRoot == 0)
cout<<"Binary tree is empty"<<endl;
else
m_pRoot->listNode();
}
};
//定义静态变量的值
int CBinaryTree::CNode::listCount = 0;
void CBinaryTree::add(int n)
{
if(m_pRoot == 0){
m_pRoot = new CNode(n);
}else{
add(n, m_pRoot);
}
};
//相对于一个给定的节点添加一个值
void CBinaryTree::add(int n, CNode* pNode)
{
//如果值相等
if(n == pNode->value){ //那么将值放到当前pNode的左边
//定义一个新的CNode指针
CNode* pNewNode = new CNode(n);
CNode* pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNewNode;
pNewNode->m_pLeft = pTemp;
//如果n大于当前指针的值
}else if(n > pNode->value)
{
//先判断当前指针的右值是否为0
//那么值接为当前指针的左值创建一个指针
//否则就是在前m_pRight上面添加值
if(pNode->m_pRight == 0){
pNode->m_pRight = new CNode(n);
}else{
add(n, pNode->m_pRight); //这里直到找到等于或者他的值或者右边值为空的性情况才会被插入
}
}else{
//应该只有一种情况了,那就是n < pNode->value
//跟在插入右边值的一样
if(pNode->m_pLeft ==0){
pNode->m_pLeft = new CNode(n);
}else{
add(n, pNode->m_pLeft);
}
}
}
int main(array<System::String ^> ^args)
{
CBinaryTree tree;
unsigned int number = 0; //无符号的整型
double max = 1000000.0;
for(int i=0; i<100; i++){
//取一个随机数放入number中
if(rand_s(&number) != 0) //成功是返回0???
cout<<"随机数生成器失败!"<<endl;
number = static_cast<unsigned int>(static_cast<double>(number)/UINT_AMX*max)+1;
tree.add(number); //插入tree
cout<<setw(12)<<endl;
//换行
if((i+1) % 5 ==0){
cout<<endl;
}
cout<<"树的输出:"<<endl;
tree.listNodes();
}
system("pause");
return 0;
}*/
//第五题
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib> //For rand_s function
using namespace System;
using namespace std;
ref class CBinaryTree
{
private:
//定义一个嵌套类
ref class CNode
{
public:
//构造函数
CNode(int n):value(n),m_pLeft(nullptr), m_pRight(nullptr){}
//指出节点的值
void listNode()
{
//如果左边的指针不为空值
if(m_pLeft != nullptr){
m_pLeft->listNode(); //传到的值中去
}
//cout<<setw(12)<<value; //显示12空格
Console::Write(L"{0, 12}", value);
if(++listCount % 5 == 0){
cout<<endl; //显示一换行
}
if(m_pRight != nullptr){ //右边指针
m_pRight->listNode();
}
}
int value; //值
CNode^ m_pLeft;//左边的指针
CNode^ m_pRight;//右边的指针
static int listCount; //一个静态函数
};
CNode^ m_pRoot; //定义一个首指针CNode
public:
//构造函数
CBinaryTree() : m_pRoot(nullptr){}
//声明添加函数
void add(int n);
//两个参数的添加函数
//相对于一个给定的节点添加一个值
void add(int n, CNode^ pNode);
//列出所有列表
void listNodes()
{
CNode::listCount = 0;
if(m_pRoot == nullptr)
cout<<"Binary tree is empty"<<endl;
else
m_pRoot->listNode();
}
};
//定义静态变量的值
//int CBinaryTree::CNode::listCount = 0;
void CBinaryTree::add(int n)
{
if(m_pRoot == nullptr){
m_pRoot = gcnew CNode(n);
}else{
add(n, m_pRoot);
}
};
//相对于一个给定的节点添加一个值
void CBinaryTree::add(int n, CNode^ pNode)
{
//如果值相等
if(n == pNode->value){ //那么将值放到当前pNode的左边
//定义一个新的CNode指针
CNode^ pNewNode = gcnew CNode(n);
CNode^ pTemp = pNode->m_pLeft;
pNode->m_pLeft = pNewNode;
pNewNode->m_pLeft = pTemp;
//如果n大于当前指针的值
}else if(n > pNode->value)
{
//先判断当前指针的右值是否为0
//那么值接为当前指针的左值创建一个指针
//否则就是在前m_pRight上面添加值
if(pNode->m_pRight == nullptr){
pNode->m_pRight = gcnew CNode(n);
}else{
add(n, pNode->m_pRight); //这里直到找到等于或者他的值或者右边值为空的性情况才会被插入
}
}else{
//应该只有一种情况了,那就是n < pNode->value
//跟在插入右边值的一样
if(pNode->m_pLeft ==nullptr){
pNode->m_pLeft = gcnew CNode(n);
}else{
add(n, pNode->m_pLeft);
}
}
}
int main(array<System::String ^> ^args)
{
CBinaryTree^ tree = gcnew CBinaryTree;
unsigned int number = 0; //无符号的整型
Random^ generator = gcnew Random;
for(int i=0; i<20; i++)
{
number = generator->Next(1, 1000000);
tree->add(number);
Console::Write(L"{0,12}", number);
if((i+1) % 5 == 0){
Console::WriteLine();
}
cout<<"现在开始循环树:"<<endl;
tree->listNodes();
}
system("pause");
return 0;
}*/
//第六题
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib> //For rand_s function
using namespace System;
using namespace std;
//定义一个通用类,前面说的已经记不起了where T:IComparable???
generic<typename T> where T:IComparable ref class BinaryTree
{
private:
ref class Node
{
public:
Node(T n):value(n), left(nullptr), right(nullptr){}
void listNode()
{
if(left != nullptr){
left->listNode();
}
Console::WriteLine(format, value);
if(++listCount % 5 ==0){
Console::WriteLine();
}
if(right != nullptr){
right->listNode();
}
}
T value;
Node^ left;
Node^ right;
static int listCount;
static String^ format;
};
Node^ root;
static int width;
public:
BinaryTree() : root(nullptr){}
void add(T o);
void add(T o, Node^ node);
void listNodes()
{
Node::format = L"{0, "+(width+2)+L"}"; //定义显示的空格数
Node::listCount = 0;
if(root ==nullptr){
Console::WriteLine(L"列表显示为空!");
}else{
root->listNode();
}
}
};
//定义添加方法
generic<typename T>
void BinaryTree<T>::add(T o)
{
if(root == nullptr){
root = gcnew Node(o);
}else{
add(o, root);
}
width = System::Math::Max(width, o->ToString()->Length);
};
generic<typename T>
void BinaryTree<T>::add(T o, Node^ node)
{
if(o == node->value){
Node^ newNode = gcnew Node(o);
Node^ temp = node->left;
node->left = newNode;
newNode->left = temp;
}else if(o->CompareTo(node->value) > 0){
if(node->right == nullptr){
node->right = gcnew Node(o);
}else{
add(o, node->right);
}
}else{
if(node->left == nullptr){
node->left = gcnew Node(o);
}else{
add(o, node->left);
}
}
};
int main(array<System::String ^> ^args)
{
BinaryTree<int>^ tree = gcnew BinaryTree<int>;
unsigned int number = 0;
Random^ generator = gcnew Random;
for(int i=0; i<100; i++){
number = generator->Next(1, 1000000);
tree->add(number);
Console::Write(L"{0,12}", number);
if((i+1) % 5 == 0){
Console::WriteLine();
}
}
Console::WriteLine(L"Output from the tree is:");
tree->listNodes();
array<String^>^ words = {L"Success", L"is", L"the", L"ability", L"to",
L"go", L"from", L"one", L"failure", L"to",
L"another", L"with", L"no", L"loss", L"of",
L"enthusiasm"};
BinaryTree<String^>^ strTree = gcnew BinaryTree<String^>;
int lineCount = 0;
for each(String^ str in words){
strTree->add(str);
Console::Write(L"{0,12}", str);
if(++lineCount % 5 == 0){
Console::WriteLine();
}
}
Console::WriteLine(L"\n\nOutput from the tree is:");
strTree->listNodes();
Console::WriteLine();
system("pause");
return 0;
}
/*#include <iostream>
using namespace System;
using namespace std;
int main(array<System::String ^> ^args)
{
system("pause");
return 0;
}*/