代码参照了严蔚敏、吴伟民编写的数据结构(C语言版)。
部分内容参考了这位大佬:

https://blog.csdn.net/jeffleo/article/details/53326648

所有代码采用C语言编写。讲解请查看注释。

头文件及宏定义

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define INFINITY 0//最大值0,即两个顶点之间没有弧时的权值
#define MAX_VERTEX_NUM 20//最大顶点个数#define OK 1
#define Fail 0
#define False 0
#define True 1
#define Error 0;

typedef定义数据类型和结构体

typedef int VRType;
typedef int Status;
typedef char InfoType;
typedef char VertexType;typedef enum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网}
typedef struct ArcCell{VRType adj;//VRType是顶点关系类型。对无权图,用1和0表示相邻否;对带权图,则为权值类型InfoType *info;//该弧相关信息的指针
} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{VertexType vexs[MAX_VERTEX_NUM];//顶点向量 AdjMatrix arcs;//邻接矩阵 int vexnum,arcnum;//图的当前顶点数和弧数 GraphKind kind;//图的种类标志
}MGraph;

LocateVex

Status LocateVex(MGraph G, VertexType u){//找出顶点u在顶点数组vexs中的次序int i=0; for (i=0; i<G.vexnum; i++){if (G.vexs[i]==u)return i;}return False;
}

CreateGraph

Status CreateGraph(MGraph *G){//构造无向有权图 int i=0,j=0,k=0,w=0;printf("请输入图的顶点个数和弧数\n");fflush(stdin);scanf("%d",&G->vexnum);fflush(stdin);scanf("%d",&G->arcnum);printf("请输入所有顶点\n");for(i=0;i<G->vexnum;i++){fflush(stdin);//清空输入缓存区,否则会将上次输入结束后的回车符当成一个字符存入。下面同理 scanf("%c",&G->vexs[i]);//将所有的顶点读入数组vexs中进行存储 }for(i=0;i<G->vexnum;i++){//进行初始化,赋初值 for(j=0;j<G->vexnum;j++) {G->arcs[i][j].adj=INFINITY;G->arcs[i][j].info=NULL;}}char v1,v2;printf("请输入弧的两个顶点和权值\n");for(k=0;k<G->arcnum;k++){//对矩阵进行赋值 fflush(stdin);scanf("%c%c%d",&v1,&v2,&w);i=LocateVex(*G,v1);j=LocateVex(*G,v2);G->arcs[i][j].adj=w;//不输入信息,没有.info G->arcs[j][i].adj=w;//对称 }G->kind=UDN;return OK;
} 

Display

void Display(MGraph G)//打印矩阵
{int i=0,j=0; for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){printf("%d ", G.arcs[i][j].adj);if ((j + 1) % G.vexnum == 0)printf("\n");}
}

Destory

Status Destory(MGraph *G){//销毁图 int i=0,j=0;for(i=0;i<G->vexnum;i++){for(j=0;j<G->vexnum;j++) {G->arcs[i][j].adj=INFINITY;G->arcs[i][j].info=NULL;}}G->vexnum=0;G->arcnum=0;
}

GetVex

Status GetVex(MGraph G,VertexType  v){//返回图中顶点的值 int i=0; for (i=0; i<G.vexnum; i++){if (G.vexs[i]==v)return i;}    return False;
}

PutVex

Status PutVex(MGraph *G,VertexType  v,VertexType  value){//将图中的顶点v改为顶点value int i=0; for (i=0; i<G->vexnum; i++){if (G->vexs[i]==v)G->vexs[i]=value;return OK;}return False;
}

FirstAdjVex

Status FirstAdjVex(MGraph G,VertexType  v){//找出v的下一个邻接顶点 int i=0,j=0;i=LocateVex(G,v);for(j=0;j<G.vexnum;j++){if(G.arcs[i][j].adj!=INFINITY){//从头开始在存储顶点的数组寻找下一个v的邻接顶点return j;    }}return Fail;
}

NextAdjVex

Status NextAdjVex(MGraph G,VertexType v,VertexType w){//找出v相对于w的下一个邻接顶点 int i=0,j=0,n=0;i=LocateVex(G,v);j=LocateVex(G,w);for(n=j+1;n<G.vexnum;n++){//从w的位置开始在存储顶点的数组寻找下一个v的邻接顶点 if(G.arcs[i][n].adj!=INFINITY){return n;   }}return Fail;
}

InsertVex

