数据结构拓扑排序实验报告.docx
拓扑排序基本要求用邻接表建立一个有向图的存储结构。利用拓扑排序算法输出该图的拓扑排序 序列。编程思路首先图的创建,采用邻接表建立,逆向插入到单链表中,特殊注意有向是不需要对称插 入结点,且要把输入的字符在顶点数组中定位(LocateVex(Graph G, char *name),以便后 来的遍历操作,几乎和图的创建一样,图的顶点定义时加入int indegree,关键在于indegree 的计算,而最好的就是在创建的时候就算出入度,(没有采用书上的indegree。数组的方 法,那样会增加一个indegree算法,而是在创建的时候假如一句计数的代码 (G. vertices j. indegree) +;)最后调用拓扑排序的算法,得出拓扑序列。程序代码头文件:#paJina MAX_VHxTHX_NUM cO#paJina STAO为SIZH cO#paJina STAO为INOxHMHNT 10#paJina O 为I#paJina HxxOx°#paJinaINHHASIH 质 H#paJina OVHxH 质 OW<#paJina TxUH1#paJina HAJ贡SH0$AdapaJ in$ S$e$us:SAdapaJ in$ InJoTAda: $AdapaJ in$ S$e$us:SAdapaJ in$ SHIamT人da:/*定义弧的结构*/*该边所指向的顶点的位置*/*指向下一条边的指针*/*该弧相关信息的指针*/SAdapaJ s$t§uo$ AtioNopa in$ ep!vax: s$tiuo$ AtioNopa *nax$et§o: InJoTAda inJo:JArcNode;/*定义顶点的结构*/typedef struct VNodeint indegree;char data10;/*顶点信息*/ArcNode *firstarc;/*指向第一条依附该顶点的弧的指针*/VNodezAdjListMAX_VERTEX_NUM;/*定义图的结构*/ typedef struct Adj List vertices;/*图的当前顶点数和弧数*/*图的类型标志*/int vexnumzarcnum;int kind;Graph;/*定义栈的结构*/typedef struct(SEIemType *base;SEIemType *top;int stacksize;Stack;/*顶点定位*/int LocateVex(Graph G,char *name);/*创建有向图*/void CreateGra ph (Graph &G);/*拓扑排序*/StatusTopologicalSort(Graph G);/*初始化栈*/Status InitStack(Stack &s);/*判断空*/Status EmptyStack(Stack s);/*压栈*/Status Push(Stack &s,int e);/*出栈*/Status Pop(Stack &s,int &e);实现文件:include <stdio.h>#include,'malloc.h,#include "tuopupaixuhead.h"#include "stdlib.h"include "string.h"bool visitedMAX_VERTEX_NUM;/* 顶点定位,返回位序*/ int LocateVex(Graph G,char *name)(int i;for(i=l;i < =G.vexnum;i+)if(strcmp(name,G.verticesi.data)=O)返回数组的位置return i;return -1;/* 创建有向图* */void CreateGra ph (Graph &G) (ArcNode *p;char namel10,name210;int ijk;printf("请输入顶点数,按回车键结束:");scanf("d”,&Gvexnum);printf("请输入弧数,按回车键结束:");scanf("d”,&G.arcnum);printf("请挨次输入顶点名(用空格分开且字符小于10),按回车键结束:n)printf("");for(i=l;i<=G.vexnum;i+)初始化(scanf("%s”,G.verticesi.data);G.vertices i .fi rsta rc=NULL;G.verticesi.indegree=O;度数均初始化为 0)printf("nnnn");printf(" 输入小提示n");printfC &&&&1为避免输入遗漏,最好从选择任意一点,输入所有相邻边己);printf(” &&&&2输入边时格式(用空格分开,即格式为顶点(空格)顶点(空格) nM);printf("输入小提示nnnrT);for(k=0;k<G.arcnum;k+)printf(”请输入相邻的两个顶点,按回车键结束:");scanf("%s%s"/namel/name2);i=LocateVex(G,na mel);j 二 LocateVex(Gz na me2);(G.verticesj.indegree)+;每次作为弧的邻接点,则度数加1p=(ArcNode 判空*/Status EmptyStack(Stack s)malloc(sizeof(ArcNode);申请边节点p->adjvex=j;插入到邻接表中,注意此处为逆向插入到单链表中p->nextarc=G.verticesi.firstarc;G.verticesi.firsta rc=p;)/*初始化栈*IStatus InitStack(Stack &s)创建一个空栈( s.base=(i nt*) ma I loc(STAC KSIZE*sizeof (i nt);if(!s.base)return (OVERFLOW);s.top=s.base;s.stacksize=STACKSIZE;return OK; /*if(s.base=s.top) return 1;elsereturn 0;/* 压栈拓扑排序*IStatus Push(Stack &szint e) (if(s.top-s.base)> s.stacksize) s.base=(S 曰 emType*)realloc(s.base,(STACKSIZE+STACKINCREMENT)*sizeof(S日emTyp e);if(!s.base)return( OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;)*s.top+=e;return OK; )/* 出栈*/Status Pop(Stack &sjnt &e) (e=*-s.top;return OK;)/*Status TopologicalSort(Graph G) ( int i,j,k,e;拓扑排序函数int count=0;Stack S;InitStack(S);for(i=l;i<=G.vexnum;+i)if(G.verticesi.indegree=O)置Push(SJ);while(!EmptyStack(S)(Pop(S,e);j=e;count+;printf("%s "zG.verticesj.data);用来统计顶点的个数定义一个栈,用来保存入度为0的顶点初始化栈若第i个顶点的入度为0 , i表示顶点在图中的位将第i个顶点入栈将为入度。的顶点位置出栈统计顶点的个数输出入度为0的顶点ArcNode *p;for(p=G.verticesj.firstarc; p ;p=p->nextarc) 找与第j个顶点的邻接顶点,并将其入度减1 (k=p->acljvex;(G.verticesk.indegree);if(G.verticesk.indegree=0)如果入度为 0,就入栈Push(Szk); )return OK;if(count<G.vexnum) “count小于顶点的个数时候,说明有环,不符合拓扑排序的要 求 (printf("n不是有向无环图!n)return ERROR;退出主文件:#include <stdio.h>#include"malloc.h"#include "tuopupaixuhead.h"#include "stdlib.h"#include"string.h"/*界面控制*Ivoid mainQGraph G;printfCXn#拓 扑 排 序#n“);printf(Hn$n*'); printf("n");CreateGraph(G);printf("各点入度分布如下:nn");for(int i=l;i<=G.vexnum;i+)输出顶点的度数printf("第d 个顶点s 的度数是dn”,i,G.verticesi.data,G.verticesi.indegree ); printf("nnn");printf("有向图所有顶点的拓扑排序:n)TopologicalSort(G);printfCXn");)实验数据与结果测试数据:$请请请MB底粗按里走神组束/会配展瑞知且字符小于 .按回车健结束,2 3 4 5 6 7椅M寸是示&&&虱为酒兔输入靖漏,最好从甑有邕一启,输入所有相邻边 &&8A2埼人时格式用空格分开.,即嵇或为顶点(至枢)顶点(空格) 输入不短小11456?23114-5J结结结结结结键键键键键键s±t±J回回回可回回Hi占苗X窖苫3点溜顶顶顶顶HJI)"T-11inin-£n-CnF-s.由谷令堀定名.TTt声k齐入入入入入入(ij>,LV.HuairMMH'-UH'UH-tt青青青青青青,实验结果2 0 A 1 1 1 1 数数数数数数散 度度度度度度度 lh,lhL ,尸、,卜、4MX" 12 3 4 5 6 7 点点点晨卡点会 顶顶顶顶顶顶顶 ATTTTTTT 12 3 4-567 >nr7gr>>nr?>np§r?§ ngr>有向图所有顶点的拓扑排序:3 2 14 6 5 7Peess any key to continue