数据结构实验(12)

数据结构实验(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)截图
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值