建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历

2026/1/24 10:44:59

#include \#include \#include \#include \

typedef enum {FALSE, TRUE} BOOLEAN; #define OVERFLOW -1 #define OK 1 #define ERROR 0

#define INFINITY INT_MAX /* 最大值∞ */ /* 根据图的权值类型,分别定义为最大整数或实数 */ #define MAX_VERTEX_NUM 20 /* 最大顶点数目 */ typedef enum {DG, DN, UDG,UDN} GraphKind ; /* {有向图,有向网,无向图,无向网} */

BOOLEAN Visited[MAX_VERTEX_NUM]; BOOLEAN visited[MAX_VERTEX_NUM];

#define VEX_NUM 20 #define MAXSIZE 50 typedef char Vextype; typedef int ElemType; typedef int Status;

////////////////////////////// 邻接矩阵结构定义 typedef struct {

Vextype vexs[VEX_NUM];

int adj[VEX_NUM][VEX_NUM]; /*邻接矩阵*/ int n,e; /*顶点数和边数*/

}Mgraph;

////////////////////////////// 邻接表结构定义

typedef struct node { /*边结点*/

int adjvex; /*邻接点域*/

struct node * nextarc; /*指向下一个边结点的指针域*/

} EdgeNode;

typedef struct vnode { //顶点结构,2个域,结点信息和第一个邻接点

Vextype vertex; EdgeNode *firstedge;

}VertexNode;

typedef struct { //图结构

VertexNode adjlist[MAXSIZE]; int n,e;

} ALGraph; ////

int FirstAdjVex(ALGraph G,int v)

{//在图G中寻找第v个顶点的第一个邻接顶点 if(!G.adjlist[v].firstedge) return -1; else return(G.adjlist[v].firstedge->adjvex); }

int NextAdjVex(ALGraph G,int v,int w)

{//在图G中寻找第v个顶点的相对于w的下一个邻接顶点 EdgeNode *p;

int vi;

p=G.adjlist[v].firstedge; if(!p) return -1;

while(p->adjvex!=w) p=p->nextarc; //在顶点v的弧链中找到顶点w

p=p->nextarc;

if(!p) return -1; //若已是最后一个顶点,返回-1 else {

vi=p->adjvex; } ////

void CreateMGraph(Mgraph *G) { int i,j,k; // char ch;

printf(\请输入顶点数和边数:\\n\

scanf(\输入*/ printf(\请输入顶点信息:\\n\ for (i=0;in;i++)

scanf(\ }

return vi; //返回下一个邻接顶点的序号

for (i=0;in;i++)

for (j=0;jn;j++)

G->adj[i][j]=0; /*初始化邻接矩阵*/

printf(\输入每条边对应的两个顶点的序号:\\n\ for (k=0;ke;k++) {

scanf(\输入e条边*/ G->adj[i][j]=1;

G->adj[j][i]=1; /*对称加入,无向图的邻接矩阵存储建立*/

}

}/*CreateMGraph*/

void CreateALGraph(ALGraph *G) { /*建立无向图的邻接表存储*/

int i,j,k; char vi; EdgeNode *s;

printf(\请输入顶点数和边数:\\n\

scanf(\

printf(\请输入顶点信息Vi\\n例如a,每输入一个顶点后回车:\\n\

for (i=0;in;i++) {

scanf(\G->adjlist[i].vertex=vi; G->adjlist[i].firstedge=NULL;

}

printf(\顶点:\

for (i=0;in;i++)

printf(\

printf(\请输入边的信息(vi,vj)\\n例如:1,2:\\n\for (k=0;ke;k++) { /*建立边表*/

scanf(\在头结点和边结点之间插入新的边结点 s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j-1; s->nextarc=G->adjlist[i-1].firstedge; G->adjlist[i-1].firstedge=s;

s=(EdgeNode*)malloc(sizeof(EdgeNode));


建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历.doc 将本文的Word文档下载到电脑
搜索更多关于: 建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219