回 帖 发 新 帖 刷新版面

主题:[讨论]将数据结构进行到底:图遍历模拟

图遍历模拟
[问题描述] 很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。
[基本要求] 实现
①以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集;
②以为邻接多重表为存储结构建立深度优先生成树和广度优先生成树,再以树形打印生成树
[测试数据]多组顶点序列。注意测试边界数据,如单个结点。
[实现提示]
  设图的结点不超过30个,每个结点用一个编号表示(如果一个图有n个结点,则它们的编号分别为1,2,…,n)。通过输入图的全部边输入一个图,每个边为一个数对,可以对边的输入顺序作出某种限制。注意,生成树的边是有向边,端点顺序不能颠倒[em18]
    实在惭愧,[color=FF00FF]实在惭愧[/color],由于数据结构没学没明白,我只把第一问解决了,但第二问不能得其解,恳请高手指点:
    第一问原程序如下:调试通过的,希望得到你的赐教批评:
对不起呀,怎么没办法提交呀,若谁要加我吧,305921790,第一次来这里,许多不懂斑竹的发贴程序;呵呵,斑竹,不好意思了。

急盼第二问的解决方案:
我已经可以实现图邻接多重表的存储了,但不知道怎样建立深度优先生成树和广度优先生成树,再以树形打印生成树?
#include <stdlib.h>
#define VertexNum 6   /*定义顶点数*/

struct Edge
{
int Marked;
int Vertex1;
int Vertex2;
struct Edge *Edge1;
struct Edge *Edge2;
};
typedef  struct  Edge *NextEdge;

struct Node        /*声明图形顶点结构*/
{
int Vertex;       /*邻接顶点数据*/
   struct Edge *Next;/*下一个邻接顶点*/
};
typedef struct  Node *Graph;  /*定义图形结构*/
struct Node Head[VertexNum];  /*顶点数组*/
/*----------------------------------------*/
/*建立邻接顶点至邻接列表内                */
/*----------------------------------------*/
void Creat_ML_Graph(int Vertex1,NextEdge New)
{
NextEdge Pointer;    /*节点声明*/
NextEdge Previous;   /*前一个节点*/
Previous=NULL;
Pointer=Head[Vertex1].Next;  /*目前的节点*/
while ( Pointer != NULL)     /*到达列表尾端才结束循环*/
{
  Previous=Pointer;
                    /*如果Vertex1为起始顶点*/
  if (Pointer->Vertex1==Vertex1)
                    /*往Edge1的下一个节点*/
      Pointer=Pointer->Edge1;
  else
                    /*往Edge2的下一个节点*/
      Pointer=Pointer->Edge2;
}
if (Previous==NULL)    /*串连在Head之后*/
  Head[Vertex1].Next=New;
else if (Previous->Vertex1==Vertex1)
  Previous->Edge1=New;  /*串连在Edge1之后*/
else
  Previous->Edge2=New;  /*串连在Edge2之后*/
}
/*----------------------------------------*/
/*输出邻接列表内数据                      */
/*-----------------------------------------*/
void Print_ML_Graph(struct Node *Head)
{
NextEdge  Pointer;    /*节点声明*/
Pointer=Head->Next;  /*Pointer指针设为首节点*/
while( Pointer!= NULL )/*当节点NULL结束循环*/
{
   printf("(%d,%d)",Pointer->Vertex1,Pointer->Vertex2);
   if (Head->Vertex==Pointer->Vertex2)
       Pointer =Pointer->Edge1;/**/
   else if (Head->Vertex==Pointer->Vertex2)
         Pointer=Pointer->Edge2;
}
printf("\n");
}
/*---------------------------------------------*/
/*主程序                                       */
/*--------------------------------------------*/
void main()
{
int Source;           /*起始顶点*/
int Destination;      /*终止顶点*/
int Choose;           /*选项边量*/
NextEdge New;         /*新节点*/
int i,j;

for ( i=0;i<VertexNum;i++)
{
  Head[i].Vertex=i;
  Head[i].Next=NULL;
}
  printf("1.Undirected Graph\n");
  printf("2.Directed Graph\n");
  printf("Please choose : ");   /*选者有向图形或无向图形*/
  scanf("&d",&Choose);
while (1)
  {
    printf("Please input the Edge's source : ");
    scanf("%d",&Source);
    if ( Source == -1)
       break;

    printf("Please input the Edge's Destination : ");
    scanf("%d",&Destination);
            /*错误;超出范围*/
    if ( Source >= VertexNum || Destination >= VertexNum)
         printf("@Error@ : Out of range!!\n");
    else      /*调用建立邻接列表*/
      {
       New = (NextEdge) malloc(sizeof(struct Edge));
       if (New !=NULL )       /*配置成功*/
        {
          New->Vertex1=Source;/*邻近顶点*/
          New->Vertex2=Destination;/*邻近顶点*/
          New->Edge1=NULL;        /*下一个邻接顶点指针*/
          New->Edge2=NULL;        /*下一个邻接顶点指针*/
          Creat_ML_Graph(Source,New);
          if (Choose == 1)
              Creat_ML_Graph(Destination,New);
         }
       }
   }
   printf("##Graph##\n");
   for (i=0; i<VertexNum;i++)
    {
     printf("Vertex[%d] : ",i);
     Print_ML_Graph(&Head[i]);   /*调用输出多元邻接列表数据*/
    }
}

但不知道怎样建立深度优先生成树和广度优先生成树,再以树形打印生成树?望指点!

[em18][em12]

回复列表 (共1个回复)

沙发

楼上的代码还不错,够长。

我来回复

您尚未登录,请登录后再回复。点此登录或注册