拓扑排序课程设计报告Word文档下载推荐.docx
《拓扑排序课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《拓扑排序课程设计报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
//指向第一条弧(边)的指针
}V_Node,AdjList[MAX_NUM];
typedefstruct//定义邻接表结构
AdjListvertices;
//表头结点数组
intvex_num,arc_num;
//顶点和弧(边)的个数
}ALGraph;
typedefstruct//构件栈
Elem_T*base;
Elem_T*top;
intstacksize;
}Sq;
2、模块功能
1)voidInit(Sq*S);
功能:
初始化栈。
构造一个空栈S
参数:
*S待初始化的栈
2)intStack(Sq*S)
判断空栈
S待判断的栈
返回值:
栈为空返回1;
栈非空返回0
3)VoidInt(Sq*S,Elem_Te)
元素入栈
*S待操作的栈;
插入元素e为新的栈顶元素
4)voidOut(Sq*S,Elem_Te);
元素出栈
若栈不空,则删除S的栈顶元素,用e返回其值,并返回1;
否则返回0
5)voidCreat_Graph(ALGraph*G)
建立图。
函数内包含了由用户输入顶点数、弧数、顶点以及弧的操作
*G待操作的图
图建立成功返回1;
图建立失败返回0
6)voidFind_InDegree(ALGraphG,intindegree[])
求顶点的入度
G待操作的图,indegree[]储存每个顶点的入度的数组
7)voidTuoPu(ALGraphG);
实现拓扑排序,并在图形界面上演示排序过程
G待进行拓扑排序的图
错误判断:
包含有向图是否有环的判断
四详细设计
源代码详情如下:
//*****拓扑排序*********//
//******张雪涛*********//
//*****2013.12.27******//
//*****函数头文件、宏定义、变量声明*******//
#include<
STDIO.H>
STDLIB.H>
#defineMAX_NUM15
#defineSTACK_SIZE100
#defineSTACK_MENT10
#defineOK1
#defineM20
#defineERROR0
#defineNUM15
typedefintElem_T;
charnumber1[NUM];
charnumber2[NUM];
//********函数声明***********//
voidInit(Sq*);
intStack(Sq*);
voidTuoPu(ALGraph);
intOut(Sq*,Elem_T);
intInt(Sq*,Elem_T*);
voidCreat_Graph(ALGraph*);
voidFind_InDegree(ALGraph,int*);
//********主函数***********//
intmain(void)
charnum='
Y'
;
FILE*fp;
fp=fopen("
num1.txt"
"
r"
);
//打开num1文件
if(fp!
=NULL)
{
for(inti=1;
i<
=NUM;
i++){
fscanf(fp,"
%d"
&
number1[i]);
//将文件的内容读入number1数组中
}
fclose(fp);
//关闭文件
}
num2.txt"
//打开文件num2
number2[i]);
//读取文件的内容到number2中
while
(1)
printf("
\n欢迎您继续使用,请选择YorN:
"
//判断是否为Y,若是则继续运行,若是N则退出
scanf("
%c"
num);
if(num=='
N'
)
exit(0);
ALGraphG;
Creat_Graph(&
G);
//调用函数创建有向图
TuoPu(G);
//进行拓扑排序
return0;
}
voidInit(Sq*S)//初始化栈
S->
base=(Elem_T*)malloc(STACK_SIZE*sizeof(Elem_T));
//构建空指针
if(!
S->
base){
memoryallocationfailed,goodbye"
//判断是否建立成功
exit
(1);
top=S->
base;
stacksize=STACK_SIZE;
intOut(Sq*S,Elem_T*e)//出栈操作
if(S->
top==S->
returnERROR;
*e=*--S->
top;
voidInt(Sq*S,Elem_Te)//进栈操作
top-S->
base>
=S->
stacksize){
base=(Elem_T*)realloc(S->
base,(S->
stacksize+STACK_MENT)*sizeof(Elem_T));
}
base+S->
stacksize;
stacksize+=STACK_MENT;
*S->
top++=e;
intStack(Sq*S)//判断栈是否为空
base)
returnOK;
else
voidCreat_Graph(ALGraph*G)//构建图
intm,n,i,j;
A_Node*p;
\n***************************************************\n"
*********欢迎您使用拓扑排序***********\n"
*********制作者:
张雪涛***********\n"
*********学号:
10056041***********\n"
***************************************************\n"
请输入顶点数和边数:
1015"
G->
vex_num=10;
//要构建的顶点个数
arc_num=15;
//要构建的边数
for(i=1;
i<
=G->
vex_num;
i++){
vertices[i].data=i;
//构建顶点
vertices[i].firstarc=NULL;
j=1;
arc_num;
i++)//输入存在边的点集合
if(j>
15)
{j=1;
n=number1[j];
//起点数组
m=number2[j];
//终点数组
printf("
\n第"
%d"
i);
if(i>
=10)
printf("
条边的两顶点序号分别为为:
else
条边的两顶点序号分别为为:
n);
//打印构建的边
m);
j++;
//scanf("
%d%d"
&
n,&
m);
while(n<
0||n>
vex_num||m<
0||m>
vex_num){
\n输入的顶点序号不正确请重新输入!
p=(A_Node*)malloc(sizeof(A_Node));
//构建空链表
if(p==NULL){
memoryallocationfailed,goodbey"
p->
adjvex=m;
//表头指向终点
nextarc=G->
vertices[n].firstarc;
vertices[n].firstarc=p;
voidFind_InDegree(ALGraphG,intindegree[])//找入度为零的节点
inti;
=G.vex_num;
indegree[i]=0;
while(G.vertices[i].firstarc){
indegree[G.vertices[i].firstarc->
adjvex]++;
G.vertices[i].firstarc=G.vertices[i].firstarc->
nextarc;
voidTuoPu(ALGraphG)//进行拓扑排序
intindegree[M];
inti,k,n;
intcount=0;
//用来统计顶点的个数
//定义一个栈,用来保存入度为0的顶点
SqS;
Find_InDegree(G,indegree);
//查找深度
Init(&
S);
//初始化栈
indegree[i])//如果深度为0则入栈
Int(&
S,i);
if(count<
G.vex_num){
\n\n该有向图有回路!
!
\n"
else{
\n进行拓扑排序输出顺序为:
//输出结果
while(!
Stack(&
S)){
Out(&
S,&
n);
//出栈
%4d"
G.vertices[n].data);
//打印结果
count++;
for(p=G.vertices[n].firstarc;
p!
=NULL;
p=p->
nextarc){
k=p->
adjvex;
(--indegree[k]))//自减若深度为0则入栈
Int(&
S,k);
//入栈
排序成功\n"
五调试分析
1、测试数据
图的拓扑排序:
1
4
24444
5
6
7
8
9
3
10
2、存在过的问题以及分析解决
(1)本课程设计采用先把主体结构写好后在网结构中添加具体的分布功能。
采用的是主分式的形式以保证一个功能不能实现并不影响其他的功能。
(2)课程设计有较好的容错能力,能够让一般用户也不出错,能正确的输入信息和统计,保证了正确性。
(3)修改的时候采用一边调试一边修改,并不断尝试错误输入和验证。
六测试结果
测试结果如下图所示:
正常使用:
继续选择是否使用:
错误的输入如下:
有回路的操作如下:
七用户使用说明
运行程序前在工程文件中输入所构造图的边顶点并保存,运行后会输出图的顶点数,边数,顶点信息,图的所有边数,构造的连接表,每个顶点的入度和有向无环图的拓扑排序及对有环图进行说明。
再按任意键,结束程序运行,进行对其他图的拓扑排序。
八课程设计总结
根据本课程设计的实验,从中学到了编程其实也是一项很有考验性的活动,从很大程度上提高了我们对这门课程的了解和学习,并学会从实践中总结经验,从实验中找到方法,通过本次课程设计加深了对所学知识的理解。
大家都知道,编程是一件很需要耐心的事。
因为几乎每一个程序的编写,都需要学习新的知识才能进行,同时程序调试过程很枯燥,有时候一点小错意味着长时间的查错。
如语法错误中,“;
”丢失、“{”与“}”不匹配等问题最难定位到出错语句;
逻辑错误中,作为循环变量的“i”与“j”相互混淆、对未分配空间的节点进行操作等,都会使程序运行出错而难以找到原因。
算法设计、程序调试的过程中,经常遇到看似简单但又无法解决的问题,这时候很容易灰心丧气,此时切不可烦躁,一定要冷静的思考,认真的分析;
而解决问题,完成程序后,那种兴奋感与成就感也令人振奋。
可以说编写程序既是一件艰苦的工作,又是一件愉快的事情。
在完成课程设计的过程中,我加深了对程序结构的了解程度,对各种语句理解也更透彻,学会了灵活运用。
同时体会到了团队合作的乐趣,一向惯于“独立思考”的我们学会了积极地同团队成员交流,取长补短,共同进步,只有和同学多交流多学习才能不断地提高自身水平。
总之,这学期的数据结构课程设计,让我们学到了很多,受益匪浅。