您的当前位置:首页正文

实验4 图的基本操作

2020-03-07 来源:年旅网
实验4 图的基本操作

实验目的

1. 掌握图的各种存储结构,特别要熟练掌握邻接矩阵和邻接表存储结构。

2.遍历是图各种应用的算法的基础,要熟练掌握图的深度优先遍历和广度优先遍历算

法,复习栈和队列的应用。

实验内容

程序1

/* 定义邻接矩阵类型 */

typedef int adjmatrix[n+1][n+1];

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

void CreatMatrix(adjmatrix GA)

/* 从初始点v出发深度优先遍历邻接矩阵GA表示的图 */ void DfsMatrix(adjmatrix GA,int v)

/*从初始点v出发广度优先遍历邻接矩阵GA表示的图*/ void BfsMatrix(adjmatrix GA,int v)

程序2

/* 邻接表的结点类型 */ typedef struct arc {int adjvex;

struct arc *next;}ArcNode; typedef struct VexNode {int vertex;

ArcNode *firstarc; }VerNode;

typedef VerNode AdjList[MAXNODE];

/* 建立图的邻接表 */

void CreatAdjlist(AdjList GL)

/* 从初始点v出发深度优先遍历邻接表GL表示的图 */ void DfsAdjlist(AdjList GL,int v)

/*从初始点v出发广度优先遍历邻接表GL表示的图*/ void BfsAdjlist(AdjList GL,int v)

参考源程序

程序一:以邻接表为存储结构时的遍历算法实现

#define MAXNODE 10 #define NULL 0

typedef struct arc {int adjvex;

struct arc *next;}ArcNode;

typedef struct VexNode {int vertex;

ArcNode *firstarc; }VerNode;

typedef VerNode AdjList[MAXNODE];

int visited[MAXNODE]; int vexnum,arcnum;

void creatgraph(AdjList GL) {int i,j,k;

ArcNode *p;

printf(\"请输入顶点个数和边的个数:\"); scanf(\"%d%d\

printf(\"请输入顶点(顶点用整型数代表):\\n\"); for(i=1;i<=vexnum;i++)

{scanf(\"%d\ GL[i].firstarc=NULL; }

printf(\"请输入图的所有边(一条边的两个端点中间用,分隔): , \\n\"); for(k=1;k<=arcnum;k++) {scanf(\"%d,%d\ if(i&&j) {p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=j;p->next=GL[i].firstarc;GL[i].firstarc=p; p=(ArcNode*)malloc(sizeof(ArcNode)); p->adjvex=i;p->next=GL[j].firstarc; GL[j].firstarc=p; } } }

void DfsAdjlist(AdjList GL,int v) {int i;

for(i=1;i<=vexnum;i++) visited[i]=0; if(!visited[v]) dfs(GL,v); }

int dfs(AdjList G,int v) {ArcNode *q;

if(!visited[v]) printf(\"%d,\ visited[v]=1; q=G[v].firstarc;

while(q!=NULL)

{if(!visited[q->adjvex]) dfs(G,q->adjvex); q=q->next; } }

int BfsAdjlist(AdjList GL,int v)

{int k,i,j,Q[MAXNODE],front=0,rear=0; ArcNode *p;

for(i=1;i<=vexnum;i++) visited[i]=0; visited[v]=1;

printf(\"%d \ rear=(rear+1)%MAXNODE; Q[rear]=v;

while(front!=rear) {front=(front+1)%MAXNODE; k=Q[front]; p=GL[k].firstarc; while(p!=NULL) {if(!visited[p->adjvex]) {visited[p->adjvex]=1; printf(\"%d \ rear=(rear+1)%MAXNODE; Q[rear]=p->adjvex; } p=p->next; } } }

main()

{AdjList GL; int v;

creatgraph(GL);

printf(\"请输入深度优先遍历的开始结点:\"); scanf(\"%d\

printf(\"深度优先遍历序列是:\"); DfsAdjlist(GL,v); printf(\"\\n\");

printf(\"请输入广度优先遍历的开始结点:\"); scanf(\"%d\

printf(\"广度优先遍历序列是:\"); BfsAdjlist(GL,v); }

程序二:以邻接矩阵为存储结构时的遍历算法实现

#define n 5

#define MAXSIZE 10 /*广度优先遍历时所使用的队列的最大容量*/ #define MaxNum 10000 /*定义一个最大数*/

/* 定义邻接矩阵类型 */

typedef int adjmatrix[n+1][n+1]; /* 0号单元没用*/

int visited[n+1]; /* 0号单元没用*/ int arcnum; /*边的个数*/

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

void CreatMatrix(adjmatrix GA) {int i,j,k;

printf(\"图中有%d个顶点\\n\ for(i=1;i<=n;i++) for(j=1;j<=n;j++)

if(i==j) GA[i][j]=0; /*对角线的值置为0*/

else GA[i][j]=MaxNum; /*其它位置的值初始化为一个最大数*/ printf(\"请输入边的个数(限制在1到10的范围内):\"); scanf(\"%d\

printf(\"请输入图的所有边(一条边的两个端点中间用,分隔): , \\n\"); for(k=1;k<=arcnum;k++)

{scanf(\"%d,%d\ /*读入边的信息*/ GA[i][j]=1; GA[j][i]=1; } }

/* 从初始点v出发深度优先搜索邻接矩阵GA表示的图 */ void DfsMatrix(adjmatrix GA,int v) {int j;

visited[v]=1; printf(\"%d,\ for(j=1;j<=n;j++)

if(v!=j&&GA[v][j]!=MaxNum&&!visited[j]) DfsMatrix(GA,j); }

void BfsMatrix(adjmatrix GA,int v) {int i,k,j,Q[MAXSIZE],front=0,rear=0; for(i=1;i<=n;i++) visited[i]=0;

visited[v]=1; printf(\"%d \

rear=(rear+1)%MAXSIZE; /*开始遍历的顶点入队列*/ Q[rear]=v;

while(front!=rear)

{front=(front+1)%MAXSIZE; /*队头元素出队*/ k=Q[front];

for(j=1;j<=n;j++)

if((!visited[j])&&(GA[k][j]==1)) /*访问与队头元素邻接的还未被访问的结点*/ {visited[j]=1; printf(\"%d \ rear=(rear+1)%MAXSIZE; Q[rear]=j; } } }

main()

{adjmatrix GA; int v;

CreatMatrix(GA);

printf(\"请输入深度优先遍历的开始结点:\"); scanf(\"%d\

printf(\"深度优先遍历序列是:\"); DfsMatrix(GA,v); printf(\"\\n\");

printf(\"请输入广度优先遍历的开始结点:\"); scanf(\"%d\

printf(\"广度优先遍历序列是:\"); BfsMatrix(GA,v); }

因篇幅问题不能全部显示,请点此查看更多更全内容