数据结构课程设计报告模板图的遍历文档格式.docx

上传人:b****5 文档编号:19067497 上传时间:2023-01-03 格式:DOCX 页数:19 大小:124.89KB
下载 相关 举报
数据结构课程设计报告模板图的遍历文档格式.docx_第1页
第1页 / 共19页
数据结构课程设计报告模板图的遍历文档格式.docx_第2页
第2页 / 共19页
数据结构课程设计报告模板图的遍历文档格式.docx_第3页
第3页 / 共19页
数据结构课程设计报告模板图的遍历文档格式.docx_第4页
第4页 / 共19页
数据结构课程设计报告模板图的遍历文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构课程设计报告模板图的遍历文档格式.docx

《数据结构课程设计报告模板图的遍历文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告模板图的遍历文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构课程设计报告模板图的遍历文档格式.docx

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语言版)》清华大学出版社

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1