数据结构与算法实验报告图.docx

上传人:b****6 文档编号:6615162 上传时间:2023-01-08 格式:DOCX 页数:9 大小:17.67KB
下载 相关 举报
数据结构与算法实验报告图.docx_第1页
第1页 / 共9页
数据结构与算法实验报告图.docx_第2页
第2页 / 共9页
数据结构与算法实验报告图.docx_第3页
第3页 / 共9页
数据结构与算法实验报告图.docx_第4页
第4页 / 共9页
数据结构与算法实验报告图.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构与算法实验报告图.docx

《数据结构与算法实验报告图.docx》由会员分享,可在线阅读,更多相关《数据结构与算法实验报告图.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构与算法实验报告图.docx

数据结构与算法实验报告图

 

沈阳工程学院

学生实验报告

(课程名称:

数据结构与算法)

 

实验题目:

 

班级网本111学号16姓名邹壮壮

地点F606指导教师吕海华

实验日期:

2011年月日

一、实验目的

1.掌握图的基本存储方法。

2.掌握有关图的操作算法并用高级语言实现。

3.熟练掌握图的两种搜索路径的遍历方法。

4.掌握图的有关应用。

二、实验环境

TurboC或是VisualC++

三、实验内容与要求

实验1建立无向图的邻接矩阵或邻接表存储并输出

本题给出了一个无向图的邻接矩阵存储表示,在此基础上稍加改动就可以实现有向图、无向图和有向网的邻接矩阵表示。

实验2建立图的邻接矩阵或邻接表存储并在此基础上实现图的深度优先遍历和广度优先遍历

图的广度优先遍历用非递归方法很容易理解,非递归方法需要辅助队列Q以及出队、入队函数。

四、实验过程及结果分析

1.广度优先

(1)邻接表表示图的广度优先搜索算法

voidBFS(ALGraph*G,intk)

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

   inti;

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

   EdgeNode*p;

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

    //访问源点vk

    printf("visitvertex:

%e",G->adjlist[k].vertex);

   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->adivex]){//若vj未访问过

             printf("visitvertex:

%c",C->adjlistlp->adjvex].vertex); //访问vj

             visited[p->adjvex]=TRUE; 

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

            }//endif

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

        }//endwhile

     }//endwhile

  }//endofBFS

