数据结构实验(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)测试结果