数据结构拓扑排序实验报告与代码文档格式.docx
- 文档编号:20907621
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:15
- 大小:96.36KB
数据结构拓扑排序实验报告与代码文档格式.docx
《数据结构拓扑排序实验报告与代码文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构拓扑排序实验报告与代码文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
D={
|
∈CharSet,i=1,2,3,…..,n,n>
=0;
}
数据关系:
R={<
,
>
∈D,i=2,…,n}
存储结构:
(1)表结点
typedefstructArcNode
{
intadjvex;
structArcNode*nextarc;
}ArcNode;
(2)链表的存储结构
typedefstructVNode
intdata;
ArcNode*firstarc;
}VNode,AdjList[MAX_VEXTEX_NUM];
(3)图的存储结构
typedefstruct
AdjListvertices;
intvexnum,arcnum;
}ALGraph;
(4)栈的存储结构
typedefstruct
ElemType*base;
ElemType*top;
intstacksize;
}SqStack;
三.程序设计
根据算法设计中给出的有关数据和算法,选定物理结构,详细设计需求分析中所要求的程序。
包括:
人机界面设计、主要功能的函数设计、函数之间调用关系描述等。
1界面设计
1)欢迎界面
2)输入顶点与边的关系,并得到拓扑排序
2主要功能
1)初始化栈
voidInitStack(SqStack*S)//初始化栈
S->
base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!
S->
base){
printf("
memoryallocationfailed,goodbye"
);
exit
(1);
}
top=S->
base;
stacksize=STACK_INIT_SIZE;
2)出栈操作
intPop(SqStack*S,ElemType*e)//出栈操作
if(S->
top==S->
returnERROR;
*e=*--S->
top;
return0;
3)进栈操作
voidPush(SqStack*S,ElemTypee)//进栈操作
top-S->
base>
=S->
stacksize){
base=(ElemType*)realloc(S->
base,(S->
stacksize+STACKINCREMENT)*sizeof(ElemType));
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*S->
top++=e;
4)判断栈是否为空
intStackEmpty(SqStack*S)//判断栈是否为空
base)
returnOK;
else
5)构建图与欢迎界面
voidCreatGraph(ALGraph*G)//构建图
intm,n,i;
ArcNode*p;
************************************************\n"
欢迎使用拓扑排序\n"
制作者:
----\n"
请输入顶点数和边数:
"
scanf("
%d%d"
&
G->
vexnum,&
arcnum);
for(i=1;
i<
=G->
vexnum;
i++){
G->
vertices[i].data=i;
vertices[i].firstarc=NULL;
arcnum;
i++)//输入存在边的点集合
{
\n请输入存在边的两个顶点的序号:
n,&
m);
while(n<
0||n>
vexnum||m<
0||m>
vexnum){
输入的顶点序号不正确请重新输入:
p=(ArcNode*)malloc(sizeof(ArcNode));
if(p==NULL){
memoryallocationfailed,goodbey"
p->
adjvex=m;
nextarc=G->
vertices[n].firstarc;
vertices[n].firstarc=p;
6)找入度为零的结点
voidFindInDegree(ALGraphG,intindegree[])//找入度为零的节点
inti;
=G.vexnum;
indegree[i]=0;
while(G.vertices[i].firstarc){
indegree[G.vertices[i].firstarc->
adjvex]++;
G.vertices[i].firstarc=G.vertices[i].firstarc->
nextarc;
7)进行拓扑排序
voidTopologicalSort(ALGraphG)//进行拓扑排序
intindegree[M];
inti,k,n;
intcount=0;
SqStackS;
FindInDegree(G,indegree);
InitStack(&
S);
indegree[i])
Push(&
S,i);
进行拓扑排序输出顺序为:
\n"
//输出结果
while(!
StackEmpty(&
S)){
Pop(&
S,&
n);
%4d"
G.vertices[n].data);
count++;
for(p=G.vertices[n].firstarc;
p!
=NULL;
p=p->
nextarc){
k=p->
adjvex;
(--indegree[k])){
S,k);
if(count<
G.vexnum){
该有向图有回路"
}else{
排序成功\n"
3函数调用
四.测试与分析
1、不知道怎么选择储存结构
2、在写代码的过程中,没有弄清使用指针与引用之后,结构体如何使用。
当使用指针的时候要使用‘.’,当使用引用或数的时候,要使用‘->
’。
3、出栈入栈的条件很混乱,不知道该怎么去使用栈。
经验与体会:
这个程序,要求我们想的要尽量全面,要将所有情况考虑清楚,不仅有图的知识,还有对栈的灵活应用记。
在程序的全面性与健壮性上,我做的还不够好。
因为书上有代码,所以不是太难,在栈的那部分比较混乱,又复习了一遍,现在更好的掌握了栈的基本操作几项基本操作,也对拓扑序列有了更清楚的认识。
源程序:
#include<
STDIO.H>
STDLIB.H>
#defineMAX_VEXTEX_NUM20//最大顶点个数#defineM20
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
#defineOK1
#defineM20
#defineERROR0
typedefintElemType;
typedefstructArcNode//定义表结点结构
//与vi相邻接的顶点编号
//指向下一条弧(边)的指针
}ArcNode;
typedefstructVNode//定义表头结点结构
//指向第一条弧(边)的指针
}VNode,AdjList[MAX_VEXTEX_NUM];
typedefstruct//定义邻接表结构
//表头结点数组
//顶点和弧(边)的个数
}ALGraph;
typedefstruct//构件栈
}SqStack;
voidInitStack(SqStack*);
//函数声明
intPop(SqStack*,ElemType*);
voidPush(SqStack*,ElemType);
intStackEmpty(SqStack*);
voidCreatGraph(ALGraph*);
voidFindInDegree(ALGraph,int*);
voidTopologicalSort(ALGraph);
---\n"
intmain(void)//主函数
ALGraphG;
CreatGraph(&
G);
TopologicalSort(G);
system("
pause"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 拓扑 排序 实验 报告 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)