采用邻接矩阵完成无向图的“建立、深度遍历、广度遍历”操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* 采用邻接矩阵完成无向图的“建立、深度遍历、广度遍历”操作 */

#include "stdio.h"

#include "string.h"

#define TRUE 1

#define FALSE 0

#define OVERFLOW -2

#define OK 1

#define ERROR 0

typedef int Status;

#define INFINITY INT_MAX /*最大值“无穷”*/

#define MAX_VERTEX_NUM 20 /*最大顶点个数*/

typedef int Boolean;

typedef char VertexType[20];

typedef int VRType;

/**************以下为队列的操作************/

/****队列的类型定义****/

typedef int QElemType;

typedef struct QNode

{QElemType data;

struct QNode *next;

} QNode, *QueuePtr;

typedef struct

{

QueuePtr front;

QueuePtr rear;

} LinkQueue;

/****初始化队列****/

Status InitQueue(LinkQueue *Q)

{ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));

if (!(*Q).front) exit(OVERFLOW);

(*Q).front->next=NULL;

return OK; }

/****判断队列是否为空****/

Status QueueEmpty (LinkQueue Q)

{ if (Q.front==Q.rear)

return TRUE;

else

return FALSE; }

/****入队列****/

Status EnQueue(LinkQueue *Q, QElemType e)

{ QueuePtr p;

p=(QueuePtr)malloc(sizeof(QNode));

if (!p) exit(OVERFLOW);

p->data=e; p->next=NULL;

(*Q).rear->next=p;

(*Q).rear=p;

return OK; }

/****出队列****/

Status DeQueue(LinkQueue *Q, QElemType *e)

{ QueuePtr p;

if ((*Q).front==(*Q).rear) return ERROR;

p=(*Q).front->next;

*e=p->data;

(*Q).front->next=p->next;

if ((*Q).rear==p) (*Q).rear=(*Q).front;

free(p);

return OK; }

/**************以下为图的操作************/

/*图的类型定义*/

typedef struct ArcCell

{ VRType adj; /*图中有1/0表示是否有边,网中表示边上的权值*/ /* InfoType *info; 与边相关的信息*/

} ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{ VertexType vexs[MAX_VERTEX_NUM]; /*顶点向量*/

AdjMatrix arcs; /*邻接矩阵*/

int vexnum,arcnum; /*图中当前顶点数和边数*/

} MGraph;

/*建立无向图的邻接矩阵*/

void CreateGraph(MGraph *G)

{ int i,j,k; VertexType v1,v2;

printf("\nInput MG vexnum,arcnum:");

scanf("%d,%d",&(*G).vexnum,&(*G).arcnum);

printf("Input %d vexs:",(*G).vexnum);

for(i=0;i<(*G).vexnum;i++) /*输入顶点向量*/ { scanf("%s",(*G).vexs[i]); }

printf("vexs list\n");

for(i=0;ivexnum;i++) /*输出顶点向量*/

puts(G->vexs[i]);

for(i=0;i<(*G).vexnum;i++) /*邻接矩阵初始化*/ for(j=0;j<(*G).vexnum;j++)

(*G).arcs[i][j].adj=0;

printf("\nInput %d arcs(vi vj):\n",(*G).arcnum); for(k=0;k<(*G).arcnum;k++) /*输入无权图的边*/ { scanf("%s%s",v1,v2);

i=LocateVex(*G,v1); j=LocateVex(*G,v2);

(*G).arcs[i][j].adj=1;

(*G).arcs[j][i]=(*G).arcs[i][j];

}

}

/* 顶点在顶点向量中的定位*/

int LocateVex(MGraph G,VertexType v)

{ int i;

for(i=0;i

if (strcmp(v,G.vexs[i])==0) break;

return i;

}

/* 查找第1个邻接点 */

int FirstAdjVex(MGraph G,int v)

{ int j,p=-1;

for(j=0;j

if (G.arcs[v][j].adj==1) {p=j; break;}

return p;

}

/* 查找下一个邻接点 */

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

{ int j,p=-1;

for(j=w+1;j

if (G.arcs[v][j].adj==1) {p=j; break;}

return p;

}

/*按邻接矩阵方式输出无向图*/

相关文档
最新文档