数据结构课程设计拓扑排序(顺序,逆序输出)

  • 格式:doc
  • 大小:159.05 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

一.需求分析说明 (1)

二.概要设计说明 (1)

三.详细设计说明 (2)

四.调试分析 (6)

五.用户使用说明 (6)

六.课程设计总结 (7)

七.测试结果 (8)

八.参考书目 (9)

九. 附录 (10)

一、需求分析说明

为了更好的学习数据结构,深刻理解数据结构在解决实际问题中的应用,体会其重要性,熟练掌握线性表、栈和队列、串、数组、树、图等常用的数据结构,熟悉各自的特点和应用场合。

同时锻炼自己独立分析理解问题的能力,学会根据不同的问题选择合适的数据结构,然后结合适当的算法解决问题。锻炼自己的设计和编写程序的技巧,进一步调试和测试自己所写的程序,使其功能更加完善,养成较好的编写程序习惯。

提高综合运用所学的理论知识和方法独立分析和解决问题的能力,训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。本课程设计的目的就是要达到理论与实际应用相结合,使同学们能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。

设计的基本要求:1)选择邻接表作为有向图的存储结构模拟整个过程,并输出拓扑排序的顶点序列。2)给出逆向的拓扑有序序列。

二、概要设计说明

2.1 算法思想

采用邻接表存储结构实现有向图;有向图需通过顶点数、边数、顶点以及边等信息建立。

拓扑排序算法大体思想为:

1)遍历有向图各顶点的入度,将所有入度为零的顶点入栈;

2)栈非空时,输出一个顶点,并对输出的顶点数计数;

3)该顶点的所有邻接点入度减一,若减一后入度为零则入栈;

4)重复2)、3),直到栈为空,若输出的顶点数与图的顶点数相等则该图可拓扑排序,否则图中有环;

5)重复2)、3)、4)直到序列中所有元素均被遍历,则该序列是拓扑序列,否则不是拓扑序列。

2.2 系统功能模块结构图

本程序包括拓扑排序模块和拓扑排序核心算法模块。

3.1

3.2 数据结构

1)图

typedef struct stack{

int *base;

int *top;

int stacksize;

}sqstack;//栈的结构,存储图的顶点序号

typedef struct lnode

{

int adjvex;

struct lnode *next;

}ArcNode;//弧结点

typedef struct node2

{

int data;

ArcNode *fristarc;

}VNode,AdjList[MAX];//顶点数组,fristarc指向与顶点邻接的第一条弧typedef struct{

AdjList vertices;

int vexnum,arcnum;

}Graph;//邻接表图

void CreatGraph(Graph &G,int *indegree)

{

cout<<"请输入图的顶点数和边数(且顶点数不能超过"<

cin>>G.vexnum>>G.arcnum;

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;

}

}

2)栈

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;

}

3.3 具体实现函数

1)程序所需头文件及全局变量

#include

using namespace std;

const int MAX=30;

const int STACK_INIT_SIZE=100;

const int ERROR=0;

2)栈的操作

①void Initstack(sqstack &s)

功能:初始化栈,构造一个空栈S

参数:S待初始化的栈

②i nt Emptystack(sqstack &s)

功能:判断栈是否为空

参数:S 待判断的栈

返回值:栈为空返回1,栈非空返回0

③void Push(sqstack &s,int &e)

功能:元素入栈

参数:S 待操作的栈:插入元素e为新的栈顶元素

④int Pop(sqstack &s,int &e)

功能:元素出栈

参数:S 待操作的栈:若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回0

3)图的建立

void CreatGraph(Graph &G,int *indegree)

功能:建立有向图,并记录每个节点的入度值

参数:G 待建立的图:用indegree记录节点的入度值

4)拓扑排序

int Toposort(Graph &G,int *indegree)

功能:对有向图进行拓扑排序,对排序结果进行顺序和逆序输出

参数:G 待排序的图:indegree是节点的入度值

5)主函数

int main()

对各个函数进行调用,实现程序功能

判断是否排序成功