实验六 图的应用及其实现
更新时间:2023-09-13 20:43:01 阅读量: 教学研究 文档下载
- 实验六实验报告表推荐度:
- 相关推荐
实验六 图的应用及其实现
一、实验目的
1.进一步功固图常用的存储结构。
2.熟练掌握在图的邻接表实现图的基本操作。
3.理解掌握AOV网、AOE网在邻接表上的实现以及解决简单的应用问题。
二、实验内容
从键盘上输入AOV网的顶点和有向边的信息,建立其邻接表存储结构,然后对该图拓扑排序,并输出拓扑序列. 试设计程序实现上述AOV网的类型定义和基本操作,完成上述功能。
相关常量及结构定义:
typedef int InfoType; typedef char VertexType; typedef int SElemType;
#define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STAXKINCREMENT 10 //存储空间分配增量 #define MAX_VERTEX_NUM 20 typedef struct ArcNode {
int adjvex;
struct ArcNode *nextarc; InfoType *info; }ArcNode;
typedef struct VNode {
VertexType data;
struct ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct ALGraph
{ AdjList vertices; int vexnum, arcnum;
int kind; }ALGraph;
typedef struct {
SElemType *base; SElemType *top; int stacksize; }SqStack;
设计相关函数声明:
int CreateDG(ALGraph &G) int InitStack(SqStack &S) int Push(SqStack &S,SElemType e)
int Pop(SqStack &S,SElemType &e) int StackEmpty(SqStack S)
void FindInDegree(ALGraph G,int *indegree) int TopologicalSort(ALGraph G)
三、数据结构与核心算法的设计描述
1.创建AOV网
int CreateDG(ALGraph &G) {
int i,j,k,v1,v2;
cout<<\请输入该图的顶点数:\请输入该图的边数:\ cin>>G.vexnum>>G.arcnum; for(i=0;i G.vertices[i].data=i; G.vertices[i].firstarc=NULL; } cout<<\请输入一条边的始点和终点:\ for(k=0;k cout<<\请输入第 \条边的始点和终点: \ cin>>v1>>v2; i=v1; j=v2; while(i<1||i>G.vexnum||j<1||j>G.vexnum) { cout<<\请输入第 \条边的始点和终点: \ cin>>v1>>v2; i=v1; j=v2; } i--;j--; ArcNode *p; p=(ArcNode *)malloc(sizeof(ArcNode)); if(!p) return -1; p->adjvex=j; p->nextarc=G.vertices[i].firstarc; p->info=NULL; G.vertices[i].firstarc=p; G.vertices[i]; } return 0; } 2.初始化栈 int InitStack(SqStack &S) { S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return 0; } 3.入栈 int Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STAXKIN CREMENT)*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base+S.stacksize; S.stacksize+=STAXKINCREMENT; } *S.top++=e; return 0; } 4.出栈 int Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return -1; e=*--S.top; return 0; } 5.判断栈是否为空 int StackEmpty(SqStack S) { if(S.top==S.base) return -1; else return 0; } 6.个顶点入度 void FindInDegree(ALGraph G,int *indegree) { int i; for(i=0;i for(i=0;i while(G.vertices[i].firstarc) { indegree[G.vertices[i].firstarc->adjvex]++; G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc; } } 7.拓扑排序 int TopologicalSort(ALGraph G) { int i,k,indegree[MAX_VERTEX_NUM]; ArcNode *p; SqStack S; FindInDegree(G,indegree); InitStack(S); for(i=0;i if(!indegree[i]) Push(S,i); } int count=0; while(!StackEmpty(S)) { Pop(S,i); cout< for(p=G.vertices[i].firstarc; p; p=p->nextarc) { k=p->adjvex; if(!(--indegree[k])) Push(S,k); } } if(count 四、函数的调用 主函数主要设计: int main() { ALGraph G; CreateDG(G); TopologicalSort(G); return 0; } 五、实验总结 本次试验通过对有向图进行拓扑排序,我了解了有向图邻接表的存储结构更重要的的是学会了对有向图的拓扑排序算法,其中也将之前学过的栈结合起来,巧妙的找到了一个拓扑序列,可不足的是,该算法只能找到这一条拓扑序列,但是我相信通过完成了这次试验后我会改进算法而能将图的所有的拓扑序列找出来。 六、程序清单 #include typedef int SElemType; #define STACK_INIT_SIZE 100 #define STAXKINCREMENT 10 #define MAX_VERTEX_NUM 20 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; InfoType *info; }ArcNode; typedef struct VNode { VertexType data; struct ArcNode *firstarc; }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct ALGraph { AdjList vertices; int vexnum, arcnum; int kind; }ALGraph; typedef struct { SElemType *base; SElemType *top; int stacksize; }SqStack; int CreateDG(ALGraph &G) { int i,j,k,v1,v2; cout<<\请输入该图的顶点数:\请输入该图的边数: cin>>G.vexnum>>G.arcnum; for(i=0;i G.vertices[i].data=i; G.vertices[i].firstarc=NULL; } cout<<\请输入一条边的始点和终点:\ for(k=0;k \ { cout<<\请输入第 \条边的始点和终点: \ cin>>v1>>v2; i=v1; j=v2; while(i<1||i>G.vexnum||j<1||j>G.vexnum) { cout<<\请输入第 \条边的始点和终点: \ cin>>v1>>v2; i=v1; j=v2; } i--;j--; ArcNode *p; p=(ArcNode *)malloc(sizeof(ArcNode)); if(!p) return -1; p->adjvex=j; p->nextarc=G.vertices[i].firstarc; p->info=NULL; G.vertices[i].firstarc=p; G.vertices[i]; } return 0; } int InitStack(SqStack &S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return 0; } int Push(SqStack &S,SElemType e) { if(S.top-S.base>=S.stacksize) { S.base=(SElemType*)realloc(S.base,(S.stacksize+STAXKINCREMENT)*sizeof(SElemType)); if(!S.base) exit (-1); S.top=S.base+S.stacksize; S.stacksize+=STAXKINCREMENT; } *S.top++=e; return 0; } int Pop(SqStack &S,SElemType &e) { if(S.top==S.base) return -1; e=*--S.top; return 0; } int StackEmpty(SqStack S) { if(S.top==S.base) return -1; else return 0; } void FindInDegree(ALGraph G,int *indegree) { int i; for(i=0;i for(i=0;i while(G.vertices[i].firstarc) { indegree[G.vertices[i].firstarc->adjvex]++; G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc; } } int TopologicalSort(ALGraph G) { int i,k,indegree[MAX_VERTEX_NUM]; ArcNode *p; SqStack S; FindInDegree(G,indegree); InitStack(S); for(i=0;i if(!indegree[i]) Push(S,i); int count=0; while(!StackEmpty(S)) { Pop(S,i); cout< for(p=G.vertices[i].firstarc; p; p=p->nextarc) { k=p->adjvex; if(!(--indegree[k])) Push(S,k); } } if(count int main() { ALGraph G; CreateDG(G); TopologicalSort(G); return 0; }
正在阅读:
实验六 图的应用及其实现09-13
用Telnet命令收发邮件(SMTP和POP3协议)实验报告07-09
劳动节放假安排,201702-19
国际海运货运术语03-28
雨缘作文800字07-15
2015民家中学安全工作计划(7)10-13
加强党性修养心得体会优选范文04-03
- 公务员上岸同学告诉你,怎样走出面试中常见的十大误区
- 作表率,我们怎么办(办公室主任)
- 乘务员安全责任书
- 增员面试流程
- 河南省焦作市规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 最新4社区工作者面试题
- 个人简历表
- 男教工体检必检项目
- 河南省兰考县规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 兼职译员测试稿
- 河南省开封市规模以上租赁和商务服务业企业应付职工薪酬数据洞察报告2019版
- 永州职业技术学院校园总体规划-永州职业学院
- 最新5、培训科长笔试题(答案)
- 2019雅商酒店境外人员登记培训稀有资料,不可错过
- 小学教师求职简历范文
- 红酒知识与礼仪
- 春节给领导拜年的短信拜年词
- 2019年上半年中小学教师资格证结构化面试真题1
- 20XX年县干部培训工作目标
- 硬笔试听课
- 及其
- 实验
- 实现
- 应用
- 浙美版小学美术第一册教案全册新版
- 构词法在语法填空中的运用
- 中医基础理论知识总结
- 5.工商行政管理知识经典试题
- 第八章 - 船舶修理分解
- (发各部门)贵州省县域经济发展状况问卷调查表 - 图文
- 采煤概论 - 图文
- 八年级上学期第三次月考试卷分析
- 关于四方东部市政配套工程(一期、三期)道路征地手续办理情况汇报-word范文模板(1页)
- 内蒙古商贸职业学院公开自聘选拔学生辅导员 - 图文
- 三桂煤矿探放水措施及专项设计
- 杭电 现代经济管理基础复习整理
- 我国非政府组织的改革现状
- 大学生饮品市场调查预案1
- 教育学考点记录
- 信息化建设和软件项目招标评分方法
- 2012年国家注册企业风险管理师文件通知
- 科学营活动心得体会
- 入厂员工安全教育培训试题及答案
- 《论语》、《孟子》“阳货”、“阳虎”非一人考辨