P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。

头文件1:SeqList.h

#include<stdio.h>#define MaxSize 100typedef char DataType;typedef struct
{DataType list[MaxSize];int size;
}SeqList;void ListInitiate(SeqList *L)
{L->size=0;
}int ListLength(SeqList L)
{return L.size;
}int ListInsert(SeqList *L,int i, DataType x)
{int j;if(L->size>=MaxSize){printf("数组已满无法插入!\n");return 0;}else if(i<0||i>L->size){printf("参数i不合法!\n");return 0;}else{for(j=L->size;j>i;j--)L->list[j]=L->list[j-1];L->list[i]=x;L->size++;return 1;}
}int ListDelete(SeqList *L,int i,DataType *x)
{int j;if(L->size<=0){printf("顺序表已空无数据可删!\n");return 0;}else if(i<0||i>L->size-1){printf("参数i不合法");return 0;}else{*x=L->list[i];for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];L->size--;return 1;}
}int ListGet(SeqList L,int i,DataType *x)
{if(i<0||i>L.size-1){printf("参数i不合法!\n");return 0;}else{*x=L.list[i];return 1;}
}

头文件2:AdjMGraph.h

#include"SeqList.h"#define MaxVertices 10
#define MaxWeight 10000typedef struct
{SeqList Vertices;int edge[MaxVertices][MaxVertices];int numOfEdges;
}AdjMGraph;void Initiate(AdjMGraph *G,int n)
{int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)G->edge[i][j]=0;elseG->edge[i][j]=MaxWeight;}}G->numOfEdges=0;ListInitiate(&G->Vertices);
}void InsertVertex(AdjMGraph *G,DataType vertex)
{ListInsert(&G->Vertices,G->Vertices.size,vertex);
}void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)
{if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size){printf("参数v1或v2越界出错!\n");return;}G->edge[v1][v2]=weight;G->numOfEdges++;
}void DeleteEdge(AdjMGraph *G,int v1,int v2)
{if(v1<0||v1>=G->Vertices.size||v2<0||v2>=G->Vertices.size||v1==v2){printf("参数v1或v2出错!\n");return;}if(G->edge[v1][v2]==MaxWeight||v1==v2){printf("该边不存在!\n");return;}G->edge[v1][v2]=MaxWeight;G->numOfEdges--;
}int GetFirstVex(AdjMGraph G,int v)
{int col;if(v<0||v>G.Vertices.size){printf("参数v1越界出错!\n");return -1;}for(col=0;col<G.Vertices.size;col++){if(G.edge[v][col]>0&&G.edge[v][col]<MaxWeight)return col;}return -1;
}int GetNextVex(AdjMGraph G,int v1,int v2)
{int col;if(v1<0||v1>G.Vertices.size||v2<0||v2>G.Vertices.size){printf("参数v1或v2越界出错!\n");return -1;}for(col=v2+1;col<G.Vertices.size;col++){if(G.edge[v1][col]>0&&G.edge[v1][col]<MaxWeight)return col;}return -1;
}

头文件3:AdjMGraphCreate.h

#include"AdjMGraph.h"typedef struct
{int row;int col;int weight;
}RowColWeight;void CreatGraph(AdjMGraph *G,DataType V[],int n,RowColWeight E[],int e)
{int i,k;Initiate(G,n);for(i=0;i<n;i++)InsertVertex(G,V[i]);for(k=0;k<e;k++)InsertEdge(G,E[k].row,E[k].col,E[k].weight);
}

头文件4:SeqCQueue.h

#include<stdio.h>#define MaxQueueSize 100typedef char DataType;typedef struct
{DataType queue[MaxQueueSize];int rear;int front;int count;
}SeqCQueue;void QueueInitiate(SeqCQueue *Q)
{Q->rear=0;Q->front=0;Q->count=0;
}int QueueNotEmpty(SeqCQueue Q)
{if(Q.count!=0)return 1;elsereturn 0;
}int QueueAppend(SeqCQueue *Q,DataType x)
{if(Q->count>0&&Q->rear==Q->front){printf("队列已满无法插入!\n");return 0;}else{Q->queue[Q->rear]=x;Q->rear=(Q->rear+1)%MaxQueueSize;Q->count++;return 1;}
}int QueueDelete(SeqCQueue *Q,DataType *d)
{if(Q->count==0){printf("队列已空无数据元素出队列!\n");return 0;}else{*d=Q->queue[Q->front];Q->front=(Q->front+1)%MaxQueueSize;Q->count--;return 1;}
}int QueueGet(SeqCQueue Q,DataType *d)
{if(Q.count==0){printf("队列已空无数据元素可取!\n");return 0;}else{*d=Q.queue[Q.front];return 1;}
}

头文件5:AdjMGraphTraverse.h

#include<stdlib.h>
#include"AdjMGraphCreate.h"
#include"SeqCQueue.h"void DepthFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item))
{int w;Visit(G.Vertices.list[v]);visited[v]=1;w=GetFirstVex(G,v);while(w!=-1){if(!visited[w])DepthFSearch(G,w,visited,Visit);w=GetNextVex(G,v,w);}
}void DepthFirstSearch(AdjMGraph G,void Visit(DataType item))
{int i;int *visited=(int *)malloc(sizeof(int)*G.Vertices.size);for(i=0;i<G.Vertices.size;i++)visited[i]=0;for(i=0;i<G.Vertices.size;i++){if(!visited[i])DepthFSearch(G,i,visited,Visit);}free(visited);
}void BroadFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item))
{DataType u,w;SeqCQueue queue;Visit(G.Vertices.list[v]);visited[v]=1;QueueInitiate(&queue);QueueAppend(&queue,v);while(QueueNotEmpty(queue)){QueueDelete(&queue,&u);w=GetFirstVex(G,u);while(w!=-1){if(!visited[w]){Visit(G.Vertices.list[w]);visited[w]=1;QueueAppend(&queue,w);}w=GetNextVex(G,u,w);}}
}void BroadFirstSearch(AdjMGraph G,void Visit(DataType item))
{int i;int *visited=(int *)malloc(sizeof(int)*G.Vertices.size);for(i=0;i<G.Vertices.size;i++)visited[i]=0;for(i=0;i<G.Vertices.size;i++)if(!visited[i])BroadFSearch(G,i,visited,Visit);free(visited);
}

