《数据结构》实验7图答案.docx

上传人:b****8 文档编号:9433268 上传时间:2023-05-19 格式:DOCX 页数:15 大小:135.12KB
下载 相关 举报
《数据结构》实验7图答案.docx_第1页
第1页 / 共15页
《数据结构》实验7图答案.docx_第2页
第2页 / 共15页
《数据结构》实验7图答案.docx_第3页
第3页 / 共15页
《数据结构》实验7图答案.docx_第4页
第4页 / 共15页
《数据结构》实验7图答案.docx_第5页
第5页 / 共15页
《数据结构》实验7图答案.docx_第6页
第6页 / 共15页
《数据结构》实验7图答案.docx_第7页
第7页 / 共15页
《数据结构》实验7图答案.docx_第8页
第8页 / 共15页
《数据结构》实验7图答案.docx_第9页
第9页 / 共15页
《数据结构》实验7图答案.docx_第10页
第10页 / 共15页
《数据结构》实验7图答案.docx_第11页
第11页 / 共15页
《数据结构》实验7图答案.docx_第12页
第12页 / 共15页
《数据结构》实验7图答案.docx_第13页
第13页 / 共15页
《数据结构》实验7图答案.docx_第14页
第14页 / 共15页
《数据结构》实验7图答案.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

《数据结构》实验7图答案.docx

《《数据结构》实验7图答案.docx》由会员分享,可在线阅读,更多相关《《数据结构》实验7图答案.docx(15页珍藏版)》请在冰点文库上搜索。

《数据结构》实验7图答案.docx

《数据结构》实验7图答案

实验报告

院(系):

课程名称:

数据结构日期:

班级

学号

实验室

专业

姓名

计算机号

实验名称

实验7图的操作

成绩评定

软件

VC或TC

教师签名

(1)掌握图的存储结构;

(2)实现图的邻接矩阵存储。

(3)掌握图的遍历方法。

本次实验建立的图如下图所示:

一、广度优先遍历以邻接矩阵方式存储的无向图,运行时的输入以及运行结果如下图所示:

二、深度优先遍历以邻接矩阵方式存储的无向图:

#include"stdio.h"

#defineMaxVertexNum100/*最大顶点数设为100*/

typedefcharVertexType;/*顶点类型设为字符型*/

typedefintEdgeType;/*边的权值设为整型*/

typedefstruct{

VertexTypevexs[MaxVertexNum];/*顶点表*/

EdgeTypeiedges[MaxVertexNum][MaxVertexNum];/*邻接矩阵,即边表*/

intn,e;/*顶点数和边数*/

}Mgraph;/*Maragh是以邻接矩阵存储的图类型*/

voidCreateMGraph(Mgraph*G)

{/*建立无向图G的邻接矩阵存储*/

inti,j,k;

printf("请输入顶点数和边数(输入格式为:

顶点数(空格)边数):

\n");

scanf("%d%d",&(G->n),&(G->e));/*输入顶点数和边数*/

printf("请输入顶点信息(输入格式为:

顶点字符串,中间不要空格,以回车结束):

\n");

getchar();

for(i=0;in;i++)

scanf("%c",&(G->vexs[i]));/*输入顶点信息,建立顶点表*/

for(i=0;in;i++)

for(j=0;jn;j++)G->iedges[i][j]=0;/*初始化邻接矩阵*/

printf("请输入每条边对应的两个顶点的序号(输入格式为:

i(空格)j(回车)):

\n");

for(k=0;ke;k++)

{scanf("\n%d%d",&i,&j);/*输入e条边,建立邻接矩阵*/

G->iedges[i][j]=1;

G->iedges[j][i]=1;

}

}/*CreateMGraph*/

intvisited[100];

voidDFSM(Mgraph*G,intk)

/*以Vk为出发点,对邻接矩阵存储的图G进行DFS搜索*/

