好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

实验七图.doc

21页
  • 卖家[上传人]:re****.1
  • 文档编号:555847380
  • 上传时间:2022-09-10
  • 文档格式:DOC
  • 文档大小:160.50KB
  • / 21 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 实验七   图【实验目的】1、掌握图的邻接矩阵和邻接表表达2、掌握图的深度优先和广度优先搜索措施3、掌握图的最小生成树Prim算法4、掌握图的拓扑排序算法5、掌握图的单源最短途径dijkstra算法实验学时】4-6学时【实验预习】回答如下问题:1、写出图7-1无向图的邻接矩阵表达图7-1 无向图G12、写出图7-2有向图的邻接表表达图7-2 有向图G23、写出图7-1的深度优先搜索序列和广度优先搜索序列深度:ABDHECFG广度:ABCFDEGH4、写出图7-2的拓扑序列,阐明该有向图与否有环?5、根据图7-3,写出其最小生成树图7-3  无向带权图G36、根据图7-4,求从顶点A到其她顶点的单源最短途径图7-4有向带权图G4【实验内容和规定】1、 编写程序exp7_1.c,实现图的邻接矩阵存储及图的深度优先搜索和广度优先搜索以图7-1的无向图为例,补充完整程序,调试运营并写出运营成果运营成果:(涉及输入数据)exp7_1.c参照程序如下:#include<stdio.h>#define N 20#define TRUE 1#define FALSE 0int visited[N];ﻩﻩ/*访问标志数组*/typedef struct {  /*辅助队列的定义*/    int data[N];   int front,rear;}queue;typedef struct { ﻩ/*图的邻接矩阵表达*/   int vexnum,arcnum;   char vexs[N];    int arcs[N][N];}MGraph;void createGraph(MGraph *g);  /*建立一种无向图的邻接矩阵*/void dfs(int i, MGraph *g);     /*从第i个顶点出发深度优先搜索*/void tdfs(MGraph *g);   ﻩ/*深度优先搜索整个图*/void bfs(int k, MGraph *g);     /*从第k个顶点广度优先搜索*/void tbfs(MGraph *g);    /*广度优先搜索整个图*/void init_visit();       ﻩ/*初始化访问标记数组*/void createGraph(MGraph *g) { /*建立一种无向图的邻接矩阵*/ int i=0,j,e=0;    char v; g->vexnum=0; g->arcnum=0;   printf("\n输入顶点序列(以#结束):\n");   while ((v=getchar())!='#') {      g->vexs[i]=v;      ﻩ/*读入顶点信息*/      i++;  }  g->vexnum=i;       /*顶点数目*/ for (i=0;i<g->vexnum;i++) ﻩ/*邻接矩阵初始化*/     for (j=0;j<g->vexnum;j++)       g->arcs[i][j]=0;/*(1)-邻接矩阵元素初始化为0*/   printf("\n输入边的信息(顶点序号,顶点序号),以(-1,-1)结束:\n");    scanf("%d,%d",&i,&j); ﻩ/*读入边(i,j)*/   while (i!=-1) {   ﻩ/*读入i为-1时结束*/  g->arcs[i][j]=1; /*(2)-i,j相应边等于1*/     g->arcs[j][i]=1;      e++;    scanf("%d,%d",&i,&j);   }    g->arcnum=e; /*边数目*/}/* createGraph *//*(3)---从第i个顶点出发深度优先搜索,补充完整算法*/void dfs(int i, MGraph *g){ int j; printf("%c",g->vexs[i]);    visited[i]=1;    for(j=0;j<g->vexnum;j++)    if(g->arcs[i][j]==1&&(!visited[j]))     dfs(j,g);}/* dfs */void tdfs(MGraph *g) { /*深度优先搜索整个图*/ int i;  printf("\n从顶点%C开始深度优先搜索序列:",g->vexs[0]);   for (i=0;irear=0;   q->front=0; printf("%c",g->vexs[k]);    visited[k]=TRUE;   q->data[q->rear]=k;   q->rear=(q->rear+1)%N;   while (q->rear!=q->front) { ﻩ/*当队列不为空,进行搜索*/    i=q->data[q->front]; q->front=(q->front+1)%N;     for (j=0;jvexnum;j++)       if ((g->arcs[i][j]==1)&&(!visited[j])) {       printf("%c",g->vexs[j]);           visited[j]=TRUE;      q->data[q->rear]=j;   /*(5)---刚访问过的结点入队*/    q->rear=(q->rear+1)%N; /*(6)---修改队尾指针*/   }   }}/*bfs*/void tbfs(MGraph *g) {   /*广度优先搜索整个图*/   int i; printf("\n从顶点%C开始广度优先搜索序列:",g->vexs[0]); for (i=0;i<g->vexnum;i++)      if (visited[i]!=TRUE)         bfs(i,g); ﻩ ﻩﻩ /*从顶点i开始广度优先搜索*/  printf("\n");}/*tbfs*/void init_visit(){ /*初始化访问标记数组*/   int i;  for (i=0;i<N;i++)   visited[i]=FALSE;}int main(){   MGraph ga;   int i,j;  printf("***********图邻接矩阵存储和图的遍历***********\n"); printf("\n1-输入图的基本信息:\n");    createGraph(&ga);  printf("\n2-无向图的邻接矩阵:\n");    for (i=0;i<ga.vexnum;i++) {      for (j=0;j<ga.vexnum;j++)     printf("%3d",ga.arcs[i][j]);   printf("\n");    }  printf("\n3-图的遍历:\n"); init_visit(); /*初始化访问数组*/  tdfs(&ga); /*深度优先搜索图*/   init_visit();  tbfs(&ga);   /*广度优先搜索图*/   return 0;}2、 编写程序exp7_2.c,实现图的邻接表存储和拓扑排序算法。

      以图7-2的有向图为例,补充完整程序,调试运营并写出运营成果运营成果:(涉及输入数据)exp7_2.c程序代码参照如下:#include#include#define N 20/*图的邻接表:邻接链表结点*/typedef struct EdgeNode{   int adjvex;    /*顶点序号*/   struct EdgeNode *next; /*下一种结点的指针*/} EdgeNode;/*图的邻接表:邻接表*/typedef struct VNode{   char data;    /*顶点信息*/ int ind;    /*顶点入度*/   struct EdgeNode *link;  /*指向邻接链表指针*/} VNode;typedef struct ALgraph{   /*图的邻接表*/ int vexnum,arcnum;    /*顶点数、弧数*/    VNode adjlist[N];}ALGraph;void createGraph_list(ALGraph *g); /*建立有向图的邻接表*/void topSort(ALGraph *g);         /*拓扑排序*//*建立有向图的邻接表*/void createGraph_list(ALGraph *g){  int i,j,e; char v;    EdgeNode *s; i=0;  e=0; printf("\n输入顶点序列(以#结束):\n");   while((v=getchar())!='#')   {  g->adjlist[i].data=v;     /*读入顶点信息*/  g->adjlist[i].link=NULL;    g->adjlist[i].ind=0;     i++; }   g->vexnum=i; /*建立邻接链表*/   printf("\n请输入弧的信息(顶点序号,顶点序号),以(-1,-1)结束:\n");  scanf("%d,%d",&i,&j); while(i!=-1) {     s=(struct EdgeNode*)malloc(sizeof(EdgeNode));      s->adjvex=j; 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.