数据结构05单元5 图.docx
- 文档编号:5417795
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:13
- 大小:19.32KB
数据结构05单元5 图.docx
《数据结构05单元5 图.docx》由会员分享,可在线阅读,更多相关《数据结构05单元5 图.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构05单元5图
单元5图
源代码
SC02020105001
1.源代码编号
SC02020105001
2.源代码来源
单元5图
5.2.1
3.问题描述
建立无向网络的算法
4.程序代码
voidCreateMGraph(MGraph*G)
{//建立无向网(图)的邻接矩阵表示
inti,j,k;
EdgeTypew;
printf("读入顶点数和边数:
");
scanf("%d%d",&G->n,&G->e);//输入顶点数边数
getchar();
printf("读入顶点信息,建立顶点表:
");
for(i=0;i
G->vexs[i]=getchar();
getchar();
for(i=0;i
for(j=0;j
G->edges[i][j]=0;//邻接矩阵初始化
for(k=0;k
{//读入e条边,建立邻接矩阵
scanf("%d%d%d",&i,&j,&w);//输入权w
G->edges[i][j]=w;
G->edges[j][i]=w;
}
}
SC02020105002
1.源代码编号
SC02020105002
2.源代码来源
单元5图
5.2.1
3.问题描述
建立无向图的邻接表算法
4.程序代码
voidCreateALGraph(ALGraph*G)
{//建立无向图的邻接表
inti,j,k;
EdgeNode*s;
scanf("%d%d",&G->n,&G->e);//读入顶点数和边数
getchar();
for(i=0;i
{//建立顶点表
G->adjlist[i].vertex=getchar();//读入顶点信息
G->adjlist[i].firstedge=NULL;//边表置为空表
}
for(k=0;k
{//建立边表
scanf("%d%d",&i,&j);//读入边(vi,vj)顶点对序号
s=(EdgeNode*)malloc(sizeof(EdgeNode));//生成边表结点
if(s==NULL)
{
puts("空间申请失败");return;
}
s->adjvex=j;//邻接点序号为j
s->next=G->adjlist[i].firstedge;
G->adjlist[i].firstedge=s;//将新结点*s插入顶点vi的边表头部
s=(EdgeNode*)malloc(sizeof(EdgeNode));
if(s==NULL)
{
puts("空间申请失败");return;
}
s->adjvex=i;//邻接点序号为i
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s;//将新结点*s插入顶点vj的边表头部
}
}
SC02020105003
1.源代码编号
SC02020105003
2.源代码来源
单元5图
5.3.1
3.问题描述
邻接矩阵表示的深度优先遍历算法
4.程序代码
intvisited[VertexNum]={0};//定义标志向量
voidDFSM(MGraph*G,inti)
{//以vi为出发点进行搜索,设邻接矩阵是0,l矩阵
SC02020105003
intj;
printf("%4c",G->vexs[i]);//访问顶点vi
visited[i]=1;
for(j=0;j
if((G->edges[i][j]==1)&&(!
visited[j]))
DFSM(G,j);//(vi,vj)∈E,且vj未访问过
}
voidDFSTraverse(MGraph*G)
{//深度优先遍历以邻接矩阵表示G
inti;
for(i=0;i
visited[i]=0;//标志向量初始化
for(i=0;i
if(!
visited[i])//vi未访问过
DFSM(G,i);//以vi为源点开始DFSM搜索
}
SC02020105004
1.源代码编号
SC02020105004
2.源代码来源
单元5图
5.3.1
3.问题描述
邻接表表示的深度优先搜索算法
4.程序代码
intvisited[VertexNum]={0};//定义标志向量
voidDFS(ALGraph*G,inti)
{//以vi为出发点进行深度优先搜索
EdgeNode*p;
printf("%4c",G->adjlist[i].vertex);//访问顶点vi
visited[i]=1;//标记vi已访问
p=G->adjlist[i].firstedge;//取vi边表的头指针
while(p)
{//依次搜索vi的邻接点vj,这里j=p->adjvex
if(!
visited[p->adjvex])//若vi尚未被访问
DFS(G,p->adjvex);//则以vj为出发点向纵深搜索
p=p->next;//找vi的下一邻接点
}
}
voidDFSTraverse(ALGraph*G)
{//深度优先遍历以邻接表表示G
inti;
for(i=0;i
visited[i]=0;//标志向量初始化
for(i=0;i
if(!
visited[i])//vi未访问过
DFS(G,i);//以vi为源点开始DFS搜索
}
SC02020105005
1.源代码编号
SC02020105005
2.源代码来源
单元5图
5.3.2
3.问题描述
邻接矩阵表示的广度优先遍历算法
4.程序代码
intvisited[VertexNum]={0};//定义标志向量
voidBFSM(MGraph*G,intk)
{//以vk为源点对用邻接矩阵表示的图G进行广度优先搜索
inti,j;
CirQueueQ;
InitQueue(&Q);
printf("%4c",G->vexs[k]);//访问源点vk
visited[k]=1;
EnQueue(&Q,k);
while(!
QueueEmpty(&Q))
{
i=DeQueue(&Q);//vi出队
for(j=0;j
if(G->edges[i][j]==1&&!
visited[j])
{//vi未访问
printf("%4c",G->vexs[j]);//访问vi
visited[j]=1;
EnQueue(&Q,j);//访问过的vi入队
}
}
}
voidDFSTraverse(MGraph*G)
{//广度优先遍历以邻接矩阵表示G
inti;
for(i=0;i
visited[i]=0;//标志向量初始化
for(i=0;i
if(!
visited[i])//vi未访问过
BFSM(G,i);//以vi为源点开始DFSM搜索
}
SC02020105006
1.源代码编号
SC02020105006
2.源代码来源
单元5图
5.3.2
3.问题描述
邻接表表示的广度优先遍历算法
4.程序代码
intvisited[VertexNum]={0};//定义标志向量
voidBFS(ALGraph*G,intk)
{//以vk为源点对用邻接表表示的图G进行广度优先搜索
inti;
CirQueueQ;//须将队列定义中DataType改为int
EdgeNode*p;
InitQueue(&Q);//队列初始化
printf("%4c",G->adjlist[k].vertex);//访问源点vk
visited[k]=1;
EnQueue(&Q,k);//vk已访问,将其入队。
(实际上是将其序号入队)
while(!
QueueEmpty(&Q))
{//队非空则执行
i=DeQueue(&Q);//相当于vi出队
p=G->adjlist[i].firstedge;//取vi的边表头指针
while(p)
{//依次搜索vi的邻接点vj(令p->adjvex=j)
if(!
visited[p->adjvex])
{//若vj未访问过
printf("%4c",G->adjlist[p->adjvex].vertex);//访问vj
visited[p->adjvex]=1;
EnQueue(&Q,p->adjvex);//访问过的vj人队
}
p=p->next;//找vi的下一邻接点
}
}
}
SC02020105007
1.源代码编号
SC02020105007
2.源代码来源
单元5图
5.3.2
3.问题描述
普里姆算法
4.程序代码
intMinValue(intn)
{//比较求最小距离值,并返回对应下标
intj,k;
for(j=0;j if(CloseEdge[j].lowcost>0) { k=j;break; } for(j=1;j if(CloseEdge[j].lowcost>0&&CloseEdge[j].lowcost k=j; returnk; } voidPrim(MGraph*G,intu) {//求用邻接矩阵表示的图G的最小生成树的算法 intcc=0,pp[VertexNum*2];//pp存放最小生成树中边的下标 intk=0,i,j,s1; for(i=0;i { CloseEdge[i].vex=u;CloseEdge[i].lowcost=G->edges[u][i]; } CloseEdge[u].lowcost=0; for(i=1;i { k=MinValue(G->n); s1=CloseEdge[k].vex;//边(s1,k)是一条权值最小的边 CloseEdge[k].lowcost=0;//将顶点k加入到U中 pp[cc++]=s1;pp[cc++]=k;//将最小生成树的边(s1,k)记录到数组pp中 for(j=0;j if(G->edges[k][j] {//调整最短路径,并保存下标 CloseEdge[j].lowcost=G->edges[k][j];CloseEdge[j].vex=k; } } } SC02020105008 1.源代码编号 SC02020105008 2.源代码来源 单元5图 引例分析与实现 3.问题描述 引例代码实现 4.程序代码 voidCreateMGraph(MGraph*G) {//创建无向带权图的邻接矩阵算法 inti,j,k; EdgeTypew;//边的权值 printf("输入城市的个数和拟建公路的条数,用逗号分隔: "); scanf("%d,%d",&G->n,&G->e); printf("分别输入%d个城市名称: \n",G->n); for(i=0;i { printf("第%d个城市名称: ",i+1); scanf("%s",G->vexs[i]); } printf("各城市序号为: \n"); for(i=0;i printf("%s: %d\t",G->vexs[i],i+1); printf("\n"); for(i=0;i {//邻接矩阵初始化 for(j=0;j G->edges[i][j]=MAXINT;//置初始建设费用为最大值 G->edges[i][i]=0;//顶点到本身的费用为0 } for(k=1;k<=G->e;k++) {//建立邻接矩阵 printf("输入拟建第%d条公路两城市序号及建设费用,用逗号分隔: ",k); scanf("%d,%d,%d",&i,&j,&w); while(i<1||i>G->n||j<1||j>G->n) { printf("输入错误,请重输"); scanf("%d,%d,%d",&i,&j,&w); } G->edges[i-1][j-1]=w; G->edges[j-1][i-1]=w; } } intMinValue(intn) {//比较求最小距离值,并返回对应下标 intj,k; for(j=0;j if(CloseEdge[j].lowcost>0) { k=j;break; } for(j=1;j if(CloseEdge[j].lowcost>0&&CloseEdge[j].lowcost k=j; returnk; } voidPrim(MGraph*G,intu) {//求用邻接矩阵表示的图G的最小生成树的算法 intcc=0,pp[VertexNum*2];/*pp记录最小生成树中边的下标,最终得到最小生成树的边的序列*/ intk=0,i,j,s1; for(i=0;i { CloseEdge[i].vex=u; CloseEdge[i].lowcost=G->edges[u][i]; } CloseEdge[u].lowcost=0; for(i=1;i { k=MinValue(G->n); s1=CloseEdge[k].vex;//边(s1,k)是一条权值最小的边 CloseEdge[k].lowcost=0;//将顶点k加入到U中 pp[cc++]=s1; pp[cc++]=k;//将最小生成树的一条边(s1,k)记录到数组pp中 for(j=0;j if(G->edges[k][j] {//调整最短路径,并保存下标 CloseEdge[j].lowcost=G->edges[k][j];CloseEdge[j].vex=k; } } printf("公路网建设最经济方案为: \n"); for(i=0;i<2*(G->n-1);i=i+2) printf("应建公路: %s<=>%s,费用: %d\n",G->vexs[pp[i]],G->vexs[pp[i+1]],G->edges[pp[i]][pp[i+1]]); } intmain() { MGraphG; CreateMGraph(&G); Prim(&G,0);//0为起始顶点的下标 return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构05单元5 数据结构 05 单元