数据结构.docx

上传人:b****3 文档编号:2127752 上传时间:2022-10-27 格式:DOCX 页数:15 大小:61.45KB
下载 相关 举报
数据结构.docx_第1页
第1页 / 共15页
数据结构.docx_第2页
第2页 / 共15页
数据结构.docx_第3页
第3页 / 共15页
数据结构.docx_第4页
第4页 / 共15页
数据结构.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构.docx

《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构.docx

数据结构

实验报告

实验内容

(-)实验题目一:

有一无向图,如图所示:

请通过编程实现以下要求:

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;i

scanf("%d",&GV[i]);

for(i=0;i

for(j=0;j

GA[GV[i]][GV[j]]=0;

}

printf("pleaseinput%dlines:

\n",e);

for(k=0;k

scanf("%d%d",&i,&j);/*输入一条边的两端点序号i和j*/

GA[i][j]=GA[j][i]=1;

}

printf("outputadjacencymatrix:

\n",n);

for(i=0;i

for(j=0;j

printf("%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;i

structedgenode*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;j

if(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,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1