源文件:例9-2.c

#include<stdio.h>#include"AdjMGraphTraverse.h"void Visit(DataType item)
{printf("%c  ",item);
}int main()
{AdjMGraph g1;DataType a[]={'A','B','C','D','E'};RowColWeight rcw[]={{0,1,10},{0,4,20},{1,3,30},{2,1,40},{3,2,50}};int n=5,e=5;CreatGraph(&g1,a,n,rcw,e);printf("深度优先搜索序列为:");DepthFirstSearch(g1,Visit);printf("\n广度优先搜索序列为:");BroadFirstSearch(g1,Visit);return 0;
}

P202 例9-2 以如图9-8所示的带权有向图为例,编写测试上述图的深度优先和广度优先遍历函数的程序。相关推荐

  1. 图的理解:深度优先和广度优先遍历及其 Java 实现

    遍历 图的遍历,所谓遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: 深度优先遍历 广度优先遍历 深度优先 深度优先遍历,从初始访问结点出发,我们知道 ...

  2. c++ 数据结构 图的应用(实现图的深度优先和广度优先遍历)——以邻接表为存储结构

    数据结构实习--图及应用(图的遍历) 一.问题描述 很多涉及图上操作的算法都是以图的遍历操作为基础的.试写一个程序,演示无向图的遍历操作. 二.基本要求 以邻接表为存储结构,实现连通无向图的深度优先和 ...

  3. 图的存储以及深度优先以及广度优先遍历

    转载自:http://blog.csdn.net/gamer_gyt/article/details/51498546 一:图的分类 1:无向图 即两个顶点之间没有明确的指向关系,只有一条边相连,例如 ...

  4. 邻接矩阵,构造有向图、无向图、有向网、无向网,深度优先、广度优先遍历(C++图)

    #include <iostream> using namespace std; #define INFINITY INT_MAX #define MAX_VERTEX_NUM 20//最 ...

  5. 图的建立(邻接矩阵)与其深度优先和广度优先遍历

    建立一个有向图或无向图,输入其顶点数,边数,并给出相应边的权值,输出该图对应的邻接矩阵,并用递归实现其深度优先遍历和用队列实现其广度优先遍历后的结果. 图的遍历 从给定图中任意指定的顶点(称为初始点) ...

  6. 图数据结构,以及使用递归方式实现图的深度优先和广度优先遍历

    源码概览 1.GraphDemo,用于演示一个图结构以及图的遍历. 2.Graph,表示图数据结构,维护顶点的集合与边的集合,并提供广度优先遍历和深度优先遍历方法. 3.Edge<V>,表 ...

  7. 图深度优先、广度优先遍历(java)

    一.图的遍历 图的遍历,即是对结点的访问.一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略:(1)深度优先遍历(2)广度优先遍历深度优先遍历基本思想. 二.深度优先遍历 图的深 ...

  8. 以0结点为起点实现上述图的深度优先和广度优先遍历算法

    MatGraph.h #pragma once #include <iostream> using namespace std;#define MAXV 7 //最大顶点个数 #defin ...

  9. 求的带权图最小生成树的Prim算法和Kruskal算法

    求的带权图最小生成树的Prim算法和Kruskal算法 最小生成树的概念 最小生成树其实是最小权重生成树的简称. 一个连通图可能有多个生成树.当图中的边具有权值时,总会有一个生成树的边的权值之和小于或 ...

最新文章

  1. Python中的函数参数类型
  2. alpha冲刺day12
  3. linux+geth+不能同步公链数据,以太坊(ETH)同步公链数据
  4. 漂亮图片演示ajax制作教程-lightbox
  5. 面试官不讲武德,竟然问了我18个JVM问题!
  6. 可视化戒烟对身体的影响!从20分钟到15年
  7. ajax格式,需要指定交互的data类型
  8. 宜信正式开源其 AIOps 落地三大利器
  9. 六、简单又有坑的原型模式
  10. 免费证件照制作的软件有哪些?来看看这几个好用的软件
  11. 有限元分析基础操作(ANSYS)
  12. linux ssh互信配置
  13. 百度地图API js详细介绍
  14. 币小秘:如何才能减少被套,降低风险!
  15. 华东师范大学副校长周傲英:未来,中国需要什么样的数据库?
  16. 贪心入门+10道例题+解析代码
  17. 【如何中医调理过敏性鼻炎】
  18. 如果要用运营的姿势,发支付宝红包
  19. 持续集成(第二版)[来自:Martin Fowler]
  20. AE基础教程第一阶段——01影视后期专业导论

热门文章

  1. SRS流媒体服务器搭建与测试
  2. Python爬虫:抓取手机APP数据
  3. mysql 反斜杠 转义_MySQL中执行sql语句反斜杠需要进行转义
  4. jeecgboot入手
  5. JAVA数据结构篇--5理解HashMap
  6. Python图形界面设计
  7. 过秦楼 . 碧玉连空
  8. Jenkins Pipeline checkout scm拉取代码
  9. jansson库使用
  10. 根据先序遍历数列和中序遍历数列重建二叉树