(2)邻接矩阵表示的图的广度优先搜索算法

 voidBFSM(MGraph*G,intk)

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

  inti,j;

  CirQueueQ;

  InitQueue(&Q);

  printf("visitvertex:

%c",G->vexs[k]);//访问源点vk

  visited[k]=TRUE;

  EnQueue(&Q,k);

  while(!

QueueEmpty(&Q)){

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

     for(j=0;jn;j++)//依次搜索vi的邻接点vj

         if(G->edges[i][j]==1&&!

visited[j]){//vi未访问

             printf("visitvertex:

%c",G->vexs[j]);//访问vi

             visited[j]=TRUE;

             EnQueue(&Q,j);//访问过的vi人队

                }

    }//endwhile

 }//BFSM

2.邻接表

#include

#include

#defineMAX_NUM20

#defineOK1

#defineERROR-1

typedefintElemType;

typedefcharVertexType;

typedefstructArcNode

{//定义弧结点

ElemTypedata;

ArcNode*nextarc;

}ArcNode,*ArcLink;

typedefstructVNode

{//定义顶点结点

VertexTypedata;

ArcLinkfirstarc;

}VNode,AdjList[MAX_NUM];

typedefstruct

{

AdjListvdata;

intvexnum,arcnum;

}ALGraph;

//构建图的邻接表

intCreategraph(ALGraph&G,intn){

ArcLinkp;

inte,i;

charv,w;

for(i=0;i

G.vdata[i].data='A'+i;

G.vdata[i].firstarc=NULL;

}

printf("输入边的个数:

\n");

scanf("%d",&e);

for(i=0;i

{

getchar();//接收scanf的回车符

printf("请输入某边所依附的两个顶点用A--%C表示\n",'A'+n-1);

scanf("%c%c",&v,&w);//fflush(stdin);

printf("V=%c,W=%c,I=%d\n",v,w,i);

p=(ArcLink)malloc(sizeof(ArcNode));

p->data=(int)(w-'A'+1);printf("%d\n",p->data);

p->nextarc=G.vdata[(int)(v-'A')].firstarc;

G.vdata[(int)(v-'A')].firstarc=p;

p=(ArcLink)malloc(sizeof(ArcNode));

p->data=(int)(v-'A'+1);

p->nextarc=G.vdata[(int)(w-'A')].firstarc;

G.vdata[(int)(w-'A')].firstarc=p;

}

G.vexnum=n;G.arcnum=e;

returnOK;

}

//输出邻接表

intprintGraph(ALGraphG){

ArcLinkp;

inti;

for(i=0;i

printf("%2d%c",i,G.vdata[i]);

for(p=G.vdata[i].firstarc;p!

=NULL;p=p->nextarc){

printf("-->");

printf("%d",p->data);

}

printf("\n");

}

returnOK;

}

intmain()

{

ALGraphG;

intn;

printf("请输入你要构建的无向图的顶点个数:

\n");

scanf("%d",&n);

Creategraph(G,n);

printf("你所构建的无向图的邻接表如下所示:

\n");

printGraph(G);

returnOK;

}

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

#defineOK1

#defineERROR-1

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

typedefintEdgeType;//边上的权值类型应由用户定义

//定义图的种类类型,yxt有向图,yxw有向网,wxt无向图,wxw无向网

typedefenum{yxt,yxw,wxt,wxw}GraphKind;

typedefstruct

{

VertexTypevexs[MaxVertexNum];//顶点表

//邻接矩阵,可看作边表,如果是无权图,1:

相邻,0:

不相邻

EdgeTypeedges[MaxVertexNum][MaxVertexNum];

intn;

inte;//图中当前的顶点数和边数

GraphKindgkind;//图的种类标示

}MGraph;

//函数声明

intcreatWxw(MGraph*G);

intcreatYxt(MGraph*G);

intcreatYxw(MGraph*G);

intcreatWxt(MGraph*G);

voidprintGraph(MGraph*G)

{

inti,j;

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

{

for(j=0;jn;j++)

printf("%d",G->edges[i][j]);printf("\n");

}

}

//根据不同的种类构建不同的图

intcreatGraph(MGraph*G)

{

printf("输入图的种类,0:

有向图,1:

有向网,2:

无向图,3:

无向网:

");

printf("\n");

scanf("%d",&(G->gkind));

switch(G->gkind)

{

case0:

returncreatYxt(G);break;

case1:

returncreatYxw(G);break;

case2:

returncreatWxt(G);break;

case3:

returncreatWxw(G);break;

default:

returnERROR;

}

}

//创建无向网,网指的是具有权值的图

intcreatWxw(MGraph*G)

{

inti=0,j=0,k=0;

charv1,v2;//弧的两个结点

intw;//权值

printf("输入图的结点数:

\n");

scanf("%d",&G->n);

printf("输入图的边数:

\n");

scanf("%d",&G->e);

getchar();//接收scanf的回车符

//输入结点

printf("输入结点,用大写字母标示(要求第一个顶点是A),如:

A:

\n");

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

{

scanf("%c",&G->vexs[i]);

}

getchar();//接收scanf的回车符

//初始化邻接矩阵

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

for(j=0;jn;j++)

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

//输入边连接的两个结点

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

{

//i,j作为矩阵的行和列

printf("输入弧和权值:

\n");

scanf("%c%c%d",&v1,&v2,&w);

getchar();

i=v1-'A';

j=v2-'A';

G->edges[i][j]=w;

G->edges[j][i]=w;

}

returnOK;

}

intmain()

{

MGraphG;

creatGraph(&G);

printGraph(&G);

return0;

}

 

五、成绩评定

及格

不及格

出勤

内容

格式

创新

效果

总评

 

指导教师:

年月日

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

当前位置:首页 > PPT模板 > 动态背景

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

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