{intvj;

visited[k]=1;

printf("visitvertex:

V%c\n",G->vexs[k]);

for(vj=k;vjn;vj++)

if(G->iedges[k][vj]==1&&!

visited[vj])

DFSM(G,vj);

}

voidDFSTraverseAL(Mgraph*G)

{/*深度优先遍历以邻接矩阵存储的图G*/

inti;

for(i=0;in;i++)

visited[i]=0;/*标志向量初始化*/

for(i=0;in;i++)

if(!

visited[i])DFSM(G,i);/*vi未访问过,从vi开始DFS搜索*/

}/*DFSTraverseAL*/

voidmain()

{Mgraphtu;

inti,j;

CreateMGraph(&tu);

printf("\n\n您所建立的图的顶点为:

");

for(i=0;i

printf("%c",tu.vexs[i]);

printf("\n\n您所建立的图的邻接矩阵表示为:

\n\n");

for(i=0;i

{for(j=0;j

printf("%d",tu.iedges[i][j]);

printf("\n");

}

printf("\n\n深度优先遍历的结果为:

\n\n");

DFSTraverseAL(&tu);printf("\n");

}

三、编写实现以邻接表方式存储的无向图的深度优先遍历算法,并上机调试运行

#include

#include

#defineMaxVertexNum100//最大顶点数,应由用户定义

typedefcharVertexType;//顶点类型应由用户定义

typedefstructnode{//边表结点

intadjvex;//邻接点域

structnode*next;//链域

//若要表示边上的权,则应增加一个数据域

}EdgeNode;

typedefstructvnode{//顶点表结点

VertexTypevertex;//顶点域

EdgeNode*firstedge;//边表头指针

}VertexNode;

typedefVertexNodeAdjList[MaxVertexNum];

//AdjList是邻接表类型

typedefstruct{

AdjListadjlist;//邻接表

intn,e;//图中当前顶点数和边数

}ALGraph;

//对于简单的应用,无须定义此类型,可直接使用AdjList类型

typedefenum{FALSE,TRUE}Boolean;//FALSE为0,TRUE为1

Booleanvisited[MaxVertexNum];//访问标志向量是全局量

voidDFS(ALGraph*G,inti);

voidmain()

{

voidCreateALGraph(ALGraph*G);

voidPrintALGraph(ALGraph*G);

voidDFSTraverse(ALGraph*G);

ALGraphG;

CreateALGraph(&G);

PrintALGraph(&G);

printf("深度优先搜索结果:

");

DFSTraverse(&G);

printf("\n");

}

voidCreateALGraph(ALGraph*G)

{//建立无向图的邻接表表示

inti,j,k;

EdgeNode*s;

printf("请输出顶点数和边数:

");

scanf("%d%d",&G->n,&G->e);//读入顶点数和边数

printf("请输出顶点信息:

");

for(i=0;in;i++){//建立顶点表

while((G->adjlist[i].vertex=getchar())=='\n');//读入顶点信息

G->adjlist[i].firstedge=NULL;//边表置为空表

}

for(k=0;ke;k++){//建立边表

printf("\n请输出第%d边的起点、终点:

",k+1);

scanf("%d%d",&i,&j);//读入边(vi,vj)的顶点对序号

s=(EdgeNode*)malloc(sizeof(EdgeNode));//生成边表结点

s->adjvex=j;//邻接点序号为j

s->next=G->adjlist[i].firstedge;

G->adjlist[i].firstedge=s;//将新结点*s插入顶点vi的边表头部

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=i;//邻接点序号为i

s->next=G->adjlist[j].firstedge;

G->adjlist[j].firstedge=s;//将新结点*s插入顶点vj的边表头部

}

}

//打印邻接表:

voidPrintALGraph(ALGraph*G)

{

inti;

EdgeNode*p;

for(i=0;in;i++)

{

printf("%d%c:

\t",i,G->adjlist[i].vertex);

p=G->adjlist[i].firstedge;

while(p)

{

printf("%d\t",p->adjvex);

p=p->next;

}

printf("\n");

}

}

voidDFSTraverse(ALGraph*G)

{//深度优先遍历以邻接表表示的图G

inti;

for(i=0;in;i++)

visited[i]=FALSE;//标志向量初始化

for(i=0;in;i++)

if(!

visited[i])//vi未访问过

DFS(G,i);//以vi为源点开始DFS搜索

}

voidDFS(ALGraph*G,inti)

{//以vi为出发点对邻接表表示的图G进行深度优先搜索

EdgeNode*p;

printf("%c",G->adjlist[i].vertex);//访问顶点vi

visited[i]=TRUE;//标记vi已访问

p=G->adjlist[i].firstedge;//取vi边表的头指针

while(p)

{//依次搜索的vi邻接点vj,这里j=p->adjvex

if(!

visited[p->adjvex])//若vj尚未被访问

DFS(G,p->adjvex);//则以vj为出发点向纵深搜索

p=p->next;//找vi的下一邻接点

}

}

四、设计算法对邻接表表示的无向网进行广度优先遍历。

#include

#include

typedefintDataType;//将队列中元素的数据类型改为Person

//循环队列的类型定义

#defineQueueSize100//应根据具体情况定义该值

typedefstruct

{intfront;//头指针,队非空时指向队头元素

intrear;//尾指针,队非空时指向队尾元素的下一位置

intcount;//计数器,记录队中元素总数

DataTypedata[QueueSize];

}CirQueue;

#defineMaxVertexNum100//最大顶点数,应由用户定义

typedefcharVertexType;//顶点类型应由用户定义

typedefstructnode{//边表结点

intadjvex;//邻接点域

structnode*next;//链域

//若要表示边上的权,则应增加一个数据域

}EdgeNode;

typedefstructvnode{//顶点表结点

VertexTypevertex;//顶点域

EdgeNode*firstedge;//边表头指针

}VertexNode;

typedefVertexNodeAdjList[MaxVertexNum];

//AdjList是邻接表类型

typedefstruct{

AdjListadjlist;//邻接表

intn,e;//图中当前顶点数和边数

}ALGraph;

//对于简单的应用,无须定义此类型,可直接使用AdjList类型

typedefenum{FALSE,TRUE}Boolean;//FALSE为0,TRUE为1

Booleanvisited[MaxVertexNum];//访问标志向量是全局量

voidmain()

{

voidInitQueue(CirQueue*Q);

intQueueEmpty(CirQueue*Q);

intQueueFull(CirQueue*Q);

voidEnQueue(CirQueue*Q,DataTypex);

DataTypeDeQueue(CirQueue*Q);

DataTypeQueueFront(CirQueue*Q);

voidCreateALGraph(ALGraph*G);

voidPrintALGraph(ALGraph*G);

voidBFS(ALGraph*G,intk);

ALGraphG;

CreateALGraph(&G);

PrintALGraph(&G);

printf("广度优先搜索结果:

");

BFS(&G,0);

printf("\n");

}

voidCreateALGraph(ALGraph*G)

{//建立无向图的邻接表表示

inti,j,k;

EdgeNode*s;

printf("请输出顶点数和边数:

");

scanf("%d%d",&G->n,&G->e);//读入顶点数和边数

printf("请输出顶点信息:

");

for(i=0;in;i++){//建立顶点表

while((G->adjlist[i].vertex=getchar())=='\n');//读入顶点信息

G->adjlist[i].firstedge=NULL;//边表置为空表

}

for(k=0;ke;k++){//建立边表

printf("\n请输出第%d边的起点、终点:

",k+1);

scanf("%d%d",&i,&j);//读入边(vi,vj)的顶点对序号

s=(EdgeNode*)malloc(sizeof(EdgeNode));//生成边表结点

s->adjvex=j;//邻接点序号为j

s->next=G->adjlist[i].firstedge;

G->adjlist[i].firstedge=s;//将新结点*s插入顶点vi的边表头部

s=(EdgeNode*)malloc(sizeof(EdgeNode));

s->adjvex=i;//邻接点序号为i

s->next=G->adjlist[j].firstedge;

G->adjlist[j].firstedge=s;//将新结点*s插入顶点vj的边表头部

}

}

//打印邻接表:

voidPrintALGraph(ALGraph*G)

{

inti;

EdgeNode*p;

for(i=0;in;i++)

{

printf("%d%c:

\t",i,G->adjlist[i].vertex);

p=G->adjlist[i].firstedge;

while(p)

{

printf("%d\t",p->adjvex);

p=p->next;

}

printf("\n");

}

}

voidInitQueue(CirQueue*Q)

{(*Q).front=(*Q).rear=0;

(*Q).count=0;//计数器置0

}

intQueueEmpty(CirQueue*Q)

{

return(*Q).count==0;//队列无元素为空

}

intQueueFull(CirQueue*Q)

{

return(*Q).count==QueueSize;

//队中元素个数等于QueueSize时队满

}

voidEnQueue(CirQueue*Q,DataTypex)

{

if(QueueFull(Q))

{printf("Queueoverflow");

exit(0);//队满上溢

}

(*Q).count++;//队列元素个数加1

(*Q).data[(*Q).rear]=x;//新元素插入队尾

(*Q).rear=((*Q).rear+1)%QueueSize;//循环意义下将尾指针加1

}

DataTypeDeQueue(CirQueue*Q)

{

DataTypetemp;

if(QueueEmpty(Q))

{printf("Queueunderflow");

exit(0);//队空下溢

}

temp=(*Q).data[(*Q).front];

(*Q).count--;//队列元素个数减1

(*Q).front=((*Q).front+1)%QueueSize;//循环意义下的头指针加1

returntemp;

}

DataTypeQueueFront(CirQueue*Q)

{

if(QueueEmpty(Q))

{printf("Queueisempty");

exit(0);

}

return(*Q).data[(*Q).front];

}

voidBFS(ALGraph*G,intk)

{//以vk为源点对用邻接表表示的图G进行广度优先搜索

inti;

CirQueueQ;//须将队列定义中DataType改为int

EdgeNode*p;

InitQueue(&Q);//队列初始化

printf("%c",G->adjlist[k].vertex);//访问源点vk

visited[k]=TRUE;

EnQueue(&Q,k);//vk已访问,将其入队。

注意,实际上是将其序号入队

while(!

QueueEmpty(&Q)){//队非空则执行

i=DeQueue(&Q);//相当于vi出队

p=G->adjlist[i].firstedge;//取vi的边表头指针

while(p){//依次搜索vi的邻接点vj(令p->adjvex=j)

if(!

visited[p->adjvex]){//若vj未访问过

printf("%c",G->adjlist[p->adjvex].vertex);//访问vj

visited[p->adjvex]=TRUE;

EnQueue(&Q,p->adjvex);//访问过的vj入队

}

p=p->next;//找vi的下一邻接点

}

}

}

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2