计算机软件基础HDU报告Word文档格式.docx
《计算机软件基础HDU报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《计算机软件基础HDU报告Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
intdata;
structbitree*lchild;
structbitree*rchild;
};
bitree*create()//二叉树的建立
inta;
cin>
>
a;
if(a!
=0)
{
bitree*q=newbitree;
q->
data=a;
lchild=create();
rchild=create();
returnq;
}
else
returnNULL;
}
voidpreorde(bitree*root)//先序遍历
if(root!
=NULL)
cout<
<
root->
data<
"
"
;
preorde(root->
lchild);
rchild);
voidinorde(bitree*root)//中序遍历
inorde(root->
voidpostorde(bitree*root)//后序遍历
postorde(root->
voidmain()//主程序
bitree*head=NULL;
head=create();
preorde(head);
cout<
\n"
postorde(head);
四、实验结果:
实验二图的遍历
一、实验目的:
1.掌握图的存储结构及其构造方法。
2.掌握图的两种遍历算法及其执行过程。
二、实验内容:
以邻接矩阵或邻接表为存储结构,以用户指定的顶点为起始点,实现无向连通图的深度优先及广度优先搜索遍历,并输出遍历的结点序列。
提示:
首先,根据用户输入的顶点总数和边数,构造无向图,然后以用户输入的顶点为起始点,进行深度优先和广度优先遍历,并输出遍历的结果。
三、程序源代码:
#include<
#defineMaxVerNum50
structedgenode
intendver;
intinform;
structedgenode*edgenext;
structvexnode
charvertex;
structedgenode*edgelink;
structGraph
structvexnodeadjlists[MaxVerNum];
intvexnum;
intarcnum;
//队列的定义及相关函数的实现
structQueueNode
intnData;
structQueueNode*next;
structQueueList
structQueueNode*front;
structQueueNode*rear;
voidEnQueue(structQueueList*Q,inte)
structQueueNode*q=newstructQueueNode;
q->
nData=e;
next=NULL;
if(Q==NULL)
return;
if(Q->
rear==NULL)
Q->
front=Q->
rear=q;
else
rear->
next=q;
rear=Q->
next;
voidDeQueue(QueueList*Q,int*e)
if(Q==NULL)
if(Q->
front==Q->
rear)
*e=Q->
front->
nData;
rear=NULL;
voidCreatAdjList(Graph*G)//创建图
inti,j,k;
edgenode*p1;
edgenode*p2;
请输入顶点数和边数:
endl;
G->
vexnum>
arcnum;
开始输入顶点表:
for(i=0;
i<
vexnum;
i++)
cin>
adjlists[i].vertex;
G->
adjlists[i].edgelink=NULL;
开始输入边表信息:
for(k=0;
k<
k++)
请输入边<
Vi,Vj>
对应的顶点:
i>
j;
p1=newedgenode;
p1->
endver=j;
edgenext=G->
adjlists[i].edgelink;
adjlists[i].edgelink=p1;
p2=newedgenode;
p2->
endver=i;
adjlists[j].edgelink;
adjlists[j].edgelink=p2;
//因为是无向图,所以有两次建立边表的过程
voidDFS(Graph*G,inti,intvisit[])
adjlists[i].vertex<
visit[i]=1;
edgenode*p=newedgenode;
p=G->
if(G->
adjlists[i].edgelink&
&
!
visit[p->
endver])
{
DFS(G,p->
endver,visit);
voidDFStraversal(Graph*G,charc)//深度优先遍历
该图的深度优先遍历结果为:
intvisit[MaxVerNum];
for(inti=0;
visit[i]=0;
//全部初始化为0,即未访问状态
intm;
if(G->
adjlists[i].vertex==c)//根据字符查找序号
{
m=i;
DFS(G,i,visit);
break;
}
//继续访问未被访问的结点
for(i=0;
if(visit[i]==0)
voidBFS(Graph*G,intv,intvisit[])
QueueList*Q=newQueueList;
Q->
EnQueue(Q,v);
while(Q->
rear!
=NULL)
inte=0;
DeQueue(Q,&
e);
adjlists[e].vertex<
visit[e]=1;
edgenode*p=newedgenode;
p=G->
adjlists[e].edgelink;
if(p)
intm=p->
endver;
if(m==0)
{
EnQueue(Q,m);
while(visit[m]==0)
{
p=p->
edgenext;
if(p==NULL)
break;
m=p->
EnQueue(Q,m);
}
}
voidBFStraversal(Graph*G,charc)
该图的广度优先遍历结果为:
intvisited[MaxVerNum];
for(inti=0;
visited[i]=0;
adjlists[i].vertex==c)
BFS(G,i,visited);
if(visited[i]==0)
voidmain()//主函数
Graph*G=newGraph;
CreatAdjList(G);
charch;
请输入开始遍历的顶点:
ch;
DFStraversal(G,ch);
BFStraversal(G,ch);
实验心得
首先关于二叉树的建立、遍历,本次实验最大的收获就是对先序、中序、后序三种遍历方式有了更深的理解,由于之前学过相关数据结构的教材,所以感觉相对还是比较简单的。
主要的知识点还是在其递归的部分,这点认识透彻后问题就不大了。
而对于图的认识,遍历规则是较容易理解的,但是转换成语言编程的过程中出现了不少问题,尤其是在其节点通过队列形式实现的过程中,存在一些技巧性。
综合而言,这次试验让我有了一些自己的想法,即存在更优的算法,让其综合性能再度提高。
或许针对不同的数据结构类型采用不同的遍历方法,这才是最好的策略。