// 图的邻接表的实现及其遍历.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<malloc.h>
#define MaxVertexNum 100
using namespace std;
typedef int Vertex;
typedef int WeightType;
typedef char DataType;
//边的定义
typedef struct ENode *PtrToENode;
struct ENode
{
Vertex V1, V2;
WeightType Weight;
};
typedef PtrToENode Edge;
//邻接点的定义
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode
{
Vertex AdjV; //邻接点下标
WeightType Weight; //边权重
PtrToAdjVNode Next; //指向下一个邻接点的指针
};
//点表头结点的定义
typedef struct Vnode
{
PtrToAdjVNode FirstEdge; //边表头指针
DataType Data; //存顶点数据
}AdjList[MaxVertexNum];
//图结点的定义
typedef struct GNode *PtrToGNode;
struct GNode
{
int vexnum;
int edgenum;
AdjList G; //邻接表
};
typedef PtrToGNode LGraph;
int visited[MaxVertexNum];//标志数组
//函数声明
LGraph CreateGraph(int Vertexnum);
void InsertEdge(LGraph Graph, Edge E);
LGraph BuildGraph();
void DFSTravel(LGraph Graph, Vertex V);
//函数定义
LGraph CreateGraph(int Vertexnum)
{//初始化一个只有顶点,没有边的图
Vertex V;
LGraph Graph;
Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->vexnum = Vertexnum;
Graph->edgenum = 0;
for (V = 0; V<Graph->vexnum; V++)
{
Graph->G[V].FirstEdge = NULL;
}
return Graph;
}
void InsertEdge(LGraph Graph, Edge E)
{
PtrToAdjVNode NewNode;
//插入边<v1,v2>
//为v2建立新的表结点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Weight = E->Weight;
NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode;
//若是无向图,还需插入边<v2,v1>
//为v1建立新的结点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V1;
NewNode->Weight = E->Weight;
NewNode->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode;
}
LGraph BuildGraph()
{
LGraph Graph;
Edge E;
Vertex V;
int vexnum, i;
cout << "请输入顶点个数:";
cin >> vexnum;
Graph = CreateGraph(vexnum);
cout << "请输入边的个数:";
cin >> Graph->edgenum;
if (Graph->edgenum != 0)
{
E = (Edge)malloc(sizeof(struct ENode));
for (i = 0; i<Graph->edgenum; i++)
{
cin >> E->V1 >> E->V2 >> E->Weight;
InsertEdge(Graph, E);
}
}
//如果顶点有数据的话,读入数据
for (V = 0; V<Graph->vexnum; V++)
cin >> Graph->G[V].Data;
cout << "创建好的邻接表输出如下所示:" << endl;
for (V = 0; V<Graph->vexnum; V++)
{
PtrToAdjVNode W;
cout << Graph->G[V].Data << "的邻接点:";
for (W = Graph->G[V].FirstEdge; W; W = W->Next)
{
cout <<W->AdjV<<","<< Graph->G[W->AdjV].Data <<","<< W->Weight<<" ";
}
cout << endl;
}
return Graph;
}
//深度优先遍历图
void DFSTravel(LGraph Graph, Vertex V)
{
PtrToAdjVNode W;
cout << Graph->G[V].Data;
visited[V] = 1;
for (W = Graph->G[V].FirstEdge; W; W = W->Next)
if (!visited[W->AdjV])
DFSTravel(Graph, W->AdjV);
}
int _tmain(int argc, _TCHAR* argv[])
{
LGraph Graph;
Graph = BuildGraph();
for (int v = 0; v < Graph->vexnum; v++)
visited[v] = 0;
cout << "深度优先遍历邻接矩阵如下:" << endl;
DFSTravel(Graph, 0);
cout << endl;
return 0;
}
图的邻接表表示及其深度优先搜索实现
最新推荐文章于 2022-01-12 19:36:08 发布