图 ADT接口 遍历运算 常规运算 邻接矩阵实现

Graph.h   (图的结构, 遍历, 常规操作接口)

/*定义图的最大定点数, 它要大于等于具体图的顶点树n*/
#define MaxVertexNum 12

/*定义图的最大边数,它要大于等于具体图的边数e*/
#define MaxEdgeNum 20 

/* 定义MaxValue 为一个符号常量,其值要大于邻接矩阵中所有有效值之和*/
#define MaxValue 1000

/*定义MS为一个符号常量,用于广度优先搜索遍历的算法中,作为自定义顺序队列的数组长度*/
#define MS 20

/*定义图中顶点数据的类型VertexType为整型*/
typedef int VertextType;

/*定义vexlist为存储顶点信息的数组类型*/
typedef VertexType vexlist[MaxVertexNum];

/*定义adjmatrix 为存储邻接矩阵的数组类型*/
typedef int adjmatrix[MaxVertexNum][MaxVertexNum];

/*定义保存图顶点访问标记的数组*/
int visited[MaxVertexNum];



/*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
void Create1(vexlist GV, adjmatrix GA, int n, int e);

/*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
void dfs1(adjmatrix GA, int i, int n);

/*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
void bfs1(adjmatrix GA, int i, int n);

Graph.c   (图的接口实现)

void Create1(vexlist GV, adjmatrix GA, int n, int e){
/*通过从键盘上输入的n个顶点信息和e条无向带权边的信息建立顶点数组GV和邻接矩阵GA*/
     int i,j,k,w;
     /*建立顶点数组*/
     printf("输入%d个顶点数据\n", n);
     for(i = 0; i<n; i++) scanf("%d", &GV[i]);
     /*初始化邻接矩阵数组*/
     for(i = 0; i<n; i++)
         for(j = 0; j<n; j++){
             if(i == j)GA[i][j] = 0;
             else GA[i][j] = MaxValue;
         }
     /*建立邻接矩阵数组*/
     printf("输入%d条无向带权边\n", e);
     for(k = 1; k<=e; k++){
         /*输入一条边的两端点序号i和j及边上的权w*/
         scanf("%d %d %d", &i, &j, &w);
         /*置数组中相应对称元素的值为w*/
         GA[i][j] = GA[j][i] = w;
     }
     
}


void dfs1(adjmatrix GA, int i, int n){
/*从初始点Vi出发深度优先搜索由邻接矩阵GA表示的图*/
     int j;
     /*假定访问顶点Vi以输出该顶点的序号代之*/
     printf("%d",i);
     /*标记Vi已被访问过*/
     visited[i] = 1;
     /*依次搜索Vi的每个邻接点*/
     for(j = 0; j<n; j++)
         /*若Vi的一个有效邻接点Vj未被访问过,则从Vj出发进行递归调用*/
         if(GA[i][j]!=0 && GA[i][j]!=MaxValue && !visited[j])
             dfs1(GA, j, n);
}
 

void bfs1(adjmatrix GA, int i, int n){
/*从初始点Vi出发广度优先搜索由邻接矩阵GA表示的图*/
     /*定义一个顺序队列Q,其元素类型应为整形,初始化队列为空*/
     int Q[MS];    //MS是一个事先定义的符号常量
     int front = 0,rear = 0;
     /*访问初始点Vi,同时标记初始点Vi已访问过*/
     printf("%d" ,i);
     visited[i] = 1;
     /*将已访问过的初始点序号i入队*/
     rear = (rear+1)%MS;
     if(front == rear) {
         printf("队列空间用完!\n");
         exit(1);
     }
     Q[[rear] = i;
     
     /*当队列非空时进行循环处理*/
     while(front != rear){
         int j,k;
         /*删除队首元素,第一次执行时k的值为i*/
         front = (front + 1)%MS;
         k = Q[front];
         /*依次搜索Vk的每一个可能的邻接点*/
         for(j = 0; j<n; j++){
             if(GA[k][j]!=0 && GA[k][j] != MaxValue&&!visited[j]){
                 printf("%d", j);               //访问一个未被访问过的邻接节点Vj
                 visited[j] = 1;                //标记Vj已被访问过
                 rear = (rear+1)%MS;            //修改队尾指针
                 if(front == rear) {
                     printf("队列空间用完!\n");
                     exit(1);
                 }
                 Q[rear] = j;
             }
         }
     
     }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值