图的建立与遍历实验报告

  • 格式:doc
  • 大小:38.50 KB
  • 文档页数:7

下载文档原格式

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

图的建立与遍历实验报告

------------图的建立与遍历

姓名:曹庆松

班级:1104

学号:1111611512

实验日期:2012.10.15

报告撰写日期:2012.10.16

一、实验目的:

1、熟悉图的概念、存储结构和遍历方法。

2、以邻接表为存储结构,掌握无向图的基本操作和实现方法。

3、以邻接表为存储结构,掌握无向图的深度优先遍历的算法实

现。

二、实验内容:

以邻接表为存储结构,编写程序实现。

1、要求通过键盘输入图的顶点,以及每一条边的两个顶点从而建

立无向。为了简化实验,顶点用数字表示。

2、在以上实验的基础上,实现无向图的深度优先遍历算法。要求

以用户给定的顶点为起始点,显示深度优先遍历的次序。三、程序代码及结果展示:

#include "stdafx.h"

#include

#include

#include

#define MAX_VERTER_NUM 20

typedef struct ArcNode

{ //表节点

int adjvex; //邻接点

struct ArcNode *nextarc; //指向下一条弧的指针

}ArcNode;

typedef struct VNode

{ //头结点

int data; //定点信息

ArcNode * firstarc; //指向第一个依附该顶点的弧的指针

}VNode,AdjList[MAX_VERTER_NUM];

typedef struct

{ //图

AdjList vertices; //顶

int vexnum,arcnum;//图的顶点数和弧数

int Kind;// 图的种类标志

}ALGraph;// 对图 G 作深度优先遍历

int LocateVex(ALGraph * G,int v) //寻找节点V的位置 { int k,n;

for(k=0;kvexnum;k++)

{ if(G->vertices[k].data==v)

{

n=k;

break;

}

}

return n;

}

int n=1;

int visited[MAX_VERTER_NUM]; void DFS(ALGraph *G,int v)//递归调用{

ArcNode *p;

>vertices[v].firstarc; p=G-

if(nvexnum+1)

{

printf(" V%d ",G->vertices[v].data);

n++;

}

visited[v]=1;

while(p)

{

if(!visited[p->adjvex])

DFS(G,p->adjvex);

p=p->nextarc;

}

}

void DFSVisited(ALGraph * G)//深度遍历

{

int v;

int n;

printf("请输入遍历的起始的顶点:");

scanf("%d",&n);

n"); printf("递归深度优先遍历点顺序: \

DFS(G,n-1);

for(v=0;vvexnum;v++)

visited[v]=0;

for(v=0;vvexnum;v++)

if(!visited[v])

DFS(G,v);

}

void Insertadj(ALGraph * G,int i,int j) //插入邻接点的下标 { ArcNode *a1,*a2;

a1=(ArcNode *)malloc(sizeof(ArcNode));

a1->adjvex=j;a1->nextarc=NULL;

if(G->vertices[i].firstarc==NULL)

{

G->vertices[i].firstarc=a1;

}

else

{

a2=G->vertices[i].firstarc;

while(a2->nextarc)

{

a2=a2->nextarc;

}

a2->nextarc=a1;

}

}

void Init_ALGraph(ALGraph * G) //初始化图并建图 { int v,v1,v2,i,j,q,p;

int m=0;

printf("请输入顶点数:");

scanf("%d",&G->vexnum);

printf("请输入边数:");

scanf("%d",&G->arcnum);

for(v=0;vvexnum;v++)

{

printf("顶点 V%d:",(v+1));

scanf("%d",&(G->vertices[v].data));

>vertices[v].firstarc=NULL; G-

}

for(v=0;varcnum;v++) {

printf("请输入点点: ");

scanf("%d%d",&v1,&v2);

i=LocateVex(G,v1); //v1的位置

j=LocateVex(G,v2); //v2的位置