主题:[讨论]将数据结构进行到底:图遍历模拟
图遍历模拟
[问题描述] 很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。
[基本要求] 实现
①以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集;
②以为邻接多重表为存储结构建立深度优先生成树和广度优先生成树,再以树形打印生成树
[测试数据]多组顶点序列。注意测试边界数据,如单个结点。
[实现提示]
设图的结点不超过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]
[问题描述] 很多涉及图上操作的算法都是以图的遍历操作为基础的。试写一个程序,演示无向图的遍历操作。
[基本要求] 实现
①以邻接表为存储结构,实现连通无向图的深度优先和广度优先遍历。以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和相应生成树的边集;
②以为邻接多重表为存储结构建立深度优先生成树和广度优先生成树,再以树形打印生成树
[测试数据]多组顶点序列。注意测试边界数据,如单个结点。
[实现提示]
设图的结点不超过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]