Status InsertVex(MGraph *G,VertexType v){//插入顶点v int i=0;G->vexnum++;//更改存储顶点的数组 G->vexs[G->vexnum-1]=v;//更改矩阵for(i=0;i<G->vexnum;i++){//为矩阵最外层行、列的元素赋初始值 G->arcs[G->vexnum-1][i].adj=0;G->arcs[G->vexnum-1][i].info=NULL;G->arcs[i][G->vexnum-1].adj=0;G->arcs[i][G->vexnum-1].info=NULL;}return OK;
}

DeleteVex

Status DeleteVex(MGraph *G,VertexType v){//删除顶点v int i=0,j=0,temp=0;i=LocateVex(*G,v);temp=i;//更改存储顶点的数组 for(temp;temp<G->vexnum;temp++){G->vexs[temp]=G->vexs[temp+1];//存储顶点的数组中向前移一位,覆盖要删除的顶点 }G->vexnum--;//更改矩阵for(j=0;j<G->vexnum+1;j++){//使矩阵中靠后位置的顶点前移,覆盖被删除的顶点for(i;i<G->vexnum+1;i++){G->arcs[j][i]=G->arcs[j][i+1];G->arcs[i][j]=G->arcs[i+1][j];}}for(i=0;i<G->vexnum;i++){//上一步前移完成后矩阵的最外层的行、列的数据应被清除 G->arcs[G->vexnum][i].adj=0;G->arcs[G->vexnum][i].info=NULL;G->arcs[i][G->vexnum].adj=0;G->arcs[i][G->vexnum].info=NULL;} return OK;
}

InsertArc

Status InsertArc(MGraph *G,VertexType v,VertexType w,VRType value){//增加顶点v和w之间的弧,权值为value int i=0,j=0;i=LocateVex(*G,v);j=LocateVex(*G,w);G->arcs[i][j].adj=value;G->arcs[i][j].info=NULL;G->arcs[j][i].adj=value;G->arcs[j][i].info=NULL;return OK;
}

DeleteArc

Status DeleteArc(MGraph *G,VertexType v,VertexType w){//删除顶点v和w之间的弧int i=0,j=0;i=LocateVex(*G,v);j=LocateVex(*G,w);G->arcs[i][j].adj=INFINITY;G->arcs[i][j].info=NULL;G->arcs[j][i].adj=INFINITY;G->arcs[j][i].info=NULL;return OK;
}

定义全局变量

int visited[MAX_VERTEX_NUM];//在DFS和BFS中用到

DFS

void DFS(MGraph G,int n){//从第n个顶点出发深度优先遍历图G int i;printf("%c", G.vexs[n]);visited[n]=True;for(i=0;i<G.vexnum;i++){if(G.arcs[n][i].adj!=INFINITY&&visited[i]==False) DFS(G,i);}
}

DFSTraverse

void DFSTraverse(MGraph G){//对图G进行深度优先遍历int i=0,n=0;for(i=0;i<G.vexnum;i++) visited[i]=False; //初始化标志数组 for(n=0;n<G.vexnum;n++){//因为图可能是非联通图,递归访问下一个顶点时可能会中断,因此需要从每一个顶点开始做深度优先遍历if(visited[n]==False)//判断是否被访问过,未被访问过时访问 DFS(G,n);}
}

BFS

void BFS(MGraph G,int n){//从第n个顶点出发广度优先遍历图Gint que[MAX_VERTEX_NUM],front=0,rear=0;int i=0,w=0; printf("%c", G.vexs[n]);visited[n]=True;//访问 rear=(rear+1)%MAX_VERTEX_NUM;//入队 que[rear]=n;while(front!=rear){//队列不空时 front=(front+1)%MAX_VERTEX_NUM;//出队 i=que[front];for(w=FirstAdjVex(G,G.vexs[i]);w!=Fail;w=NextAdjVex(G,G.vexs[i],G.vexs[w])){if(visited[w]==False){visited[w]=True;printf("%c", G.vexs[w]);//访问 rear=(rear+1)%MAX_VERTEX_NUM;//入队 que[rear]=w;}}}
}

BFSTraverse

void BFSTraverse(MGraph G){//对图G进行广度优先遍历int i=0,n=0;for(i=0;i<G.vexnum;i++) visited[i]=False; //初始化标志数组 for(n=0;n<G.vexnum;n++){//因为图可能是非联通图,递归访问下一个顶点时可能会中断,因此需要从每一个顶点开始做深度优先遍历if(visited[n]==False)//判断是否被访问过,未被访问过时访问 BFS(G,n);}
} 

输入样例

很多函数被我注释掉了,需要使用的话自行取消注释。

