数据结构实验—图的建立与遍历

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

实验十图的建立与遍历

1.实验目的

(1)掌握图的含义。

(2)掌握用邻接矩阵和邻接链表的方法描述图的存储结构。

(3)理解并掌握深度优先遍历方法和广度优先遍历方法的存储结构。2.实验内容

(1)建立无向图的邻接矩阵,并实现插入、删除边的功能。

(2)建立有向图的邻接表,并实现插入、删除边的功能。

(3)实现该图的深度优先遍历与广度优先遍历。

3.实验要求

(1)根据实验内容编写程序,上机调试并获得运行结果

(2)撰写实验报告

4.准备工作

本次实验将建立如图所示有向图和无向图,并会根据此进行插入,删除,遍历操作

5.关键操作与算法

(1)建立邻接矩阵

算法思想;

建立邻接矩阵即用一维数存储图中的顶点信息,用二维数组(矩阵)存储图中各顶点之间的邻接关系。假设图G(V,E)有n个确定的顶点,即V={V,V,…,Vn-1},则表示G 中各顶点相邻关系的是一个n*n的矩阵,矩阵的元素值为

若G是带权图(网),则邻接矩阵可定义为

其中,w表示边(v,v)或<v,V>上的权值;∞表示一个计算机允许的、大于所有边上权值的数,代表此路不通;若v1=v1,则A[i][j]的值取0。

算法如下;

1.void CreateMGragh(GraphMatrix *g)

2.{

3.int i, j, k, t;

4.float w;//权值

5. printf("请输入无向网的顶点个数(不超过%d个): ",MAXVEX);

6. scanf("%d",&g->vexNum);

7. printf("\n请输入各顶点信息: \n");

8. getchar();//吞掉上一步的回车

9.for(i = 0; i < g->vexNum; i++)

10. gets(g->vexs[i]);//输入各个顶点信息

11.for (i = 0; i < g->vexNum; i++)

12.for (j = 0; j < g->vexNum; j++)

13. {

14. g->arcs[i][j] = 0;//初始化邻接矩阵

15. }

16. printf("\n");

17. printf("请输入图的边数(不超过%d

个): ",(g->vexNum * (g->vexNum - 1))/2);

18. scanf("%d",&k); //边的数目,这里的后面不用加getchar(),因为后面的一个输入的

是一个整型类型

19.for(t = 0; t < k; t++)

20. {

21. printf("\n请输入第%d条边的相关信息(起始顶点(序号从0开始) 终止顶点权值,

如0 3 10.3)\n",t + 1);

22. scanf("%d%d%f",&i,&j,&w);

23. g->arcs[i][j] = w; //无向网的权是对称的

24. g->arcs[j][i] = w;

25. }

26.}

(2)创建邻接表

算法步骤;

邻接表(Adjacency List)是图的另一种存储方式,它是一种将顺序存储与链式存储相合的存储方法。该方法是为图中每个顶点都建立一个单链表,即对于图G中的每个顶点v,将v1的所有邻接点v都链在一个单链表里,该单链表称为顶点v1的邻接表(链式存储构),再将所有顶点的邻接表表头集中放到一个一维数组(顺序存储结构)中,两者一起就成了图的邻接表结构。

算法如下;

1.void CreateALGragh(GraphList *g)

2.{

3.int i,j,k;

4. EdgeNode *s;

5.float w;

6. printf("请输入有向网的顶点个数,(不超过%d个): ",MAXVEX);

7. scanf("%d",&g->VexNum);

8. printf("请输入各个顶点的信息:\n");

9. getchar();

10.for(i = 0; i VexNum; i++)

11. {

12. gets(g->vexs[i].vertex);

13. g->vexs[i].firstarc = NULL;//这里vex[i].firstarc的点是因为vex[i]为结

构体,所以引用它其中的内容使需要用"."运算符

14. }

15. printf("\n");

16. printf("请输入图的边数(不超过%d个): ",g->VexNum * (g->VexNum - 1));

17. scanf("%d",&g->EdgeNum);

18.for(k = 0;k < g->EdgeNum; k++)

19. {

20. printf("\n请输入第%d条边的相关信息(起始顶点(序号从0开始) 终止顶点权

值,如0 3 10.3)\n",k + 1);

21. scanf("%d%d%f",&i,&j,&w);

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

23. s->endvex = j;

24. s->next = g->vexs[i].firstarc;

25. s->weight = w;

26. g->vexs[i].firstarc = s;

27. }

28.}

(3)无向网深度优先遍历

算法过程;

假设初始状态是未被访问过的图中所有顶点,则深度优先搜索可从图中某个顶点v出发,首先访问该顶点,然后从v的所有未被访问的邻接点中选择某一个邻接点w访问,然后再从w的所有未被访问的邻接点中选择某一个邻接点x访问,依此类推,直至图中所有和有路径相通的顶点都被访问过为止;若此时图中仍有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问过为止。

算法如下;

1.void MUDGDFS(GraphMatrix *g, int v,int visited[])//visited数组是用来判断某节点

是否被访问过的判断基准

2.{

3. DataType w;

4. visited[v] = TRUE;

5. printf("%d\t", v);

6.for(w = MUDGFirstAdjacent(g, v); w != ERROR; w = MUDGNextAdjacent(g, v,

w))

7. {

8.if(visited[w] != TRUE) //该顶点没有被访问过

9. MUDGDFS(g,w,visited);

10. }

11.}

相关文档
最新文档