求顶点的入出度.docx
《求顶点的入出度.docx》由会员分享,可在线阅读,更多相关《求顶点的入出度.docx(12页珍藏版)》请在冰豆网上搜索。
求顶点的入出度
设计题目求顶点的入出度
学院名称 信息工程学院
目录
1.实验题目--求顶点的入出度------------------
2.设计目标---------------------------
3.问题描述---------------------------
4.需求分析---------------------------
采用邻接表作为存储结构
5.概要设计---------------------------
6.详细设计(给出程序的伪码描述和流程图)------------
1) 建立图的邻接表
2) 求出各顶点的入度
3) 求出各顶点的出度
7.测试分析----------------------------
8.使用说明----------------------------
9.测试数据---------------------------
1)白盒测试
2)黑盒测试
十.课程设计总结-------------------------
1.题目:
求顶点的入出度
2.设计目标
通过课程设计,巩固和加深对线性表,图,等理论知识的理解,更好地掌握C语言的基本知识和语法法则.从而培养和提高我们编写程序的能力,而且能帮助学生熟练地掌握求顶点的入出度和邻接表存储结构的实现.
3.问题描述
对于给定的有向图,采用邻接表作为存储结构,求各顶点的入度和出度.其中要求输入有向图的顶点数、顶点信息、顶点有序对,以及完成以下功能:
1)建立图的邻接表;
2)求出各顶点的入度;
3)求出各顶点的出度。
4.需求分析
一个完整的程序应具有以下功能:
1)结构体的定义
定义邻接点类型,顶点,图的邻接表存储结构.
2)有向图G的构造函数(CreateLGraph)
采用邻接表存储表示,构造有向图G:
定义循环变量i,边结点指针*p和有向边的两个顶点v1,v2,初始化表头指针以及链表的插入.
3)释放内存空间函数(DeleteLGraph)
释放图G邻接表各顶点的边链表中的所有边结点所占的存储空间.
4)主函数(main)
定义顶点的入度id和出度od,分别输入顶点个数和边数以及统计各顶点出度和入度并输出.并且调用CreateLGraph函数和DeleteLGraph函数.
5.概要设计
1.结构体的定义
typedefcharInfoType;
typedefcharVertexType;
typedefstructArcNode//邻接点类型
{
intadjvex;//邻结点序号
structArcNode*nextarc;//指向下一个邻接点的指针
InfoType*info;//该弧相关信息的指针
}ArcNode;
typedefstructVexNode//顶点
{
VertexTypedata;//顶点信息
ArcNode*head1;//出边表的表头指针
ArcNode*head2;//入边表的表头指针
}VexNode;
typedefstruct//图的邻接表存储结构
{
VexNodevertexs[MAXVEX];//顶点数组
intvexnum,arcnum;//图的当前顶点数和边数
}LGraph;
2.所实现的功能如下:
1)有向图G的构造函数(CreateLGraph)
采用邻接表存储表示,构造有向图G:
定义循环变量i,边结点指针*p和有向边的两个顶点v1,v2,初始化表头指针以及链表的插入.
2)释放内存空间函数(DeleteLGraph)
释放图G邻接表各顶点的边链表中的所有边结点所占的存储空间.
3)主函数(main)
定义顶点的入度id和出度od,分别输入顶点个数和边数以及统计各顶点出度和入度并输出.并且调用CreateLGraph函数和DeleteLGraph函数.
6.详细设计(给出算法的伪码描述和流程图)
总体操作步骤:
1)请输入顶点个数:
2)请输入边数:
3)请输入第i个结点的起点:
4)请输入第i个结点的终点:
5)输出每个结点的出度和入度.
程序源代码:
#include
#include
#include
#defineMAXVEX100//最多顶点个数
typedefcharInfoType;
typedefcharVertexType;
typedefstructArcNode//邻接点类型
{
intadjvex;//邻结点序号
structArcNode*nextarc;//指向下一个邻接点的指针
InfoType*info;//该弧相关信息的指针
}ArcNode;
typedefstructVexNode//顶点
{
VertexTypedata;//顶点信息
ArcNode*head1;//出边表的表头指针
ArcNode*head2;//入边表的表头指针
}VexNode;
typedefstruct//图的邻接表存储结构
{
VexNodevertexs[MAXVEX];//顶点数组
intvexnum,arcnum;//图的当前顶点数和边数
}LGraph;
LGraphlg;//图(邻接表存储)
voidCreateLGraph()//采用邻接表存储表示,构造有向图G
{
inti=0;//循环变量
ArcNode*p;//用来构造边链表的边结点指针
intv1,v2;//有向边的两个顶点
for(i=0;ilg.vertexs[i].head1=lg.vertexs[i].head2=NULL;
for(i=0;i{
printf("请输入第%d条边的起点:
",i+1);
scanf("%d",&v1);//输入一条边的起点
printf("请输入第%d条边的终点:
",i+1);
scanf("%d",&v2);//输入一条边的终点
v1--;
v2--;
p=(ArcNode*)malloc(sizeof(ArcNode));//假定有足够空间
p->adjvex=v2;
p->nextarc=lg.vertexs[v1].head1;//插入链表
lg.vertexs[v1].head1=p;
p=(ArcNode*)malloc(sizeof(ArcNode));//假定有足够空间
p->adjvex=v1;
p->nextarc=lg.vertexs[v2].head2;//插入链表
lg.vertexs[v2].head2=p;
}
}
voidDeleteLGraph()
//释放图G邻接表各顶点的边链表中的所有边结点所占的存储空间
{
inti;//循环变量
ArcNode*p;//用来指向边链表中各边结点的指针
for(i=0;i{
p=lg.vertexs[i].head1;
//释放第i个顶点出边表各边结点所占的存储空间
while(p!
=NULL)
{
lg.vertexs[i].head1=p->nextarc;
free(p);//deletepi;
p=lg.vertexs[i].head1;
}
p=lg.vertexs[i].head2;
//释放第i个顶点入边表各边结点所占的存储空间
while(p!
=NULL)
{
lg.vertexs[i].head2=p->nextarc;
free(p);
p=lg.vertexs[i].head2;
}
}
}
intmain()//循环变量
{
inti;
intid,od;//顶点的入度和出度
ArcNode*p;//用来遍历边链表的边结点指针
while
(1)
{
lg.vexnum=lg.arcnum=0;
printf("请输入顶点个数:
");
scanf("%d",&lg.vexnum);//输入顶点个数
printf("请输入边数:
");
scanf("%d",&lg.arcnum);//输入边数
if(lg.vexnum==0)
break;//输入数据结束
CreateLGraph();//构造有向图的邻接表结构
for(i=0;i{
printf("%d结点的出度为:
",i+1);
od=0;
p=lg.vertexs[i].head1;
while(p!
=NULL)
{
od++;
p=p->nextarc;
}
if(i==0)
printf("%d\n",od);
else
printf("%d\n",od);
}
printf("\n");
for(i=0;i{
printf("%d结点的入度为:
",i+1);
id=0;
p=lg.vertexs[i].head2;
while(p!
=NULL)
{
id++;
p=p->nextarc;
}
if(i==0)
printf("%d\n",id);
else
printf("%d\n",id);
}
printf("\n");
DeleteLGraph();//释放
}
return0;
}
流程图如下:
7.测试分析
白盒:
查找代码完整性
黑盒:
测试是否可以正确的实现以下操作:
1) 建立图的邻接表
2) 输出各顶点的入度
3) 输出各顶点的出度
8.使用说明
打开开始菜单找到VC++6.0,打开此软件,用鼠标单击文件菜单里的打开选项,导入文件,按ctrl+F7,看程序是否有错误,如果没有错误按ctrl+F5进行运行.
首先在运行程序时根据弹出来的提示语句进行操作:
1)请输入顶点个数:
2)请输入边数:
3)请输入第i个结点的起点:
4)请输入第i个结点的终点:
5)输出每个结点的出度和入度.
我们根据提示,进行相应的输入即可.以此类推,按提示进行选择即可.
9.测试数据
测试内容
测试结果
输入顶点个数
正确
输入边数
正确
输入每条边的起点和终点
正确
输出入度和出度
正确
输入顶点个数:
输入边数:
输入每条边的起点和终点:
输出入度和出度:
10.课程设计总结
通过这次课程设计让我学到了许多东西,还巩固了我学过的知识,在设计的过程中遇到了许多问题,但是我没有放弃,在老师和同学的帮助下,我终于完成了程序,在这期间我也发现了自己的不足之处,特别是对以前所学过的知识理解的不够深刻,比如图,结构体,邻接表的存储结构等等.我收获很多,也很感谢各位老师.这次课程设计也让我明白了,只要努力了,就会有希望,就会有成功的机会.