数据结构课程设计报告模板图的遍历文档格式.docx
《数据结构课程设计报告模板图的遍历文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模板图的遍历文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
typedefstructEBox
{
intmark;
//访问标记,1代表已访问,0代表未访问
intivex,jvex;
//该边依附的两个顶点的位置
structEBox*ilink,*jlink;
//分别指向依附这两个顶点的下一条边
//InfoType*info;
//该边信息指针
}EBox;
typedefstructVexBox
VertexTypedata;
EBox*firstedge;
//指向第一条依附该顶点的边
}VexBox;
typedefstruct
VexBoxadjmulist[NUM];
intvexnum,edgenum;
//无向图的当前顶点数和边数
}AMLGraph;
//---------------------------------------------------队列的定义
typedefintQElemType;
typedefstructQNode
QElemTypedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct
QueuePtrfront,rear;
}LinkQueue;
(二)函数原形清单
intLocateVex(AMLGraphG,VertexTypeu)
//寻找输入的数据在图中的位置,若不存在则返回-1
intCreateGraph(AMLGraph&
G)
//采用邻接多重表存储表示,构造无向图G
VertexType*GetVex(AMLGraphG,intv)//返回V的值
intFirstAdjVex(AMLGraphG,VertexTypev)//返回V的第一个邻接点的序号,若没有则返回-1
intNextAdjVex(AMLGraphG,VertexTypev,VertexTypew)//返回V的(相对于W)的下一个邻接结点的序号,若W是V的最后一个邻接结点,则返回-1
voidDFS(AMLGraphG,intv)//深度优先搜索//深度优先遍历图
voidDFSTraverse(AMLGraphG,int(*Visit)(VertexType))
intInitQueue(LinkQueue*Q)//队列的初始化
intQueueEmpty(LinkQueueQ)//判断队列是否为空,为空则返回1,否则返回0
intEnQueue(LinkQueue*Q,QElemTypee)//向队列中插入元素
intDeQueue(LinkQueue*Q,QElemType*e)//若队列不为空,则删除对头元素,并返回1;
否则返回0
voidBFSTraverse(AMLGraphG,int(*Visit)(VertexType))//广度优先非递归遍历图G
voidMarkUnVisited(AMLGraphG)//把边的访问标记设置为0,即未被访问
voidDisplay(AMLGraphG)//显示构造的无向图(包括定点数、顶点、边数、边)
(三)程序总体框架
(四)详细代码
#include<
iostream>
usingnamespacestd;
//--------------------------------------------------------无向图的邻接多重表存储结构的定义
constintNUM=20;
constintData_Num=2;
//每个顶点所表示的数据
typedefcharVertexType[Data_Num];
//寻找输入的数据在图中的位置,若不存在则返回-1
intLocateVex(AMLGraphG,VertexTypeu)
inti;
for(i=0;
i<
G.vexnum;
i++)
if(strcmp(u,G.adjmulist[i].data)==0)
returni;
return-1;
}
//采用邻接多重表存储表示,构造无向图G
intCreateGraph(AMLGraph&
cout<
<
"
请输入图的顶点数、边数:
;
cin>
>
//输入图当前的顶点数
G.edgenum;
//输入图当前的边数
请输入每个顶点所对应的值:
endl;
for(inti=0;
{
cin>
G.adjmulist[i].data;
//输入顶点值
G.adjmulist[i].firstedge=NULL;
//初始化指针
}
VertexTypev1,v2;
EBox*p;
intj;
//每条弧所关联的两个结点
for(intk=0;
k<
k++)
cout<
请输入第"
边的始点和终点:
v1;
cin>
v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
//确定v1和v2在图G中的位置
p=(EBox*)malloc(sizeof(EBox));
//对弧结点进行赋值
(*p).mark=0;
(*p).ivex=i;
(*p).jvex=j;
(*p).ilink=G.adjmulist[i].firstedge;
(*p).jlink=G.adjmulist[j].firstedge;
G.adjmulist[i].firstedge=G.adjmulist[j].firstedge=p;
return1;
//返回V的值
VertexType*GetVex(AMLGraphG,intv)
if(v>
G.vexnum||v<
0)
exit(0);
return&
G.adjmulist[v].data;
//返回V的第一个邻接点的序号,若没有则返回-1
intFirstAdjVex(AMLGraphG,VertexTypev)
i=LocateVex(G,v);
if(i<
return-1;
if(G.adjmulist[i].firstedge)//V有邻接结点
if(G.adjmulist[i].firstedge->
ivex==i)
returnG.adjmulist[i].firstedge->
jvex;
else
ivex;
else
//返回V的(相对于W)的下一个邻接结点的序号,若W是V的最后一个邻接结点,则返回-1
intNextAdjVex(AMLGraphG,VertexTypev,VertexTypew)
inti,j;
j=LocateVex(G,w);
0||j<
p=G.adjmulist[i].firstedge;
while(p)
if(p->
ivex==i&
&
p->
jvex!
=j)
p=p->
ilink;
elseif(p->
jvex==i&
ivex!
jlink;
break;
if(p&
jvex==j)
{
if(p&
returnp->
elseif(p&
jvex==i)
}
ivex==j&
//------------------------------------队列的操作
intvisite[NUM];
//访问标志数组
int(*VisitFunc)(VertexTypev);
voidDFS(AMLGraphG,intv)
VisitFunc(G.adjmulist[v].data);
visite[v]=1;
//该顶点已经被访问
p=G.adjmulist[v].firstedge;
j=p->
ivex==v?
jvex:
if(!
visite[j])
DFS(G,j);
p=p->
ilink:
//深度优先遍历图
voidDFSTraverse(AMLGraphG,int(*Visit)(VertexType))
intv,start;
VisitFunc=Visit;
for(v=0;
v<
v++)
visite[v]=0;
请输入你要开始进行查找的位置:
start;
按广深度优先搜索的结果是:
for(v=start;
if(v>
=G.vexnum)
for(v=0;
{
if(!
visite[v])
DFS(G,v);
}//内层for
}//if
if(!
DFS(G,v);
}//else
}//外层for
\b\b\b"
//队列的初始化
intInitQueue(LinkQueue*Q)
(*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
if(!
(*Q).front)
(*Q).front->
next=NULL;
//判断队列是否为空,为空则返回1,否则返回0
intQueueEmpty(LinkQueueQ)
if(Q.front==Q.rear)
return1;
return0;
//向队列中插入元素
intEnQueue(LinkQueue*Q,QElemTypee)
QueuePtrp=(QueuePtr)malloc(sizeof(QNode));
p)
p->
data=e;
(*Q).rear->
next=p;
(*Q).rear=p;
//若队列不为空,则删除对头元素,并返回1;
intDeQueue(LinkQueue*Q,QElemType*e)
QueuePtrp;
if((*Q).front==(*Q).rear)
p=(*Q).front->
next;
*e=p->
data;
next=p->
if((*Q).rear==p)
(*Q).rear=(*Q).front;
free(p);
//广度优先非递归遍历图G
voidBFSTraverse(AMLGraphG,int(*Visit)(VertexType))
intu,v,w,start=0;
VertexTypew1,u1;
LinkQueueQ;
InitQueue(&
Q);
按广度优先搜索的结果是:
{
visite[v]=1;
Visit(G.adjmulist[v].data);
EnQueue(&
Q,v);
//v入队列
while(!
QueueEmpty(Q))
DeQueue(&
Q,&
u);
strcpy(u1,*GetVex(G,u));
for(w=FirstAdjVex(G,u1);
w>
=0;
w=NextAdjVex(G,u1,strcpy(w1,*GetVex(G,w))))
if(!
visite[w])
{
visite[w]=1;
Visit(G.adjmulist[w].data);
EnQueue(&
Q,w);
}
}
}//for
//把边的访问标记设置为0,即未被访问
voidMarkUnVisited(AMLGraphG)
p=G.adjmulist[i].firstedge;
while(p)
p->
mark=0;
if(p->
p=p->
else
//显示构造的无向图(包括定点数、顶点、边数、边)
voidDisplay(AMLGraphG)
MarkUnVisited(G);
G.vexnum<
个顶点:
G.adjmulist[i].data<
"
G.edgenum<
条边:
mark)
{
cout<
-->
G.adjmulist[p->
jvex].data<
p->
mark=1;
//已经被访问过了
}
ivex].data<
intVisit(VertexTypev)
intmain()
intflag=1,control,YES=0;
AMLGraphg;
while(flag)
\t\t-----------------------------------------------------"
\t\t-------------请输入你要进行的操作:
------------------"
\t\t-----------1.创建无向图||2.打印无向图||----------"
\t\t-----------3.深度优先搜索||4.广度优先搜索||----------"
\t\t-----------0.退出系统--------------------------------"
control;
switch(control)
case1:
YES=CreateGraph(g);
case2:
if(YES)
Display(g);
cout<
请先创建无向图,再选择此项"
case3:
DFSTraverse(g,Visit);
}
case4:
BFSTraverse(g,Visit);
}
case0:
flag=0;
}//switch
}//while
return0;
四、程序清单
代码运行结果截图:
主页面:
1.创建无向图:
输入6个顶点、9条边,如图:
2.打印无向图:
3.深度优先搜索
4.广度搜索
五、总结
参考资料
[1]殷人昆.《数据结构(用面向对象方法与c++语言描述)》清华大学出版社
[2]严蔚敏、吴伟民.《数据结构(C语言版)》清华大学出版社