#include "stdio.h"
#include "stdlib.h"
#include "stdbool.h"
#define MVN 20
#define Maxint 32767
typedef char VerTexType;
typedef int ArcType;
typedef struct
{
VerTexType Vexs[MVN];// 顶点矩阵
ArcType Arcs[MVN][MVN];// 邻接矩阵
int Vexnum,Arcnum;// 当前顶点数和边数
_Bool visited[MVN];// 记录被访问过的节点
}AMGraph;// Adjacency Matrix Graph :邻接矩阵
int get_first(AMGraph* G, VerTexType* v);
int GetVertex(AMGraph* G);
int LocateVex(AMGraph* G,VerTexType v);
int Create_visited(AMGraph* G);
void test(AMGraph* G)
{
for(int w = 0; w < (*G).Vexnum; w++)
{ printf("顶点的值为:%c\n",(*G).Vexs[w]);
}
}
int CreateUDN(AMGraph* G)// 创建无向图
{ VerTexType v1;
VerTexType v2;//弧的两个顶点
int weight; // 弧的权重
printf("输入顶点的数量:\n");
scanf("%d",&(*G).Vexnum);// 指定顶点的数量
printf("输入边的数量:\n");
scanf("%d",&(*G).Arcnum);// 指定边的数量
for(int i = 0; i< (*G).Vexnum; i++)//对于无向图,初始化为无穷大
{
for(int j = 0; j < (*G).Vexnum; j++)
(*G).Arcs[i][j] = 0;
}
GetVertex(G);
test(G);
for (int k = 0; k < (*G).Arcnum; k++)// 数据写入矩阵
{ printf("哪两个顶点之间是连通的?\n");
printf("顶点1:\n");
get_first(G,&v1);// 把输入的值写入到v1
printf("顶点2:\n");
get_first(G,&v2);//把输入的值写入到v2
int i = LocateVex(G,v1);
int j = LocateVex(G,v2);//定位两个顶点所在位置。
(*G).Arcs[i][j] = 1;//表示有联系。
(*G).Arcs[j][i] = (*G).Arcs[i][j];// 无向网的邻接矩阵沿对角线对称。
}
return 1;
}
int GetVertex(AMGraph* G)
{
for (int i = 0; i <(*G).Vexnum; i++)// 逐个输入顶点的值
{ printf("输入顶点的值:\n");
get_first(G,&(*G).Vexs[i]);//写入到指定位置
}
}
int LocateVex(AMGraph* G,VerTexType v)//查找顶点在顶点数组中的下标
{
if(sizeof(*G) == 0) return 0;
for(int i = 0; i < MVN; i++)
{
if((*G).Vexs[i] == v)
return i;
}
return 0;
}
int get_first(AMGraph* G, VerTexType* v)//读取字符,并截断换行符
{ scanf("%d",EOF);
(*v) = getchar();// 为什么在顶点数组创建完毕之后,指针会指向首元素?在建立通道阶段。
while(getchar() != '\n')
continue;
return 1;
}
int Create_visited(AMGraph* G)
{
if(sizeof(*G) == 0) return 0;
for(int i = 0; i< MVN;i++)
(*G).visited[i] = false;
return 1;
}
void DFS(AMGraph* G, int v)//深度优先遍历
{
printf("顶点%c\n",(*G).Vexs[v]);
(*G).visited[v] = true;// 我不能把整行都搞成TRUE啊!!
for(int w = 0; w < (*G).Vexnum; w++)
{ //printf("Here\n");
if(((*G).Arcs[v][w] != 0 ) && (!(*G).visited[w]))
DFS(G,w);
}
}
int main()
{
AMGraph G;
CreateUDN(&G);
printf("*************************************************************");
printf("*************************************************************");
printf("*************************************************************");
printf("***************************************遍历开始******************************\n");
Create_visited(&G);
//test(&G);
DFS(&G,0);//从邻接表的第一行的第一个元素开始。
return 0;
}
深度优先遍历-无向图
最新推荐文章于 2024-07-07 21:22:26 发布