PS:仅数据结构实验记录
题目:用邻接表存储一个图 G。分别设计实现下列要求的算法: 求出图G中每个顶点的出度;求出图G中出度最大的一个顶点,输出该顶点的编号;计算图G中出度为0的顶点数。
#includeusing namespace std; const int MaxSize = 10; //图的最多顶点数 struct EdgeNode //定义边表结点 { int adjvex; //邻接点域 EdgeNode* next; }; template struct VertexNode //定义顶点表结点 { DataType vertex; EdgeNode* firstEdge; }; template class ALGraph { public: ALGraph(DataType a[], int n, int e); //构造函数,建立n个顶点e条边的图 ~ALGraph(); //析构函数,释放邻接表各边表结点的存储空间 void Get_Out_Num(); //计算各顶点的出度 void Get_Max_DgreeNum(); //获取顶点最大出度个数及顶点下标 VertexNode adjlist[MaxSize]; //存放顶点表的数组 int vertexNum, edgeNum; //图的顶点数和边数 int Per_Dgree_Num[MaxSize]; //存储各顶点的出度个数 int Zero_Num; //记录顶点出度为零的个数 }; //构造函数,建立n个顶点e条边的图 template ALGraph ::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 ALGraph :: ~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 void ALGraph ::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 void ALGraph ::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 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)测试结果



