算法与数据结构课程设计报告书 AOV网.docx
- 文档编号:12612180
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:10
- 大小:58.87KB
算法与数据结构课程设计报告书 AOV网.docx
《算法与数据结构课程设计报告书 AOV网.docx》由会员分享,可在线阅读,更多相关《算法与数据结构课程设计报告书 AOV网.docx(10页珍藏版)》请在冰豆网上搜索。
算法与数据结构课程设计报告书AOV网
算法与数据结构
课程设计报告书
姓 名 ______
班 级 _______
学 号 _______
指导教师 _____
信息科学与技术学院
问题描述:
设计程序完成如下功能:
对给定的AOV网,求出该AOV网所有的拓扑序列。
设计的软、硬件环境:
CPU
操作系统
MircrosoftvisualC++
ADT(数据结构与算法)设计与功能模块:
基于邻接表的存储结构
利用CreatGraph(ALGraph*G)函数,构建图-——邻接表;
用FindInDegree(ALGraphG,intindegree[]),求出入度为零的顶点,即为没有前驱的顶点,可以附设一个存放各顶点入度的数组Indegree[];
找G中无前驱的顶点—查找indegree[i]为零的顶点vi;
删除以i为顶点的所有弧—对链在顶点i后面的所有邻接顶点k,对对应的indegree[k]减1;
利用TopologicalSort(ALGraphG)进行拓扑排序;
为了避免重复检测入度为零的顶点,再设置一个辅助栈,若某一顶点的入度为零,则将它入栈。
每当输出某一入度为零的顶点时,便将它从栈中删除;
这里用到如下函数
voidInitStack(SqStack*);
intPop(SqStack*,ElemType*);
voidPush(SqStack*,ElemType);
intStackEmpty(SqStack*);
程序输入与结果输出:
实验结果分析及收获:
首先输入了该图的顶点数和边数,假设顶点数和边数都为4,有
所以建立的邻接表为:
1342
2
34
4
然后求出了各顶点的入度,即:
第1个顶点的入度为0;
第2个顶点的入度为1;
第3个顶点的入度为1;
第4个顶点的入度为2;
最后输出该拓扑序列的排列顺序:
1234
实验收获:
这次对AOV网进行拓扑排序的课程设计,让我明白了如何对一个有向无环图进行拓扑排序,以及拓扑排序的基本思想。
在课程设计的过程中虽然也遇到了一些难题,但是通过看书,上网查相关资料,以及组员之间讨论,终于解决了相关问题,得出了实验结果。
附录(源程序清单)
#include
#include
#defineMAX_VEXTEX_NUM20
#defineM20
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOK1
#defineERROR0
typedefintElemType;
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode
{
intdata;
ArcNode*firstarc;
}VNode,AdjList[MAX_VEXTEX_NUM];
typedefstruct
{
AdjListvertices;
intvexnum,arcnum;
}ALGraph;
typedefstruct//构件栈
{
ElemType*base;
ElemType*top;
intstacksize;
}SqStack;
voidInitStack(SqStack*);//函数声明
intPop(SqStack*,ElemType*);
voidPush(SqStack*,ElemType);
intStackEmpty(SqStack*);
voidCreatGraph(ALGraph*);
voidFindInDegree(ALGraph,int*);
voidTopologicalSort(ALGraph);
voidInitStack(SqStack*S)//初始化栈i
{
S->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!
S->base)
{
printf("memoryallocationfailed,goodbye");
exit
(1);
}
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}
intPop(SqStack*S,ElemType*e)//出栈操作
{
if(S->top==S->base)
{returnERROR;}
*e=*--S->top;
//printf("%d\n",e);
//returne;
return0;
}
voidPush(SqStack*S,ElemTypee)//进栈操作
{if(S->top-S->base>=S->stacksize)
{
S->base=(ElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!
S->base)
{
printf("memoryallocationfailed,goodbye");
exit
(1);
}
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}*S->top++=e;
}
intStackEmpty(SqStack*S)//判断栈是否为空
{
if(S->top==S->base)
returnOK;
else
returnERROR;}
voidCreatGraph(ALGraph*G)//构件图
{intm,n,i;
ArcNode*p;
printf("请输入顶点数和边数:
");
scanf("%d%d",&G->vexnum,&G->arcnum);
for(i=1;i<=G->vexnum;i++)
{G->vertices[i].data=i;
G->vertices[i].firstarc=NULL;
}
for(i=1;i<=G->arcnum;i++)//输入存在边的点集合
{
printf("\n请输入存在边的两个顶点的序号:
");
scanf("%d%d",&n,&m);
while(n<0||n>G->vexnum||m<0||m>G->vexnum)
{printf("输入的顶点序号不正确请重新输入:
");
scanf("%d%d",&n,&m);
}
p=(ArcNode*)malloc(sizeof(ArcNode));
if(p==NULL)
{printf("memoryallocationfailed,goodbey");
exit
(1);
}
p->adjvex=m;
p->nextarc=G->vertices[n].firstarc;
G->vertices[n].firstarc=p;
}
printf("建立的邻接表为:
\n");//输出建立好的邻接表
for(i=1;i<=G->vexnum;i++)
{
printf("%d",G->vertices[i].data);
for(p=G->vertices[i].firstarc;p;p=p->nextarc)
printf("%3d",p->adjvex);
printf("\n");
}}
voidFindInDegree(ALGraphG,intindegree[])//求入度操作
{
inti;
for(i=1;i<=G.vexnum;i++)
{
indegree[i]=0;
}
for(i=1;i<=G.vexnum;i++)
{while(G.vertices[i].firstarc)
{indegree[G.vertices[i].firstarc->adjvex]++;
G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc;
}
}
}
voidTopologicalSort(ALGraphG)//进行拓扑排序
{
intindegree[M];
inti,k,n;
intcount=0;
ArcNode*p;
SqStackS;
FindInDegree(G,indegree);
InitStack(&S);
for(i=1;i<=G.vexnum;i++)
{
printf("第%d个点的入度为%d\n",i,indegree[i]);
}
printf("\n");
for(i=1;i<=G.vexnum;i++)
{
if(!
indegree[i])
Push(&S,i);
}
printf("进行拓扑排序输出顺序为:
");//输出结果
while(!
StackEmpty(&S))
{
Pop(&S,&n);
printf("%4d",G.vertices[n].data);
count++;
for(p=G.vertices[n].firstarc;p!
=NULL;p=p->nextarc)
{
k=p->adjvex;
if(!
(--indegree[k]))
{
Push(&S,k);
}
}
}printf("\n");
if(count { printf("出现错误\n"); } else { printf("排序成功\n"); } } intmain(void)//主函数 { ALGraphG; CreatGraph(&G); TopologicalSort(G); system("pause"); return0; } 成 绩 教师签名 日 期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法与数据结构课程设计报告书 AOV网 算法 数据结构 课程设计 报告书 AOV