数据结构拓扑排序课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课题二拓扑排序
2.1 问题的提出2.1 问题的提出
任务:编写函数实现图的拓扑排序。
程序所实现的功能:建立对应的邻接表,对该图进行拓扑排序,并显示排序
结果。
输入:
顶点数, 边数及各顶点信息(数据格式为整形)
输出:
拓扑排序结果。
2. 2 概要设计
1.拓扑排序是指由某个集合上的一个偏序得到该集合上的一个全序。更直观地讲,一个偏序是自反的、反对称的,用图表示时每个点都有环且只有单向边。拓扑排序的任务是在这个偏序上得到一个全序,即得到一个完成整个项目的各步骤的序列。
2.解决拓扑排序的方法如下:
(1)在有向图中选一个没有前驱的顶点且输出之。
(2)从图中删除该顶点和所有以它为尾的弧。
重复上述两步,直至全部顶点均已输出,或者当前图中不存在无前驱的顶点为止。后一种情况则说明有向图中存在环。具体的算法实现参照源程序。
3.构造邻接表图:typedef struct{
AdjList vertices;
int vexnum,arcnum;
}Graph;//邻接表图
4.为了避免重复检测入度为零的顶点,源程序中设了一个栈,暂存所有入度为零的顶点:typedef struct stack{
int *base;
int *top;
int stacksize;
}sqstack;//栈的结构,存储图的顶点序号
2.3 流程图2.根据算法思想,画流程图如下:
2.4 源代码
//采用尾插法创的邻接图
#include
using namespace std;
const int MAX=20;
const int STACK_INIT_SIZE=100;
const int ERROR=0;
typedef struct stack{
int *base;
int *top;
int stacksize;
}sqstack;//栈的结构,存储图的顶点序号
typedef struct lnode
{
int adjvex;
struct lnode *next;
}ArcNode;//弧结点
typedef struct node2
{
char data;
ArcNode *fristarc;
}VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}Graph;//邻接表图
void Initstack(sqstack &s)
{
s.base=new int;
if(!s.base)
exit(0);
s.top=s.base;
s.stacksize= STACK_INIT_SIZE;
}
void Push(sqstack &s,int &e)
{
*s.top++=e;
}
int Emptystack(sqstack &s)
{
if(s.base==s.top)
return 1;
else
return 0;
}
int Pop(sqstack &s,int &e)
{
if(s.base==s.top)
return ERROR;
e=*--s.top;
}
void CreatGraph(Graph &G,int *indegree)
{
cout<<"请输入图的顶点数和弧数(且顶点数不能超过"<
cout<<"请输入顶点值:"< for(int i=0;i { cin>>G.vertices[i].data; G.vertices[i].fristarc=NULL; indegree[i]=0; } for(i=0;i { int m,n; ArcNode *p; cout<<"请输入第"< cin>>m>>n; p=new ArcNode; if(!p) exit(0); indegree[n-1]++;//求每个顶点的入度值 p->adjvex=n-1; p->next=G.vertices[m-1].fristarc; G.vertices[m-1].fristarc=p; } } int Toposort(Graph &G,int *indegree) { sqstack S; Initstack(S); for(int i=0;i { if(!indegree[i]) Push(S,i); } int count=0; while(!Emptystack(S)) { Pop(S,i); cout< count++;//记录输出的顶点数 for(ArcNode *p=G.vertices[i].fristarc;p;p=p->next)//把与顶点