测绘软件设计与实现.docx
《测绘软件设计与实现.docx》由会员分享,可在线阅读,更多相关《测绘软件设计与实现.docx(36页珍藏版)》请在冰豆网上搜索。
测绘软件设计与实现
实验一:
二叉树的基本操作实现及其应用
一、实验目的
1.熟悉二叉树结点的结构和对二叉树的基本操作。
2.掌握对二叉树每一种操作的具体实现。
3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
4.会用二叉树解决简单的实际问题。
二、实验内容
设计程序实现二叉树结点的类型定义和对二叉树的基本操作。
该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
1.初始化二叉树.
2.按先序序列建立二叉树.
3.判断二叉树是否为空.
4.先序、中序、后续序列遍历二叉树.
5.求二叉树的深度.
6.求二叉树节点的个数.
三、代码清单
#include
usingnamespacestd;
#include
typedefstructBitNode//用结构体定义二叉树节点
{
chardata;
structBitNode*lchild,*rchild;
}*BitTree;
classC_JDC_BinTree
{
public:
C_JDC_BinTree(){};//构造函数
~C_JDC_BinTree(){};//析构函数
voidBinTreeInit(BitTree&BT);//初始化二叉树,即把树根指针置空
intBinTreeCreat(BitTree&BT);//按先序次序建立一个二叉树
voidBinTreeEmpty(BitTree&BT);//检查二叉树是否为空
voidBinTraverse(BitTree&BT);//先序序列遍历二叉树
voidBinTraversezh(BitTree&BT);//先序序列遍历二叉树
voidBinTraverseho(BitTree&BT);//先序序列遍历二叉树
intBinTreeDepth(BitTreeBT);//求二叉树的深度
intBinTreeCount(BitTreeBT);//求二叉树中所有结点数
};
//···············公共函数实现部分····················
voidC_JDC_BinTree:
:
BinTreeInit(BitTree&BT)//初始化二叉树,即把树根指针置空
{
BT=(BitTree)malloc(sizeof(BitNode));
BT->data=NULL;
cout<<"二叉树初始化成功!
"<}
intC_JDC_BinTree:
:
BinTreeCreat(BitTree&BT)//按先序次序建立一个二叉树
{
charch;
cin>>ch;
if(ch=='#')BT=NULL;
else
{
if(!
(BT=(BitTree)malloc(sizeof(BitNode))))
exit(0);
BT->data=ch;
BinTreeCreat(BT->lchild);
BinTreeCreat(BT->rchild);
}
return0;
}
voidC_JDC_BinTree:
:
BinTreeEmpty(BitTree&BT)//检查二叉树是否为空
{
if(BT->data==NULL)
cout<<"是空二叉树!
"<else
cout<<"不是空二叉树!
"<}
voidC_JDC_BinTree:
:
BinTraverse(BitTree&BT)//先序序列遍历二叉树
{
if(BT!
=NULL)
{
cout<data;
BinTraverse(BT->lchild);
BinTraverse(BT->rchild);
}
}
voidC_JDC_BinTree:
:
BinTraversezh(BitTree&BT)//中序序列遍历二叉树
{
if(BT!
=NULL)
{
BinTraversezh(BT->lchild);
cout<data;
BinTraversezh(BT->rchild);
}
}
voidC_JDC_BinTree:
:
BinTraverseho(BitTree&BT)//后续序列遍历二叉树
{
if(BT!
=NULL)
{
BinTraverseho(BT->lchild);
BinTraverseho(BT->rchild);
cout<data;
}
}
intC_JDC_BinTree:
:
BinTreeDepth(BitTreeBT)//求二叉树的深度
{
intdepthval;
if(BT)
{
intdepthLeft=BinTreeDepth(BT->lchild);
intdepthRight=BinTreeDepth(BT->rchild);
depthval=1+
(depthLeft>depthRight?
depthLeft:
depthRight);
}
elsedepthval=0;
returndepthval;
}
intC_JDC_BinTree:
:
BinTreeCount(BitTreeBT)//求二叉树中所有结点数
{
intnode;
if(BT)
{
intlchild=BinTreeCount(BT->lchild);
intrchild=BinTreeCount(BT->rchild);
node=lchild+rchild+1;
}
else
node=0;
returnnode;
}
//·············主函数部分················
intmain()
{
C_JDC_BinTreea;
inti;
BitTreeBT;
cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<<"\t\t~-~二叉树的创建、遍历~-~"<
<<"\t\t1.初始化二叉树.2.按先序序列建立二叉树."<<<"\t\t3.判断二叉树是否为空.4.先序、中序、后续序列遍历二叉树."<<<"\t\t5.求二叉树的深度.6.求二叉树节点的个数."<<<"\t\t7.退出"<<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<while
(1)
{
cout<<"输出你所需的操作:
";
cin>>i;
if(i==1)
a.BinTreeInit(BT);
elseif(i==2)
{
cout<<"输入你要建立的二叉树:
"<a.BinTreeCreat(BT);
}
elseif(i==3)
a.BinTreeEmpty(BT);
elseif(i==4)
{
cout<<"先序序列遍历二叉树"<a.BinTraverse(BT);cout<cout<<"中序序列遍历二叉树"<a.BinTraversezh(BT);cout<cout<<"后续序列遍历二叉树"<a.BinTraverseho(BT);cout<}
elseif(i==5)
cout<<"二叉树的深度:
"<elseif(i==6)
cout<<"二叉树的节点数"<else
break;
}
return0;
}
四、测试截图
五、总结
二叉树是数据结构中最重要的结构之一,编程实现二叉树的构建及遍历是我们的重点内容。
在编程过程中,如何建立二叉树困扰了好长时间,最终通过翻阅《C++数据结构与实现》,借助按先序建立二叉树的思想解决了这个问题,之后通过不断调试,完成二叉树的构建、遍历等。
实验二:
图的创建与遍历
班级:
测绘工程10-2班姓名:
姜德才学号:
07103077指导老师:
王永波
一、实验目的:
1.掌握图的存储结构及其构造方法
2.掌握图的两种遍历算法及其执行过程
二、实验内容:
以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。
三、代码清单
//Test02_JDC.cpp:
Definestheentrypointfortheconsoleapplication.
#include"stdafx.h"
#include
usingnamespacestd;
#include
#defineMAX_VEX_NUM20//最大顶点数
queueq;
structMGraph
{
charvexs[MAX_VEX_NUM];//顶点向量//AdjMatrix
intarcs[MAX_VEX_NUM][MAX_VEX_NUM];//邻接矩阵
intvexnum,arcnum;
};
MGraphG;//申明一个无向图的邻接矩阵类型
intvisited[MAX_VEX_NUM];//设置标志数组
classC_JDC_Graph
{
public:
C_JDC_Graph(){};//构造函数
~C_JDC_Graph(){};//析构函数
intLocatevex(MGraphG,charv);//图的基本操作,寻找V的位置
intCreateUDG(MGraph&G);//数组邻接矩阵表示法构造无向图
intFirstadj(MGraphG,inti);//顶点下标为i的顶点的第一个邻接顶点
intNext_adj(MGraphG,inti,intk);//顶点下标为i的顶点相对于k的下一个顶点,k为i的当前邻接顶点,二者都是顶点下标
voiddfs_graph(MGraphG,intv);//无向图的深度优先遍历,从第v个顶点出发,v为顶点下标
voiddfstraverse(MGraphG,intvex);//从vex开始深度遍历图//
intbfstraverse(MGraphG);//无向图的广度遍历,从第v个顶点出发,v为顶点下标
};
intC_JDC_Graph:
:
Locatevex(MGraphG,charv)//图的基本操作,寻找V的位置
{
inti=0;
while(i=G.vexs[i])
i++;
if(ireturni;//查找成功则返回顶点的下标
else
return-1;
}
intC_JDC_Graph:
:
CreateUDG(MGraph&G)//数组邻接矩阵表示法构造无向图
{
charv1,v2;
cout<<"请输入图的顶点数和弧数"<cin>>G.vexnum>>G.arcnum;
cout<<"请输入顶点值"<for(inti=0;icin>>G.vexs[i];
for(intq=0;qfor(intp=0;pG.arcs[q][p]=0;
for(intk=0;k{
cout<<"输入该弧依附的顶点"<cin>>v1>>v2;
inta=Locatevex(G,v1);
intb=Locatevex(G,v2);
G.arcs[a][b]=1;
G.arcs[b][a]=G.arcs[a][b];
}
for(intn=0;ncout<cout<cout<cout<<"该图的邻接矩阵表示为:
\n";
for(intx=0;x{
for(inty=0;ycout<cout<}
return1;
}//CreateUDG
intC_JDC_Graph:
:
Firstadj(MGraphG,inti)//顶点下标为i的顶点的第一个邻接顶点
{
intj=0;
while(j=1)
j=j+1;
if(jreturnj;
else
return-1;
}
intC_JDC_Graph:
:
Next_adj(MGraphG,inti,intk)//顶点下标为i的顶点相对于k的下一个顶点,k为i的当前邻接顶点,二者都是顶点下标
{
intj=k+1;
while(j=1)
j=j+1;
if(jreturnj;
else
return-1;
}
voidC_JDC_Graph:
:
dfs_graph(MGraphG,intv)//无向图的深度优先遍历,从第v个顶点出发,v为顶点下标
{
visited[v]=1;
cout<intw;
for(w=Firstadj(G,v);w>=0;w=Next_adj(G,v,w))
{
if(!
visited[w])
dfs_graph(G,w);//递归遍历
}
}
voidC_JDC_Graph:
:
dfstraverse(MGraphG,intvex)//从vex开始深度遍历图//
{
for(inti=0;ivisited[i]=0;
dfs_graph(G,vex);//先对图从指定定点访问
for(intv=0;vif(!
visited[v])
dfs_graph(G,v);
}
intC_JDC_Graph:
:
bfstraverse(MGraphG)//无向图的广度遍历,从第v个顶点出发,v为顶点下标
{
q.empty();
intv;
intu;
intw;
for(v=0;vif(!
visited[v])
{
visited[v]=1;
cout<q.push(v);
while(!
q.empty())
{
u=q.front();
q.pop();
for(w=Firstadj(G,u);w>=0;w=Next_adj(G,u,w))
if(!
visited[w])
{
visited[w]=1;
cout<q.push(w);
}
}
}
return1;
}
//············主函数部分··············
intmain()
{
cout<<"\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<<"\t\t~-~图的创建、遍历~-~"<<<"\t\t1.先序遍历建立一个图.2.深度优先遍历该图."<<<"\t\t3.广度优先遍历该图.4.退出"<C_JDC_Graphg;
inta;
for(;1;)
{
cout<<"输出你所需的操作:
";
inti;
//cin>>i;
cin>>i;
if(i==1)
{
inta;
C_JDC_Graphg;
g.CreateUDG(G);
}
elseif(i==2)
{
cout<<"请输入您要深度优先遍历图的起点--您输入的顶点的坐标!
"<inta;
cin>>a;
cout<<"深度优先遍历"<g.dfstraverse(G,a-1);//因为下标从0开始
cout<}
elseif(i==3)
{
cout<<"请输入您要广度优先遍历图的起点--您输入的顶点的坐标!
"<inta;
cin>>a;
cout<<"广度优先遍历"<for(intv=0;vvisited[v]=0;
g.bfstraverse(G);
cout<}
elsebreak;
}
return0;
}
四、测试截图
五、总结
在图的编写过程中,用什么数据结构存储图,及如何编写程序,是需要选择的问题。
我选择的是矩阵,在编写过程中不断地与老师、同学交流,终于将图的建立、遍历实现了。
在后来的最小生成树的实现中,Prim和Kruscal算法比较复杂,没能实现。
希望老师在课上能详细讲解这两种算法的程序实现。
实验三:
矩阵类的设计与实现
班级:
测绘工程10-2班姓名:
姜德才学号:
07103077指导老师:
王永波
一、实验目的
通过上机实践,实现矩阵的生成、加减乘除运算,以及求矩阵的转置和行列式。
同时加深对矩阵的理论的理解,并用计算机程序算法来描述矩阵生成及运算。
二、实验内容
通过构造矩阵类,实现矩阵的定义,包括:
矩阵的加减乘除,求矩阵的转置,求矩阵的行列式。
尝试设计友好的人际界面。
1.建立一个矩阵。
2.再建立一个矩阵。
3.求矩阵的最大元素。
4.求矩阵的最小元素。
5.求两个矩阵的和。
6.求两矩阵的差。
7.求两矩阵的乘积。
8.求两矩阵的阶。
9.求两矩阵的转置。
三、实验代码(摘录)
#include
usingnamespacestd;
classCJDC_Matrix
{
public:
intn;
int*num;
CJDC_Matrix();//默认构造函数
CJDC_Matrix(intn,int*a);//构造函数
voidSetCJDC_Matrix(intn);//手动输入矩阵
~CJDC_Matrix();//析构函数
CJDC_Matrixoperator+(constCJDC_Matrix&a);//重载加法运算符+,实现两个矩阵的和
CJDC_Matrixoperator-(constCJDC_Matrix&a);//重载加法运算符-,实现两个矩阵的差
CJDC_Matrixoperator*(constCJDC_Matrix&a);//重载加法运算符-,实现两个矩阵的差
CJDC_Matrix&operator=(constCJDC_Matrix&a);//重载加法运算符*,实现两个矩阵的积
voidTranspose();//实现矩阵的转置
intMax();//求矩阵中的最大值
intMin();//求矩阵中的最小值
doubleDet();//求行列式
CJDC_Matrixoperator<<(constCJDC_Matrix&a);//重载加法运算符<<,实现矩阵按照行列的格式输出
private:
doubleMyDet(int*array,intJie);//我的求行列式函数
};
CJDC_Matrix:
:
CJDC_Matrix()//默认构造函数
{
n=1;
num=newint
(1);
*num=0;
}
CJDC_Matrix:
:
CJDC_Matrix(intn,int*a)//构造函数
{
this->n=n;
num=newint[n*n];
for(inti=0;i*(num+i)=*(a+i);
}
voidCJDC_Matrix:
:
SetCJDC_Matrix(intn)//手动输入矩阵
{
if(this->n=1)
deletenum;
else
delete[]num;
this->n=n;
num=newint[n*n];
for(inti=0;ifor(intj=0;j{cout<<"请输入第"<
cin>>*(num+i*n+j);
}
}
CJDC_Matrix:
:
~CJDC_Matrix()//析构函数
{
if(n=1)
deletenum;
else
delete[]num;
}
doubleCJDC_Matrix:
:
MyDet(int*array,intJie)//我的求行列式函数
{
if(Jie<=0)
{
cerr<<"阶小于0或等于0!
"<return0;
}
elseif(Jie==1)
returnarray[0];
else
{
inti,j,k,tag;
int*subArray[500];
for(i=0;isubArray[i]=new