数据结构实验3报告doc.docx
《数据结构实验3报告doc.docx》由会员分享,可在线阅读,更多相关《数据结构实验3报告doc.docx(12页珍藏版)》请在冰豆网上搜索。
![数据结构实验3报告doc.docx](https://file1.bdocx.com/fileroot1/2023-2/23/26e67003-0086-447d-8b7c-fff7b1c0afdb/26e67003-0086-447d-8b7c-fff7b1c0afdb1.gif)
数据结构实验3报告doc
任课教师:
孙树森
《数据结构与算法》
(2012-2013学年第2学期)
实
验
报
告
学号:
2011329700214
姓名:
周咪咪
班级:
11数字媒体技术
(2)班
实验3图的建立与操作
一、实验目的和要求
在熟悉图的存储、遍历、及其应用的基础上,通过键盘输入数据,建立一个无向图的邻接表,输出该邻接表,并计算每个顶点的度。
达到巩固图的存储思想及其存储实现。
二、实验内容
完成下图的邻接表表示,并计算每个顶点的度。
附加要求:
进行深度优先和广度优先遍历
3、程序源码
#include
#include
#include
usingnamespacestd;
//----------无向图的邻接存储表示--------------
#defineMAX_VERTEX_NUM8//顶点最大个数
intarc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//数组用于存储边信息
boolvisited[MAX_VERTEX_NUM];
typedefstructArcNode//边表结点
{
intadjvex;//邻接点域,存储该顶点对应的下标
structArcNode*next;//链域,指向下一个邻接点
intweight;//存储边的权值
}ArcNode;
#defineVertexTypechar//顶点元素类型
typedefstructVNode//顶点表结构
{
intdegree;//顶点的度
VertexTypedata;//顶点域,存储顶点信息
ArcNode*firstarc;//边表头指针
}VNode/*头结点*/,AdjList[MAX_VERTEX_NUM];
typedefstruct{
AdjListvertices;//顶点
intnumNodes,numEdges;//当前顶点数,边数
}ALGraph;
typedefstruct{
int*elem;
intfront,rear;
}Queue;
voidInitQueue(Queue&Q)
{
Q.elem=newint[MAX_VERTEX_NUM];
Q.front=Q.rear=0;
}
intQueueEmpty(QueueQ)
{
if(Q.front==Q.rear)
return0;
elsereturn1;
}
voidEnQueue(Queue&Q,inte)
{
if((Q.rear+1)%MAX_VERTEX_NUM!
=Q.front)
Q.elem[Q.rear]=e;
else
printf("队列满!
\n");
Q.rear=(Q.rear+1)%MAX_VERTEX_NUM;
}
voidDeQueue(Queue&Q,int&e)
{
if(Q.rear!
=Q.front)
e=Q.elem[Q.front];
elseprintf("队列空!
\n");
Q.front=(Q.front+1)%MAX_VERTEX_NUM;
}
//---------建立无向图--------------
voidCrateALGraph(ALGraph*G)
{
inti,j,k;
//ArcNode*e;
printf("输入顶点数和边数:
\n");
scanf("%d,%d",&G->numNodes,&G->numEdges);
for(i=0;inumNodes;i++)//读入顶点信息,建立顶点表
{
printf("输入顶点信息:
\n");
cin>>G->vertices[i].data;
G->vertices[i].firstarc=NULL;//将边表置为空表
visited[i]=false;
}
for(k=0;knumEdges;k++)//建立边表
{
printf("输入边(vi,vj)上的顶点序列:
\n");
scanf("%d,%d",&i,&j);//输入边(vi,vj)上的顶点序号
arc[i][j]=1;//两个顶点之间有边记作1
ArcNode*s1,*s2;
s1=(ArcNode*)malloc(sizeof(ArcNode));//向内存申请空间,生成边表结点
s1->adjvex=j;//邻节序号为j
s1->next=G->vertices[i].firstarc;//将e的指针指向当前顶点上指向的结点
G->vertices[i].firstarc=s1;//将当前顶点的指针指向e
s2=(ArcNode*)malloc(sizeof(ArcNode));//向内存申请空间,生成边表结点
s2->adjvex=j;//邻节序号为i
s2->next=G->vertices[i].firstarc;//将e的指针指向当前顶点上指向的结点
G->vertices[i].firstarc=s2;//将当前顶点的指针指向e
}
}
//--------输出邻接表--------
voiddisplay(ALGraph*G)
{
ArcNode*p;
printf("邻接表如下:
\n");
for(inti=0;inumNodes;i++)
{
printf("(%d),%c:
",i,G->vertices[i].data);//输入下标和对应顶点的信息
p=G->vertices[i].firstarc;
while(p!
=NULL)//输出相关顶点
{
printf("->%c",p->adjvex);
p=p->next;
}
printf("\n");
}
}
//--------计算无向图的度-----------
voidDegreeNum(ALGraph*G)//与顶点相关的度
{
inti,j;
intdegreenum;
for(j=1;j<=G->numNodes;j++)
{
degreenum=0;
for(i=0;inumNodes;i++)
{
if(arc[j][i]==1||arc[i][j]==1)//v,i有边相连
degreenum++;
}
printf("与顶点%c度为:
%d\n",G->vertices[i].data,degreenum);
}
}
//-------深度优先搜索遍历---------
voidDFS(ALGraphG,inti)
{
ArcNode*p;
visited[i]=true;
printf("%c",G.vertices[i].data);
p=G.vertices[i].firstarc;
while(p)
{
if(!
visited[p->adjvex])
DFS(G,p->adjvex);//对为访问的邻接顶点递归调用
p=p->next;
}
}
//------广度优先搜索------------
voidBFS(ALGraphG)
{
inti;
ArcNode*p;
QueueQ;
InitQueue(Q);
for(i=0;i{
if(!
visited[i])
{
visited[i]=true;
printf("%c",G.vertices[i].data);
EnQueue(Q,i);
while(!
QueueEmpty(Q))
{
DeQueue(Q,i);
p=G.vertices[i].firstarc;//找到当前顶点的边表链表头指针
while(p)
{
if(!
visited[p->adjvex])//若此顶点为被访问
{
visited[p->adjvex]=true;
printf("%c",G.vertices[p->adjvex].data);
EnQueue(Q,p->adjvex);
}
p=p->next;
}
}
}
}
printf("\n");
}
intmain()
{
ALGraphG;
inti;
//G=(ALGraph*)malloc(sizeof(ALGraph));
CrateALGraph(&G);//创建无向图,输入数据
printf("输出每个顶点的度:
\n");
//for(intm=0;iDegreeNum(&G);
printf("深度优先搜索遍历:
\n");
DFS(G,0);
for(i=0;ivisited[i]=false;
printf("\n");
printf("广度优先搜索遍历:
\n");
BFS(G);
printf("输入邻接表:
\n");
display(&G);
intc;
scanf("%d",&c);
return0;
}
4、运行结果与测试分析
运行结果:
(1)输入顶点信息:
(2)输入边信息:
(3)输出每个顶点度:
(4)邻接表
分析:
(1)首先定义无向图邻接表的结构,分别声明边表结点、顶点结构、当前图的顶点和边数的结构。
(2)建立无向图的邻接存储结构,通过CrateALGraph函数在内部实现顶点数据的输入,边表的置空和建立,构建顶点之间的边结构。
(3)定义display函数实现邻接表的输出。
通过结点指针实现当前顶点信息的索引和向下索引相关联的顶点。
(4)通过DegreeNum函数实现对应顶点的度,在函数中通过在for循环语句中的if语句判断这两个顶点是否有度,实现所以顶点度的查找。
(5)再根据书上深度优先索引遍历和广度优先遍历的代码实现遍历。
(6)在main函数中通过定义一个图输入顶点信息和边的数量。
再调用各种函数实现题目需要的效果。
五、实验心得与体会
在这次试验中,需要之前了解无向图的基本概念。
通过实验知道了图的建立、存储方式和图的遍历。
在实验之前,因为对图的概念不是很了解,所以在看到实验时有些迷茫。
后来在查阅了课本和请教了同学后,开始了程序的编写。
实验过程中,在图的遍历的理解上有一定的混淆导致错误连连,后来通过在网上查找相应的错误解决方案和同学商讨后完成了程序的编写。
在此次实验中,了解到了有向图和无向图在顶点度的计算时的区别,在深度优先搜索遍历和广度优先搜索遍历的可以利用递归调用的方法简化程序,在广度优先搜索遍历时需要定义大量函数实现遍历。
通过此次学习,希望可以对以后的实验和学习会有很大的帮助。