建立图的邻接矩阵或邻接表存储并在此基础知识上实现图的深度和广度优先遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "stdafx.h"
#include "conio.h"
#include "stdio.h"
#include "stdlib.h"
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;
return vi; //返回下一个邻接顶点的序号
}
}
////
void CreateMGraph(Mgraph *G) {
int i,j,k; // char ch;
printf("请输入顶点数和边数:\n");
scanf("%d,%d",&(G->n),&(G->e)); /*输入*/
printf("请输入顶点信息:\n");
for (i=0;i
scanf("%s",&(G->vexs[i]));
for (i=0;i
for (j=0;j
G->adj[i][j]=0; /*初始化邻接矩阵*/
printf("输入每条边对应的两个顶点的序号:\n");
for (k=0;k
scanf("%d,%d",&i,&j); /*输入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("%d,%d",&(G->n),&(G->e));
printf("请输入顶点信息Vi\n例如a,每输入一个顶点后回车:\n");
for (i=0;i
scanf("%s",&vi);
G->adjlist[i].vertex=vi;
G->adjlist[i].firstedge=NULL;
}
printf("顶点:");
for (i=0;i
printf("%c(%d)-",G->adjlist[i].vertex,i+1);
printf("\n请输入边的信息(vi,vj)\n例如:1,2:\n");
for (k=0;k
scanf("%d,%d",&i,&j); //在头结点和边结点之间插入新的边结点
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));