数据结构图的基本操作Word格式.docx
- 文档编号:17238828
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:15
- 大小:53.93KB
数据结构图的基本操作Word格式.docx
《数据结构图的基本操作Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构图的基本操作Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
{
intadjvex;
//该弧所指向的顶点的位置
structArcNode*nextarc;
//指向下一条弧的指针
}ArcNode;
typedefstructVNode
chardata;
//顶点信息
ArcNode*firstarc;
//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];
AdjListvertices;
//图当前顶点数和弧数
}LGraph;
(2)本程序主要包含6个函数:
•主函数main()
•建立图的邻接矩阵,邻接表Create_Graph()
•邻接表表示的图的递归深度优先遍历LDFS()
•邻接矩阵表示的图的递归深度优先遍历MDFS()
•邻接表表示的图的广度优先遍历LBFS()
•邻接矩阵表示的图的广度优先遍历MBFS()
各函数间调用关系如下:
(3)主函数的伪码
main()
{定义邻接矩阵和邻接表;
建立邻接矩阵和邻接表;
邻接矩阵MDFS深度优先遍历;
邻接矩阵MBFS广度优先遍历;
邻接表LDFS深度优先遍历;
邻接表LBFS广度优先遍历
}
5详细设计
intCreate_Graph(MGraph*Mg,LGraph*Lg)//建立图的邻接矩阵,邻接表
输入图的顶点个数(字符),构造顶点向量
输入图的任意两个顶点的弧
构造邻接矩阵
构造邻接表
voidLDFS(LGraph*Lg,inti)邻接表表示的图的递归深度优先遍历
显示顶点向量,
指针指向下一个顶点向量
下一个顶点没有被访问,继续
否则退会上一个顶点向量的另一个边
voidMDFS(MGraph*Mg,inti)邻接矩阵表示的图的递归深度优先遍历
voidLBFS(LGraph*Lg)邻接表表示的图的广度优先遍历
初始化visited[]
初始化队列
没被访问过
显示顶点向量入队
出队访问下一个顶点向量
voidMBFS(MGraph*Mg)邻接矩阵表示的图的广度优先遍历
//-------------------主函数-------------------------------
6测试结果
7.参考文献
《数据结构》
8.附录
#include<
stdio.h>
malloc.h>
stddef.h>
math.h>
#defineOK1
#defineERROR0
#defineMAX_VERTEX_NUM20
intvisited[MAX_VERTEX_NUM];
//访问标志数组
//_________________________________队列函数__________________________________________
typedefstructQueue
intarry[MAX_VERTEX_NUM];
intfront,rear;
}Queue;
QueueQ;
voidInitQueue()//队列初始化
Q.front=Q.rear=0;
intQueueEmpty(Queue*Q)//清空队列
if(Q->
front==Q->
rear)
return1;
else
return0;
voidEnQueue(Queue*Q,intw)//入队
if((Q->
rear+1)%MAX_VERTEX_NUM==Q->
front)
printf("
Error!
"
);
{
Q->
arry[Q->
rear]=w;
rear=(Q->
rear+1)%MAX_VERTEX_NUM;
}
intDeQueue(Queue*Q)//出队
intu;
return-1;
u=Q->
front;
Q->
front=(Q->
front+1)%MAX_VERTEX_NUM;
returnu;
//____________________________________队列函数end_______________________________________
/****************************************************************************************
*函数:
Create_Graph
*功能:
建立图的邻接矩阵,邻接表
*说明:
该构建的为无向网mg为邻接矩阵,lg为邻接表,无权值
***************************************************************************************/
intLocatevex(MGraph*Mg,charv)//确定v元素在Mg中的位置
inti;
for(i=0;
Mg->
vexs[i]!
=v;
i++);
if(i>
vexnum)//输入的元素不正确则显示错误
printf("
ERROR"
returni;
//返回位置
intCreate_Graph(MGraph*Mg,LGraph*Lg)//建立图的邻接矩阵,邻接表
inti,j,k;
charv1,v2;
ArcNode*q,*p;
printf("
输入图的顶点数和弧数:
"
scanf("
%d%d"
&
vexnum,&
arcnum);
getchar();
Lg->
vexnum=Mg->
vexnum;
//邻接表的顶点数和弧数
arcnum=Mg->
arcnum;
for(i=0;
i<
i++)//构造顶点向量
请输入一个图的顶点(字符):
scanf("
%c"
&
vexs[i]);
getchar();
Lg->
vertices[i].data=Mg->
vexs[i];
//赋值
vertices[i].firstarc=NULL;
//指向第一条依附该顶点的弧的指针为空
i++)//初始化邻接矩阵
for(j=0;
j<
j++)
Mg->
acrs[i][j]=0;
for(k=0;
k<
k++)//构造邻接矩阵和邻接表
请输入一条边连接的2个顶点:
%c%c"
v1,&
v2);
i=Locatevex(Mg,v1);
//确定v1在Mg中的位置
j=Locatevex(Mg,v2);
//确定v2在Mg中的位置
Mg->
acrs[j][i]=Mg->
acrs[i][j]=1;
//置《v1,v2》的对称弧《v2,v1》
p=(ArcNode*)malloc(sizeof(ArcNode));
p->
adjvex=i;
//确认顶点位置
nextarc=Lg->
vertices[j].firstarc;
//指向下一条弧的指针
vertices[j].firstarc=p;
//赋值
q=(ArcNode*)malloc(sizeof(ArcNode));
q->
adjvex=j;
//确认顶点位置
vertices[i].firstarc;
vertices[i].firstarc=q;
returnOK;
LDFS
邻接表表示的图的递归深度优先遍历
intLAdjVex(LGraph*Lg,intk)//位置
ArcNode*p;
for(p=Lg->
vertices[k].firstarc;
p!
=NULL;
p=p->
nextarc)
if(!
visited[p->
adjvex])
returnp->
adjvex;
voidLDFS(LGraph*Lg,inti)
intk;
visited[i]=OK;
Lg->
vertices[i].data);
for(k=LAdjVex(Lg,i);
k>
=0;
k=LAdjVex(Lg,k))
if(!
visited[k])
LDFS(Lg,k);
MDFS
邻接矩阵表示的图的递归深度优先遍历
intAdjVes(MGraph*Mg,intk)//位置
i++)
if(Mg->
acrs[k][i]&
&
(!
visited[i]))
returni;
voidMDFS(MGraph*Mg,inti)//递归深度优先遍历
visited[i]=1;
//访问标志数组某位置1
Mg->
//显示
for(k=AdjVes(Mg,i);
k=AdjVes(Mg,k))
MDFS(Mg,k);
//递归
LBFS
邻接表表示的图的广度优先遍历
voidLBFS(LGraph*Lg)
inti,u,w;
Lg->
++i)//初始化visited[]
visited[i]=0;
InitQueue();
//初始化队列
++i)
visited[i])//没被访问过
{
visited[i]=1;
EnQueue(&
Q,i);
//入队
while(!
QueueEmpty(&
Q))
{
u=DeQueue(&
Q);
//出队
for(w=LAdjVex(Lg,u);
w>
w=LAdjVex(Lg,u))
if(!
visited[w])//没被访问过
{
visited[w]=1;
printf("
vertices[w].data);
EnQueue(&
Q,w);
//入队
}
}
}
MBFS
邻接矩阵表示的图的广度优先遍历
voidMBFS(MGraph*Mg)
inti,w,u;
i++)//初始化visited[]
//初始化队列
//显示
for(w=AdjVes(Mg,u);
w=AdjVes(Mg,u))
if(!
vexs[w]);
//显示
EnQueue(&
//入队
/***************************************主函数*******************************************/
voidmain()
inti;
MGraphMg;
LGraphLg;
Create_Graph(&
Mg,&
Lg);
邻接矩阵MDFS深度优先遍历:
\t"
Mg.vexnum;
//初始化visited[]
visited[i])
MDFS(&
Mg,i);
//遍历Mg
\n邻接矩阵MBFS广度优先遍历:
MBFS(&
Mg);
//遍历Mg
\n"
邻接表LDFS深度优先遍历:
Lg.vexnum;
visited[i]=0;
//初始化visited[]
visited[i])
LDFS(&
Lg,i);
//遍历Lg
\n邻接表LBFS广度优先遍历:
LBFS(&
Lg);
//遍历Lg
}}注意事项:
●每位同学必须完成实验任务,并提交实验报告。
杜绝抄袭和拷贝,一经发现该次实验雷同报告均以零分计。
●请将实验报告以电子文档提交,“网络工程”,“电子信息”信箱中,请附上程序清单.C源程序文件、和实验报告WORD文档
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图 基本 操作