图的构造和实现——邻接表[有向图](c++)

数据结构(c++) 专栏收录该内容
6 篇文章 0 订阅
//环境:vs2010
//ALGraph.cpp

#include <iostream>
using namespace std;
const int MaxSize=10;            //图的最大顶点数

struct ArcNode   //定义边表结点
{
  int adjvex;  //邻接点域
  ArcNode *next;
};
template <class DataType>
struct VertexNode   //定义顶点表结点
{
  DataType vertex;
  ArcNode *firstedge;
};

template <class DataType>
class ALGraph
{
public:
   ALGraph(DataType a[ ], int n, int e);   //构造函数,建立一个有n个顶点e条边的图
   ~ALGraph( );                        //析构函数,释放邻接表中各边表结点的存储空间
   void DFSTraverse(int v);             //深度优先遍历图
   void BFSTraverse(int v);              //广度优先遍历图
private:
   VertexNode<DataType> adjlist[MaxSize];           //存放顶点表的数组
   int vertexNum, arcNum;              //图的顶点数和边数
};
template <class DataType>
ALGraph<DataType>::ALGraph(DataType a[ ], int n, int e)
{
	ArcNode *s;
	int i, j, k;
	vertexNum = n; arcNum = e;
	for (i = 0; i < vertexNum; i++)     //输入顶点信息,初始化顶点表
	{ 
		adjlist[i].vertex = a[i];
		adjlist[i].firstedge = NULL;      
	}
	for (k = 0; k < arcNum; k++)        //依次输入每一条边
	{ 
		cout<<"请输入边的两个顶点的序号:";
		cin >> i >> j;                 //输入边所依附的两个顶点的编号
		s = new ArcNode; s->adjvex = j;  //生成一个边表结点s
		s->next = adjlist[i].firstedge;     //将结点s插入到第i个边表的表头
		adjlist[i].firstedge = s;
	}
}

template <class DataType>
ALGraph<DataType>::~ALGraph( )
{
	ArcNode *p;
	for(int i=0; i<vertexNum; i++)
	{
		p=adjlist[i].firstedge;
		while(p!=NULL)                                              //循环删除
		{
			adjlist[i].firstedge=p->next;
			delete p;                                                 //释放结点空间
			p=adjlist[i].firstedge;
		}
	}
}

template <class DataType>
void ALGraph<DataType>::DFSTraverse(int v)
{
	ArcNode *p; int j;
	cout<<adjlist[v].vertex;  visited[v] = 1;
    p = adjlist[v].firstedge;             //工作指针p指向顶点v的边表
	while (p != NULL)                //依次搜索顶点v的邻接点j
	{
		j = p->adjvex;
		if (visited[j] == 0) DFSTraverse(j);
		p = p->next;           
	}
}

template <class DataType>
void ALGraph<DataType>::BFSTraverse(int v)
{
	int front =-1, rear = -1;int k;   //初始化队列, 假设队列采用顺序存储且不会发生溢出
	int Q[MaxSize];
    ArcNode *p;
	cout<<adjlist[v].vertex; visited[v] = 1; Q[++rear] = v;   //被访问顶点入队
	while (front != rear)           //当队列非空时
	{
		k = Q[++front];
		p = adjlist[k].firstedge;       //工作指针p指向顶点v的边表
		while (p != NULL) 
		{
			int j = p->adjvex;
			if (visited[j] == 0) {
				cout<<adjlist[j].vertex; visited[j]=1;Q[++rear]=j;
			}
			p=p->next;
		}
	}
}

int visited[MaxSize] = {0};

int main()
{
	char ch[ ]={'A','B','C','D','E'};
	int i;
	ALGraph<char> ALG(ch, 5, 6);
	for (i = 0; i < MaxSize; i++)
		visited[i] = 0;
	cout<<"深度优先遍历序列是:";
	ALG.DFSTraverse(0);
	cout<<endl;
    for (i = 0; i < MaxSize; i++)
		visited[i] = 0;
	cout<<"广度优先遍历序列是:";
	ALG.BFSTraverse(0);
	cout<<endl;
	return 0;
} 

  • 2
    点赞
  • 0
    评论
  • 10
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值