数据结构----图(邻接矩阵用法)

1、定义图的链接矩阵:

1 #define VERTEX_MAX 6
2 #define MAXVALUE 32767
3 typedef struct{
4     int vertex[VERTEX_MAX];
5     int edges[VERTEX_MAX][VERTEX_MAX];
6     int vertexNum,edgesNum;
7     int grapType;
8 }MatrixGraph;

2、定义函数createGraph,创建图的邻接矩阵:

 1 void createGraph(MatrixGraph *g){
 2     int start,end;
 3     printf("Please input  vertexs\n");
 4     for(int i=0;i<g->vertexNum;i++){
 5         printf("the %d vertex is ",i+1);
 6         scanf("%d",&g->vertex[i]);
 7     }
 8     printf("\nPlease input the edges. The former is that the first input is the start vertex and the second input is the end vertex!\n");
 9     for(int i=0;i<g->edgesNum;i++){
10         printf("the %d edge:(please input data like above!) ",i+1);
11         scanf("%d%d",&start,&end);
12         g->edges[start-1][end-1]=1;
13         if(g->grapType==0)
14         g->edges[end-1][start-1]=1;
15     }
16 }

3、定义函数输出邻居矩阵的内容:

 1 void printGraph(MatrixGraph *g){
 2     printf("  ");
 3     for(int i=0;i<g->vertexNum;i++){
 4         printf("%d ",g->vertex[i]);
 5     }
 6     for(int i=0;i<g->vertexNum;i++){
 7         printf("\n%d ",g->vertex[i]);
 8         for(int j=0;j<g->vertexNum;j++){
 9             if(g->edges[i][j]==MAXVALUE)
10             printf("@ ");
11             else
12             printf("%d ",g->edges[i][j]);
13         }
14     }
15     printf("\n");
16 }

4、主函数:

 1 int main(){
 2     MatrixGraph *g;
 3     g=(MatrixGraph *)malloc(sizeof(MatrixGraph));
 4     printf("Please select the type of grap: 0 is undigrap, 1 is digrap.\n");
 5     scanf("%d",&g->grapType);
 6     printf("Please input the vertexNum and edgeNum of matrixGraph!\n");
 7     scanf("%d%d",&g->vertexNum,&g->edgesNum);
 8     for(int i=0;i<g->vertexNum;i++){
 9         for(int j=0;j<g->vertexNum;j++){
10             g->edges[i][j]=MAXVALUE;
11         }
12     }
13     createGraph(g);
14     printf("Oupt the MatrixGrap. \n");
15     printGraph(g);
16     free(g);
17     getch();
18     return 0;
19 }

注意:主函数中的

MatrixGraph *g;

可以改写成

MatrixGraph g;
 1 printf("Please select the type of grap: 0 is undigrap, 1 is digrap.\n");
 2     scanf("%d",&g.grapType);
 3     printf("Please input the vertexNum and edgeNum of matrixGraph!\n");
 4     scanf("%d%d",&g.vertexNum,&g.edgesNum);
 5     for(int i=0;i<g.vertexNum;i++){
 6         for(int j=0;j<g.vertexNum;j++){
 7             g.edges[i][j]=MAXVALUE;
 8         }
 9     }
10     createGraph(&g);
11     printf("Oupt the MatrixGrap. \n");
12     printGraph(&g);
13     getch();
14     return 0;

但是后面指向结构体变量时需要用 . 而不是用->,并且需要给结构体指针变量先开辟空间 。

在c++中g如果是对象,就可以通过"."来调用I中的成员变量。
如果g是指针的话,就不能通过"."来调用,而只能使用"->"来调用。
在C语言中不存在对象的概念。
这种情况的出现是因为使用了结构,例如:

在程序中

1 MatrixGraph G; 

我们就可以用G.vertexNum来取得结构中的值。
这时是不能使用"->"来调用的,"->"符号指针对指针来说的。
如下情况可以使用"->"

1 MatrixGraph *g;

此时g为一个MatrixGraph结构的地址指针。所以可以使用"->",而此时就不能使用
"."来操作。因为"." "相当于"对象的成员调用。

最终显示结果:

时间: 2024-11-06 09:38:28

数据结构----图(邻接矩阵用法)的相关文章

C#与数据结构--图的遍历

