问答题
   实验目的:
   (1)掌握图的两种存储结构的实现方法。
   (2)掌握遍历图的递归和非递归算法。
   (3)掌握和理解本实验中出现的一些基本的C语言语句。
   (4)体会算法在程序设计中的重要性。
   实验内容:
   (1)设计算法,构造无向图的邻接链表,并递归地实现基于邻接链表的图的深度优先搜索遍历。
   (2)设计算法,构造无向图的邻接矩阵,并递归地实现基于邻接矩阵的图的深度优先搜索遍历。
【正确答案】(1)
   #define MAXLEN 30    /*基于邻接链表存储结构的无向图的结点类型定义*/
   #define NULL'\0'
   int visited[MAXLEN]={0);
   typedef struct node
   {  int vertex;
       struct node*next;
   }ANODE;
   typedef struct
   {  int data;
       ANODE*first;
   }VNODE;
   typedef struct
   {  VNODE adjlist[MAXLEN];
       int vexnum,arcnum;
   }ADJGRAPH;
   ADJGRAPH crealz()    /*基于邻接链表存储结构的无向图的建立算法*/
   {  ANODE*p;
       int  i,s,d;
       ADJGRAPH  ag;
       printf("input vexnum,input arcnum:");
       scanf("/%d,/%d",&ag.vexnum,&ag.arcnum);
       printf("input gege dingdian zhi:");
       for(i=0;i<ag.vexnum;i++)
       {scanf("/%d",&ag.adjlist[i].data);
           ag.adjlist[i].first=NULL;
       }
       for(i=0;  i<ag.arcnum;i++)
       {printf("input bian de dingdian xuhao:");
           scanf("/%d,/%d",&s,&d);
           s--;
           d--;
           p=(ANODE*)malloc(sizeof(ANODE));
           p->vert;ex=d;
           p->next=ag.adjlist[s].first;
           ag.adjlist[s].first=p;
           p=(ANODE*)malloc(sizeof(ANODE));
           p->vertex=s;
           p->next=ag.adjlist[d].first;
           ag.adjlist[d].first=p;
       }
       return ag;
   }
   void dfs(ADJGRAPH ag,int i)    /*无向图的深度优先搜索遍历算法*/
   { ANODE*p;
       visited[i-1]=1;
       printf("/%3d",ag.adjlist[i-1].data);
       p=ag.adjlist[i-1].first;
       while(p!=NULL)
   { if(visited[p->vertex]==0)
       dfs(ag,(p->vertex)+1);
       p=p->next;}
   }
   main()
   {  ADJGRAPH ag;
       int  i;
       ag=creat();
       printf("tong di i ge jiedian kaishi:");
       scanf("/%d",&i);
       dfs(ag,i);
   }
   (2)
   #define maxlen 10    /*基于邻接矩阵存储结构的无向图的结点类型定义*/
   int visited[maxlen]=(0);
   typedef struct
   {    int vexs[maxlen];
       int arcs[maxlen][maxlen];
       int vexnom,arcnum;
   }MGRAPH;
   void treat(MGRAPH*g)  /*基于邻接矩阵存储结构的无向图的建立算法*/
   {  int i,j;
       printf("input vexnum,arcnum:");
       scanf("/%d/%d",&g->vexnum,&g->arcnum);
       for(i=0;i<g->vexnum; i++)
       for(j=0;j<g->vexnum;j++)
       g->arcs[i][j]=0;
       for(i=0;i<g->arcnum;i++)
       {printf("bian de dingdian:");
           scanf("/%d/%d",&i,&j);
           g->arcs[i-1][j-1]=1;
           g->arcs[j-1][i-1]=1;
       }
   }
   void print(MGRAPH*g)
   { int i,j;
       for(i=0;i<g->vexnum;i++)
       {for(j=0;j<g->vexnum;j++)
       printf("/%3d",g->arcs[i][j]);
       printf("\n");
   }
   }
   void dfs(MGRAPH*g,int i)    /*无向图的深度优先搜索遍历算法*/
   {  int j;
       printf("/%3d",i);
       visited[i-1]=1;
       for(j=0;j<g->vexnum;j++)
       if(g->arcs[i—1][j]==1&&(!visited[j]))
       dfs(g,j+1);
   }
   main()
   {  MGRAPH*g,k;
       int i;
       g=&k;
       creat(g);
       print(g);
       printf("cong di i ge Jiedian fangwen:");
       scanf("/%d",&i);
       dfs(g,i);
   }
【答案解析】