int main(void){MGraph G;CreateGraph(&G);//Destory(&G);Display(G);//GetVex(G,'a');//FirstAdjVex(G,'c');//NextAdjVex(G,'b','c');//InsertArc(&G,'d','e',9);//DeleteArc(&G,'d','e'); //Display(G);printf("DFS:\n");DFSTraverse(G); printf("\nBFS:\n");BFSTraverse(G);
}

输入:

5
6
a
b
c
d
e
ab1
ad2
bc3
be4
cd5
ce6

输出结果

C语言 数据结构 图的邻接矩阵存储 基本操作(附输入样例和讲解)相关推荐

  1. c语言邻接表的构建_c语言数据结构--图的邻接矩阵和邻接表操作的基本操作

    #include #include #include #define MAX 100 typedef char DataType; typedef int VectorRelationType; ty ...

  2. 20.0、C语言数据结构——图的存储结构

    20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...

  3. C语言利用图的邻接矩阵的存储方式实现拓扑排序

    C语言利用图的邻接矩阵的存储方式实现拓扑排序 在拓扑排序中,我们的对象是有向无环图,这种图是描述工程进行过程的有效工具.比如"课程开课顺序,施工进程,软件开发进程",我们在使用有向 ...

  4. 图的邻接矩阵存储及遍历操作

    第1关:图的邻接矩阵存储及求邻接点操作 任务描述 本关任务:要求从文件输入顶点和边数据,包括顶点信息.边.权值等,编写程序实现以下功能. 1)构造无向网G的邻接矩阵和顶点集,即图的存储结构为邻接矩阵. ...

  5. 图的邻接矩阵存储(简单代码实现)

    说起来邻接矩阵,对于学过线性代数的同学理解起来非常简单 其实就是一个数字组成方阵,每一个数字都能有有意义的代表一些信息. 下面来看一个例子 如上图所示的图,使用邻接矩阵存储的话应该是下面的情况 由此可 ...

  6. 图的遍历(C语言,邻接表存储的图 - DFS,邻接矩阵存储的图 - BFS)

    邻接表存储的图 - DFS /* 邻接表存储的图 - DFS */void Visit( Vertex V ) {printf("正在访问顶点%d\n", V); }/* Visi ...

  7. 图的邻接矩阵存储和邻接表存储定义方法

    一.邻接矩阵 #include <iostream> using namespace std; #define MaxVertexNum 100 //顶点最大数目//邻接矩阵存储结构 ty ...

  8. 数据结构——图的邻接矩阵实现

    图的邻接矩阵是用两个数组来表示图 一个一维数组vexs[MAXVER];用来存储顶点元素 一个二维数组arc[MAXVER][MAXVER];用来存储图的边或者弧度以及证明其存在 无向图的的二维数组 ...

  9. 图的邻接矩阵存储及遍历

    图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图.一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息. 设图G有n个顶点,则邻接矩阵是一个n ...

最新文章

  1. 数据科学中的6个基本算法,掌握它们要学习哪些知识
  2. linux下安装nagios
  3. 卷积神经网络补充—GoogleNet
  4. SAP系统里的订单,可以随便删除么?
  5. 算法训练营 重编码_编码训练营适合您吗?
  6. 任正非表示支持小女儿姚安娜搞文艺
  7. 数据库中union和union all的区别
  8. Go 源码学习之--net/http
  9. linux联网是否,Linux命令 查看Linux版本和是否联网
  10. CentOS7 网络管理与配置
  11. 智能推荐系统开发中的十大要素
  12. win10亮度调节变为灰色无法调节
  13. Windows无法连接到打印机怎么办?快收藏这些正确做法!
  14. 【Python深度学习之路】-3.2PR曲线
  15. Intellij IDEA如何修改文件的打开方式,创建文件添加后缀名无效!始终默认text文件打开
  16. 强化学习中的递归神经网络
  17. 做毕设途中遇到了问题,求大神指教。
  18. 模板列中不自动换行的解决方案
  19. 记录一次Oo0代码混淆实现方法
  20. Solarflare网卡开发:openonload 安装与调试

热门文章

  1. 关于在写代码时如何使用绝对路径与相对路径及其简单介绍
  2. 错过必定后悔的干货!深入解析大数据行业的集群架构方案
  3. 宋晓丽20190919-3 效能分析
  4. 小马2K3PE永久珍藏版|
  5. COOX平台(SCADA MES)
  6. 最新日志审计系统——EventLog Analyzer
  7. easyExcel 导入Excel数据
  8. Angular4_使用枚举
  9. 使用vue+zrender绘制体温单 三测单(1)
  10. 音乐制作中计算机编程,计算机音乐制作技术在音乐创作的应用