- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验报告七----拓扑排序
一.需求分析
1、采用邻接表法的存储结构来定义有向图
2、实现有向图的创建、遍历
3、实现栈的创建及其基本操作(进栈、退栈、判空)
4、求图中顶点的入度
二.算法设计
本程序中采用的数据模型,用到的抽象数据类型的定义,程序的主要算法流程及各模块之间的层次调用关系
拓扑排序的基本思想是以下两点:
在有向图中选一个没有前驱的顶点且输出之。
从图中删除该顶点何所有以它为尾的弧。
查邻接表中入度为零的顶点,并进栈。当栈为空时,进行
拓扑排序。
(a)退栈,输出栈顶元素V。
(b)在邻接表中查找Vj的直接后继Vk,将Vk的入度减
一,并令入度减至零的顶点进栈。
重复上述两步,直至全部顶点均已输出。如每输出完,则证明有环。
程序基本结构:
设定栈的抽象数据类型定义:
ADT Stack {
数据对象:D={|∈CharSet,i=1,2,3,…..,n,n=0;}
数据关系:R={, |,∈D,i=2,…,n}
存储结构:
表结点
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
(2)链表的存储结构
typedef struct VNode
{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VEXTEX_NUM];
(3)图的存储结构
typedef struct
{
AdjList vertices;
int vexnum, arcnum;
}ALGraph;
(4)栈的存储结构
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
三.程序设计
根据算法设计中给出的有关数据和算法,选定物理结构,详细设计需求分析中所要求的程序。包括:人机界面设计、主要功能的函数设计、函数之间调用关系描述等。
1界面设计
1)欢迎界面
2)输入顶点与边的关系,并得到拓扑排序
2主要功能
初始化栈
void InitStack(SqStack *S)//初始化栈
{
S-base = (ElemType *) malloc(STACK_INIT_SIZE * sizeof (ElemType));
if (!S-base) {
printf(memory allocation failed, goodbye);
exit(1);
}
S-top = S-base;
S-stacksize = STACK_INIT_SIZE;
}
出栈操作
int Pop(SqStack *S, ElemType *e)//出栈操作
{
if (S-top == S-base) {
return ERROR;
}
*e = *--S-top;
return 0;
}
进栈操作
void Push(SqStack *S, ElemType e)//进栈操作
{
if (S-top - S-base = S-stacksize) {
S-base = (ElemType *) realloc(S-base, (S-stacksize + STACKINCREMENT) * sizeof (ElemType));
if (!S-base) {
printf(memory allocation failed, goodbye);
exit(1);
}
S-top = S-base + S-stacksize;
S-stacksize += STACKINCREMENT;
}
*S-top++ = e;
}
判断栈是否为空
int StackEmpty(SqStack *S)//判断栈是否为空
{
if (S-top == S-base)
return OK;
else
return ERROR;
}
构建图与欢迎界面
void CreatGraph(ALGraph *G)//构建图
{
int m, n, i;
ArcNode *p;
printf(************************************************\n);
printf(
文档评论(0)