数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(15页珍藏版)》请在冰豆网上搜索。
![数据结构.docx](https://file1.bdocx.com/fileroot1/2022-10/27/39b8afc2-a2f7-4694-b000-112ae3cb539f/39b8afc2-a2f7-4694-b000-112ae3cb539f1.gif)
数据结构
实验报告
实验内容
(-)实验题目一:
有一无向图,如图所示:
请通过编程实现以下要求:
1.建立该图的邻接矩阵和邻接表,并输出邻接矩阵和邻接表;
2.用广度优先搜索和深度优先搜索对图进行遍历(假设从顶点1出发)并输出遍历序列。
1.实验设计思路:
正确运用邻接矩阵、邻接表的生成方法,利用邻接表或邻接矩阵遍历图。
2.程序源代码
#include"stdlib.h"
#include"stdio.h"
#include"malloc.h"
#defineMaxVertexNum100
#defineMaxEdgeNum100
intvisited[MaxVertexNum];
typedefintVertexType;
typedefintElemType;
typedefVertexTypevexlist[MaxVertexNum];
typedefintadjmatrix[MaxVertexNum][MaxVertexNum];
structedgenode
{
intadjvex;/*邻接点域*/
structedgenode*next;/*指向下一个边结点的链域*/
};
voidCreatel(vexlistGV,adjmatrixGA,intn,inte)
{
inti,j,k;/*建立顶点数组*/
printf("请输入%d个顶点:
",n);
for(i=0;iscanf("%d",&GV[i]);
for(i=0;ifor(j=0;jGA[GV[i]][GV[j]]=0;
}
printf("pleaseinput%dlines:
\n",e);
for(k=0;kscanf("%d%d",&i,&j);/*输入一条边的两端点序号i和j*/
GA[i][j]=GA[j][i]=1;
}
printf("outputadjacencymatrix:
\n",n);
for(i=0;ifor(j=0;jprintf("%d",GA[GV[i]][GV[j]]);
printf("\n");
}
}
/*定义adjlist为存储n个表头指针的数组类型*/
typedefstructedgenode*adjlist[MaxVertexNum];
voidCreate2(vexlistGV,adjlistGL,intn,inte)
/*通过从键盘上输入的e条有向无权边的信息建立顶点数组GV和邻接表GL*/
{
inti,j,k;
/*初始化邻接表,即将表头向量中的每个域置空*/
for(i=0;i/*建立邻接表*/
printf("pleaseinput%dlines:
\n",e);
for(k=1;k<=e;k++){
structedgenode*p;
structedgenode*q;
/*输入一条边*/
scanf("%d%d",&i,&j);
/*由系统分配2个新结点*/
p=malloc(sizeof(structedgenode));
q=malloc(sizeof(structedgenode));
/*将j的值赋给新结点的邻接点域*/
p->adjvex=j;
q->adjvex=i;
/*将新结点插入到Vi、Vj邻接表的表头*/
p->next=GL[i];
GL[i]=p;
q->next=GL[j];
GL[j]=q;
}
}
voidOutputAdjlist(vexlistGV,adjlistGL,intn)
/*输出一个图的邻接表*/
{
inti;
for(i=0;istructedgenode*p;
printf("%d:
",GV[i]);
for(p=GL[GV[i]];p!
=NULL;p=p->next)
printf("%d",p->adjvex);
printf("\n");
}
}
voiddfs1(vexlistGV,adjmatrixGA,inti,intn)
/*从初始点vi出发深度优先搜索由邻接矩阵GA表示的图*/
{
intj;
/*假定访问顶点vi以输出该顶点的序号代之*/
printf("%d",i);
/*标记vi已被访问过*/
visited[i]=1;
/*依次优先搜索访问vi的每个邻接点*/
for(j=0;j/*若vi的一个有效邻接点vj未被访问过,则从vj出发进行递归调用*/
if(GA[i][GV[j]]!
=0&&!
visited[GV[j]])
dfs1(GV,GA,GV[j],n);
}
}
voiddfs2(adjlistGL,inti,intn)
{
structedgenode*p;
printf("%d",i);
visited[i]=1;
p=GL[i];
while(p!
=NULL){
intj=p->adjvex;
if(!
visited[j])dfs2(GL,j,n);
p=p->next;
}
}
structQueueSq{
ElemType*queue;/*指向存储队列的数组空间*/
intfront,rear,len;/*队首指针、队尾指针、队列长度变量*/
intMaxSize;/*queue数组长度*/
};
voidInitQueue(structQueueSq*Q)
{
/*置队列空间初始最大长度为10*/
Q->MaxSize=10;
/*动态存储空间分配*/
Q->queue=malloc(10*sizeof(ElemType));
/*置队列为空*/
Q->front=Q->rear=0;
}
voidagainMalloc(structQueueSq*Q)
{/*空间扩展为原来的2倍,并由p所指向,原内容被自动拷贝到p所指向的存储空间中*/
ElemType*p;
p=realloc(Q->queue,2*Q->MaxSize*sizeof(ElemType));
if(!
p)
{/*分配失败退出运行*/
printf("error!
\n");
exit
(1);
}
/*使queue指向新的队列空间*/
Q->queue=p;
/*把原队列的尾部内容向后移动MaxSize个位置*/
if(Q->rear!
=Q->MaxSize-1)
{
inti;
for(i=0;i<=Q->rear;i++)
Q->queue[i+Q->MaxSize]=Q->queue[i];
/*队尾指针后移MaxSize个位置*/
Q->rear+=Q->MaxSize;
}
/*把队列空间大小修改为新的长度*/
Q->MaxSize=2*Q->MaxSize;
}
voidEnQueue(structQueueSq*Q,ElemTypex)
{
/*当队列满时进行动态重分配*/
if((Q->rear+1)%Q->MaxSize==Q->front)againMalloc(Q);
/*求出队尾的下一个位置*/
Q->rear=(Q->rear+1)%Q->MaxSize;
/*把item的值赋给新的队尾位置*/
Q->queue[Q->rear]=x;
}
ElemTypeOutQueue(structQueueSq*Q)
{
/*若队列为空则终止运行*/
if(Q->front==Q->rear){
printf("error!
\n");
exit
(1);
}
/*使队首指针指向下一个位置*/
Q->front=(Q->front+1)%Q->MaxSize;
/*返回队首元素*/
returnQ->queue[Q->front];
}
intEmptyQueue(structQueueSq*Q)
{
if(Q->front==Q->rear)
return1;
else
return0;
}
voidbfs1(vexlistGV,adjmatrixGA,inti,intn)
/*从初始点vi出发广度优先搜索由邻接矩阵GA表示的图*/
{
/*定义一个队列Q,其元素类型应为整型,初始化队列为空*/
structQueueSqQ;
InitQueue(&Q);/*队列数组空间大小被预分配为10*/
/*访问初始点vi,同时标记初始点vi已访问过*/
printf("%d",i);
visited[i]=1;
EnQueue(&Q,i);/*将已访问过的初始点序号i入队*/
/*当队列非空时进行循环处理*/
while(!
EmptyQueue(&Q)){
intj;
/*删除队首元素,第一次执行时k的值为i*/
intk=OutQueue(&Q);
/*依次搜索vk的每一个可能的邻接点*/
for(j=0;jif(GA[k][GV[j]]!
=0&&!
visited[GV[j]])
{
visited[GV[j]]=1;/*标记vj已访问过*/
printf("%d",GV[j]);/*访问一个未被访问过的邻接点vj*/
EnQueue(&Q,GV[j]);
}
}
}
voidbfs2(adjlistGL,inti)
{
structQueueSqQ;
InitQueue(&Q);
printf("%d",i);
visited[i]=1;
EnQueue(&Q,i);
while(!
EmptyQueue(&Q))
{
intk=OutQueue(&Q);/*删除队首元素*/
structedgenode*p=GL[k];/*取邻接表的表头指针*/
while(p!
=NULL)/*依次搜索vk的每个邻接点*/
{
intj=p->adjvex;/*vj为vk的一个邻接点*/
if(!
visited[j])
{
printf("%d",j);
visited[j]=1;
EnQueue(&Q,j);
}
p=p->next;/*使p指向vk邻接表的下一个边结点*/
}
}
}
main()
{
intm,n,e,i;
vexlistGV;
adjmatrixGA;
adjlistGL;
printf("pleaseinputnumberofpointsandlines:
");
scanf("%d%d",&n,&e);
Createl(GV,GA,n,e);
Create2(GV,GL,n,e);
printf("outputadjacencylist:
\n");
OutputAdjlist(GV,GL,