0
点赞
收藏
分享

微信扫一扫

数据结构实验(10)

杨小羊_ba17 2022-03-15 阅读 34

数据结构实验(C++)

PS:仅数据结构实验记录
题目:用邻接表存储一个图 G。分别设计实现下列要求的算法: 求出图G中每个顶点的出度;求出图G中出度最大的一个顶点,输出该顶点的编号;计算图G中出度为0的顶点数。

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

struct EdgeNode 						//定义边表结点
{
	int adjvex; 						//邻接点域
	EdgeNode* next;
};

template<typename DataType>
struct VertexNode 						//定义顶点表结点
{
	DataType vertex;
	EdgeNode* firstEdge;
};


template<typename DataType>

class ALGraph
{
public:
	ALGraph(DataType a[], int n, int e);	//构造函数,建立n个顶点e条边的图
	~ALGraph();						//析构函数,释放邻接表各边表结点的存储空间
	void Get_Out_Num();						//计算各顶点的出度
	void Get_Max_DgreeNum();					//获取顶点最大出度个数及顶点下标

	VertexNode<DataType> adjlist[MaxSize];		//存放顶点表的数组
	int vertexNum, edgeNum;					//图的顶点数和边数
	int Per_Dgree_Num[MaxSize];				//存储各顶点的出度个数
	int Zero_Num;								//记录顶点出度为零的个数
};
//构造函数,建立n个顶点e条边的图
template<typename DataType>
ALGraph<DataType>::ALGraph(DataType a[], int n, int e)
{
	int i, j, k;
	EdgeNode* s = nullptr;
	EdgeNode* p = nullptr;
	vertexNum = n; edgeNum = e;
	for (i = 0; i < vertexNum; i++)					//输入顶点信息,初始化顶点表
	{
		adjlist[i].vertex = a[i];
		adjlist[i].firstEdge = NULL;
	}
	for (k = 0; k < edgeNum; k++)					//依次输入每一条边
	{
		cout << "输入边所依附的两个顶点的编号< i , j >:";
		cin >> i >> j;								//输入边所依附的两个顶点的编号
		s = new EdgeNode; s->adjvex = j;				//生成一个边表结点s
		s->next = adjlist[i].firstEdge;					//将结点s插入到第i个边表的表头
		adjlist[i].firstEdge = s;

	}
}
//析构函数,释放邻接表各边表结点的存储空
template<typename DataType>
ALGraph<DataType> :: ~ALGraph()
{
	EdgeNode* p = NULL, * q = NULL;
	for (int i = 0; i < vertexNum; i++)
	{
		p = q = adjlist[i].firstEdge;
		while (p != NULL)
		{
			p = p->next;
			delete q;
			q = p;
		}
	}
}


//计算顶点出度度个数
template<typename DataType>
void ALGraph<DataType> ::Get_Out_Num()
{
	int i;
	Zero_Num = 0;									//记录顶点出度为零的个数
	for (i = 0; i < vertexNum; i++)						//顶点下标
	{
		EdgeNode* p = adjlist[i].firstEdge;				//工作指针指向 i 的边表
		int count_Num = 0;
		while (p != nullptr)
		{
			count_Num++;									//记录出度个数
			p = p->next;									//工作指针后移
		}
		if (count_Num == 0)									//判断顶点出度是否为零
			Zero_Num++;

		Per_Dgree_Num[i] = count_Num;						//存储出度个数
	}
}
//获取顶点最大出度个数及顶点下标
template<typename DataType>
void ALGraph<DataType> ::Get_Max_DgreeNum()
{
	int count = 0;						//最大出度个数
	int tip = 0;						//最大出度顶点编号
	for (int i = 0; i < vertexNum; i++)
	{
		if (Per_Dgree_Num[i] > count)
		{
			count = Per_Dgree_Num[i];
			tip = i;
		}
	}
	cout << "出度最大为: " << count << " , 其顶点编号为: " << tip << endl;
}

//测试
int main()
{
	string ch[] = { "a","b","c","d","e","f" };
	ALGraph<string> AL(ch, 6, 10);
	cout << "图G各顶点的度个数,情况如下:" << endl;
	AL.Get_Out_Num();
	for (int i = 0; i < AL.vertexNum; i++)
	{
		cout << "  顶点 " << ch[i] << " : " << AL.Per_Dgree_Num[i] << " 个" << endl;
	}
	AL.Get_Max_DgreeNum();
	cout << "图中出度为零的顶点数为: " << AL.Zero_Num << endl;
	cout << "\n";
	return 0;
}

测试结果
1)测试图
在这里插入图片描述
2)测试结果
在这里插入图片描述

举报

相关推荐

0 条评论