__ 2014 __年 ___5_月__ 19 __日
实现下图的邻接矩阵存储、输出图的深度优先搜索、图的广度优先搜索的序列算法。
明确说明程序的开发环境和功能要求。针对主要功能,给出如下说明:
(1) 输入参数的格式和合法取值范围
输入的格式为int 整形数据,其合法取值范围为:-21474836~2147483647
(2) 输出的格式 :%3d
(3) 测试数据:(1,2,12),(1,3,9),(3,1,-3),(3,5,14),(4,3,24),(5,2,18),(6,1,15),(6,4,-7),
(1)确定存储结构,并给出所用数据类型的数据结构定义
typedef int VertexData;
typedef struct Node
{
int data;
struct Node *next;
}LinkQueueNode;
typedef struct
{
LinkQueueNode *front;
LinkQueueNode *rear;
}LinkQuenue;
typedef struct
{
VertexData vertex[MAX_VERTEX_NUM];//顶点向量
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int vexnum,arcnum;//图的顶点数和弧数
}AdjMatrix;
(2)给出所用数据类型中每个操作的伪码算法
1. int LocateVertex(AdjMatrix *G,VertexData v)//求顶点位置函数
{
int j=Error,k;
for(k=0;k<G->vexnum;k++)
if(G->vertex[k]==v)
{
j=k;
break;
}
return(j);
}
2.int CreateUDG(AdjMatrix &G)//创建无向图
{
int i,j,k;
VertexData v1,v2;
printf("请输入图的顶点数:");
scanf("%d",&G.vexnum);
printf("请输入图的弧数:");
scanf("%d",&G.arcnum);
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arc[i][j]=0;
printf("请输入图的顶点:");
for(i=0;i<G.vexnum;i++)
scanf("%d",&G.vertex[i]);
printf("请输入一条弧的两个顶点\n");
for(k=0;k<G.arcnum;k++)
{
scanf("%d,%d",&v1,&v2);
i=LocateVertex(&G,v1);
j=LocateVertex(&G,v2);
G.arc[i][j]=1;
G.arc[j][i]=1;
}
return(ok);
}
3.void Display(AdjMatrix &G)
{
int i,j;
printf("该无向图的邻接矩阵如下图所示\n");
for(i=0;i<G.vexnum;++i)
{
for(j=0;j<G.vexnum;++j)
printf("%d ",G.arc[i][j]);
printf("\n");
}
}
4.void DepthFirstSearch(AdjMatrix G,int a) //深度优先搜索
{
int j;
printf(" %d ",a);
visited[a-1]=True;
for(j=1;j<=G.vexnum;j++)
if(visited[j-1]!=True&&G.arc[a-1][j-1]==1)
DepthFirstSearch(G,j);
}
5.int InitQueue(LinkQuenue *Q)//链队列的初始化
{
Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(Q->front!=NULL)
{
Q->rear=Q->front;
Q->front->next=NULL;
return(True);
}
else return(Error);
}
6.int EnterQueue(LinkQuenue *Q,int v0)//入队
{
LinkQueueNode *p;
p=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
if(p!=NULL)
{
p->data=v0;
p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return(True);
}
else return(Error);
}
7.int DeleteQueue(LinkQuenue *Q,int *x)//出队
{
LinkQueueNode *p;
if(Q->front==Q->rear)
return(Error);
p=Q->front->next;
Q->front->next=p->next;
if(Q->rear==p)
Q->rear=Q->front;
*x=p->data;
free(p);
return(True);
}
8.int Empty(LinkQuenue Q)//判断队列是否为空
{
if(Q.front==Q.rear)
return(True);
else return(0);
}
9.int FirstAdjVertex(AdjMatrix G,int k)//找第一个邻接点
{
int i;
for(i=0;i<G.vexnum;i++)
if(G.arc[k][i]==1&&visited[i]!=1)
{
return(i);
}
return(Error) ;
}
10.int NextAdjVertex(AdjMatrix G,int v,int v1)//找其他邻接点
{
int i;
for(i=v1+1;i<G.vexnum;i++)
{
if(G.arc[v][i]==1&&visited[i]!=1)
break;
}
if(i!=G.vexnum)
return(i);
return(Error);
}
11.void BreadthFirstSearch(AdjMatrix G,int b) //广度优先搜索
{
LinkQuenue Q;
int w,i;
for(i=0;i<MAX_VERTEX_NUM;i++)
visited[i]=0;
printf(" %d ",b);
visited[b-1]=1;
InitQueue(&Q);
EnterQueue(&Q,b);
while(!Empty(Q))
{
DeleteQueue(&Q,&b);
w=FirstAdjVertex(G,b-1);
while(w!=Error)
{
printf(" %d ",w+1);
visited[w]=1;
EnterQueue(&Q,w+1);
w=NextAdjVertex(G,b-1,w);
}
}
}
(1) 程序的调试中主要还是对基本概念,基本操作,不太熟悉了解,各种小问题程出不穷,
(2) 经验和体会
采用测试数据,列出实际的输入、输出结果。
见20121183067_李妍.cpp
实验名称:粉体真密度的测定粉体真密度是粉体质量与其真体积之比值,其真体积不包括存在于粉体颗粒内部的封闭空洞。所以,测定粉体的真密度…
研究生实验报告范本实验课程实验名称实验地点学生姓名学号指导教师范本实验时间年月日一实验目的熟悉电阻型气体传感器结构及工作原理进行基…
实验报告课程名称物证技术学实验项目名称捺印手印样本指纹显现提取班级与班级代码074213070853实验室名称或课室法学实验教学中…
滁州市政府组织退耕还林(黑体,小二,1.5倍行距,段前段后0.5行)——5060451007范雪花(学号,TimesNewRoma…
科学实验报告单1科学实验报告单2科学实验报告单3科学实验报告单4九完小科学实验报告单10九完小科学实验报告单11九完小科学实验报告…
滁州市政府组织退耕还林(黑体,小二,1.5倍行距,段前段后0.5行)——5060451007范雪花(学号,TimesNewRoma…
实验报告的书写是一项重要的基本技能训练。它不仅是对每次实验的总结,更重要的是它可以初步地培养和训练学生的逻辑归纳能力、综合分析能力…
附:实验报告格式模板有机合成综合实验报告实验名称姓名班级柜号实验日期室温一、实验目的1、…………………………………………2、…………
《ERP财务管理系统》实验报告(三)实验名称:固定资产系统(以下内容:字体小四,单倍行距。整篇报告至少5页,其中实验总结至少1页。…
2020学年第学期佛山职业技术学院食品营养与检测专业实验报告课程名称食品添加剂专业班级姓名学号所在组别同组成员实验地点实验时间实验…