C#与数据结构--图的遍历 8.2 图的存储结构 图 的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区 中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多.常用的图的存储结构有邻接矩阵.邻接表.十字链表和邻接多重表. 8.2.1  邻接矩阵表示法 对于一个具有n个顶点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系.图8.10和图8.11中,矩阵A(i,j)=1

数据结构--图 的JAVA实现(上)

1,摘要: 本系列文章主要学习如何使用JAVA语言以邻接表的方式实现了数据结构---图(Graph),这是第一篇文章,学习如何用JAVA来表示图的顶点.从数据的表示方法来说,有二种表示图的方式:一种是邻接矩阵,其实是一个二维数组:一种是邻接表,其实是一个顶点表,每个顶点又拥有一个边列表.下图是图的邻接表表示. 从图中可以看出,图的实现需要能够表示顶点表,能够表示边表.邻接表指是的哪部分呢?每个顶点都有一个邻接表,一个指定顶点的邻接表中,起始顶点表示边的起点,其他顶点表示边的终点.这样,就可以用邻

数据结构 - 图的存储结构

图的抽象数据类型定义 图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型. 图的抽象数据类型定义如下: ADT Graph{ 数据对象V:具有相同特性的数据元素的集合,称为顶点集. 数据关系R:R={VR} VR={<v,w>|<v,w>| v,w?V∧p(v,w) ,<v,w>表示 从v到w的弧,P(v,w)定义了弧<v,w>的信息 } 基本操作P: Create_Graph() : 图的创建操作. 初始条件:无. 操作结果:生成一个没有顶点的空图

数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历

图有四种存储结构:数组,邻接表,十字链表,邻接多重表.下面以数组为存储结构来实现图的深度优先搜索遍历和广度优先搜索遍历.其中广度优先搜索遍历中有用到STL中的queue,注意头文件的包含.具体代码如下: //图的数组(邻接矩阵)存储表示和深度优先遍历 const int MAX_VERTEX_NUM=20; //最大顶点数 typedef enum {DG,DN,UDG,UDN} GraphKind ;//(有向图,有向网,无向图,无向网) typedef int VRType; typedef

数据结构--图--最小生成树(Prim算法)

构造连通网的最小生成树,就是使生成树的边的权值之和最小化.常用的有Prim和Kruskal算法.先看Prim算法:假设N={V,{E}}是连通网,TE是N上最小生成树中边的集合.算法从U={u0}(uo属于V),TE={}开始,重复执行下述操作:在所有u属于U,v属于V-U的边(u,v)属于E中找到代价最小的一条边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止.此时TE中必有n-1条边,T={V,{TE}}为N的最小生成树.为实现此算法,需另设一个辅助数组closedge,以记录从U

?数据结构-图之强连通

数据结构-图之强连通 在一个无向图G中,若从顶点v_i到顶点v_j有路径相连(当然从v_j到v_i也一定有路径),则称v_i和v_j是连通的.如果G是有向图,那么连接v_i和v_j的路径中所有的边都必须同向.如果图中任意两点都是连通的,那么图被称作连通图.图的连通性是图的基本性质. 连通分量:无向图G的一个极大连通子图称为G的一个连通分量(或连通分支).连通图只有一个连通分量,即其自身:非连通的无向图有多个连通分量. 初级通路:通路中所有的顶点互不相同.初级通路必为简单通路,但反之不真. 强连通

数据结构-图

1.图的定义 图:是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或者联系.对象由顶点表示,而对象之间的关系或关联则通过顶点之间的边来表示. 2.图的应用 图算法.统计网络跳数.拓扑排序.图着色.哈密顿圈问题.分团问题.可序列化冲突 3.图的代码实现 /*graph.h*/ #ifndef GRAPH_H #define GRAPH_H #include <stdlib.h> #include "list.h" #include "set.h"

数据结构--图 的JAVA实现(下)

在上一篇文章中记录了如何实现图的邻接表.本文借助上一篇文章实现的邻接表来表示一个有向无环图. 1,概述 图的实现与邻接表的实现最大的不同就是,图的实现需要定义一个数据结构来存储所有的顶点以及能够对图进行什么操作,而邻接表的实现重点关注的图中顶点的实现,即怎么定义JAVA类来表示顶点,以及能够对顶点进行什么操作. 为了存储图中所有的顶点,定义了一个Map<key, value>,实际实现为LinkedHashMap<T, VertexInterface<T>>,key 为

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若