图的邻接表表示及其深度优先搜索实现

// 图的邻接表的实现及其遍历.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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值