数据结构实验(13)
PS:仅数据结构实验记录
题目:教学计划编制问题。按先修课程和后续课程关系,编制一个简单的排课计划程序。
#include<iostream>
using namespace std;
struct EdgeNode //定义边表结点
{
int adjvex; //邻接点域
EdgeNode* next;
};
template<typename DataType>
struct VertexNode //定义顶点表结点
{
int flag; //标记是否已修
DataType vertex;
EdgeNode* firstEdge;
};
const int MaxSize = 10; //图的最多顶点数
template<typename DataType>
class ALGraph
{
public:
ALGraph(DataType a[], int n, int e); //构造函数,建立n个顶点e条边的图
~ALGraph(); //析构函数,释放邻接表各边表结点的存储空间
void Dis(int v);
DataType Save[MaxSize]; //存储选修顺序
private:
VertexNode<DataType> adjlist[MaxSize]; //存放顶点表的数组
int vertexNum, edgeNum; //图的顶点数和边数
};
template<typename DataType>
ALGraph<DataType>::ALGraph(DataType a[], int n, int e)
{
int i, j, k;
EdgeNode* s = nullptr;
vertexNum = n; edgeNum = e;
for (i = 0; i < vertexNum; i++) //输入顶点信息,初始化顶点表
{
adjlist[i].vertex = a[i];
adjlist[i].firstEdge = NULL;
adjlist[i].flag = 0; //标记是否已修
}
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>
void ALGraph<DataType>::Dis(int v)
{
int top = -1;
int B = 1;
while (B)
{
for (int i = 0; i < vertexNum; i++)
{
if (adjlist[i].flag == 0) //判断课程i是否已入栈
{
int count = 0;
for (int j = 0; j < vertexNum; j++) //计算i的入度
{
if (adjlist[j].flag == 0) //课程j未学
{
EdgeNode* p = adjlist[j].firstEdge;//指向顶点j的边表
while (p != nullptr) //边表不为空;
{
if (p->adjvex == i)
count++; //入度加1;
p = p->next;
}
}
}
if (count == 0) //课程i的先修课程已学完,可修
{
Save[++top] = adjlist[i].vertex; //存储
adjlist[i].flag = 1; //标记已修
}
}
}
if (top == vertexNum - 1)
B = 0;
}
}
//析构函数
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;
}
•}
}
int main()
{
string ch[] = { "v0","v1","v2","v3","v4","v5","v6" };
int i;
ALGraph<string> ALG(ch, 7, 10); //建立具有5个顶点6条边的有向图
cout << "课程顺序如下:";
ALG.Dis(0);
for (int i = 0; i < MaxSize; i++)
{
cout << ALG.Save[i] << "\t";
}
return 0;
}
测试结果
1)测试图
假设v0、v1、v2、v3、v4、v5、v6为所要修的课程及先修和后续关系,编写的代码输出其选修课程的先后顺序。
2)截图