图的基本操作Word格式文档下载.docx

上传人:b****6 文档编号:16271403 上传时间:2022-11-22 格式:DOCX 页数:19 大小:66.67KB
下载 相关 举报
图的基本操作Word格式文档下载.docx_第1页
第1页 / 共19页
图的基本操作Word格式文档下载.docx_第2页
第2页 / 共19页
图的基本操作Word格式文档下载.docx_第3页
第3页 / 共19页
图的基本操作Word格式文档下载.docx_第4页
第4页 / 共19页
图的基本操作Word格式文档下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

图的基本操作Word格式文档下载.docx

《图的基本操作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《图的基本操作Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。

图的基本操作Word格式文档下载.docx

输入:

将要求解的无/有向图按规则输入对应的文件

输出:

通过主菜单的选择,按需实现对图的各种操作,显示结果并保存到相应的文件中。

源程序说明:

头文件:

graphics.h

函数实现:

graphics.cpp

主函数:

main.cpp

存放的文件说明:

无向图:

graphics1.txt

存放格式为第一行存放图的顶点数n,边数b,下面每行存放两个相邻顶点:

Vi,Vj

有向图:

graphics2.txt

存放格式为第一行存放图的顶点数n,下面每行存放两个相邻顶点Vi-->

Vj:

无向图邻接表:

adjlist1.txt

有向图邻接表:

adjlist2.txt

无向图邻接矩阵:

adjmatrix1.txt

有向图邻接矩阵:

adjmatrix2.txt

所有抽象数据类型的定义如下:

//定义邻接表的边节点类型

structEdgeNode

{

intadjvex;

EdgeNode*next;

};

//定义邻接表类型

typedefEdgeNode**ADJLIST;

各模块的具体实现程序是:

Graphicscpp

各模块的的功能及参数说明:

graphics.h如下:

//对图操作的主菜单

voidMainMenue();

//初始化邻接表

voidInitialAdjList(ADJLIST&

GL,intn);

//以文件方式输入图

//boolInputGraphics();

//建立图的邻接表

voidCreatAdjList(ADJLIST&

GL,int&

n,intm);

//建立图的邻接矩阵

voidCreatAdjMatrix(ADJLIST&

//从初始点出发深度优先搜索由邻接表GL表示的图

voidDFSAdjList(ADJLISTGL,bool*&

visited,inti,intn);

//从初始点出发广度优先搜索由邻接表GL表示的图

voidBFSAdjList(ADJLISTGL,bool*&

4、测试结果

1、图是否有向的选择、主菜单界面:

2、建立邻接表的测试结果:

3、建立邻接矩阵的测试结果:

4、广度优先搜索的测试结果:

5、深度优先搜索的测试结果:

6、退出界面:

5、系统不足与经验体会

系统不足:

异常处理不够健壮,不能够用很形象的方式打印图的直观图。

经验体会:

通过这次实验使我对图有了比较深入的了解,熟悉了图的基本操作,同时也感受到了看似简单的程序实现,真正做起来很费劲,有很多的

困难需要去克服。

6、附录:

源代码(带注释)

graphics.h源代码如下:

#ifndefGRAPHICS_H

#defineGRAPHICS_H

structEdgeNode

{

};

#endif

Graphics.cpp源代码如下:

#include<

iostream>

stdio.h>

stdlib.h>

#include"

graphics.h"

#defineMAX_SIZE100

usingnamespacestd;

//部分函数原型声明

voidCheck(intn,int&

i,int&

j);

//全局变量,控制递归函数中提示符的输出

intflag=1;

voidMainMenue()

cout<

<

"

\n***************************************"

endl;

****"

**1.建立图的邻接表。

**"

**2.建立图的邻接矩阵。

**3.深度优先遍历图。

**4.广度优先遍历图。

**5.退出。

************fulme********************"

}/*EndofMainMuenue()*/

GL,intn)

//初始化图的邻接表

GL=newEdgeNode*[n];

for(inti=1;

i<

=n;

i++)

GL[i]=NULL;

}/*EndofInitialAdjlist()*/

n,intm)

FILE*in1;

FILE*in2;

FILE*out1;

FILE*out2;

inti;

intj;

intk;

intb;

charch;

intflag=0;

if(m==0)

//建立无向图的邻接表

if((in1=fopen("

graphics1.txt"

"

rb"

))==NULL)

打开graphics1.txt失败!

exit

(1);

}

if((out1=fopen("

adjlist1.txt"

wb"

打开adjlist1.txt失败!

flag=1;

//读入顶点的个数,"

"

边数

fscanf(in1,"

%d"

&

n);

%c"

ch);

b);

for(k=0;

k<

b;

k++)

i);

Check(n,i,j);

//向序号为i的单链表的表头插入一个边结点

EdgeNode*p=newEdgeNode;

p->

adjvex=j;

next=GL[i];

GL[i]=p;

//向序号为j的单链表的表头插入一个节点

p=newEdgeNode;

adjvex=i;

next=GL[j];

GL[j]=p;

//输出邻接表,并保存到adjlist1.txt中

endl<

\n====================="

无向图的邻接表为:

for(i=1;

EdgeNode*p=GL[i];

i-1<

|"

V"

i;

fprintf(out1,"

'

V'

);

i);

for(p=GL[i];

p!

=NULL;

p=p->

next)

|-|->

|"

p->

adjvex;

%s"

p->

adjvex);

|^|"

\r\n"

if(flag)

无向图的邻接表已保存到adjlist1.txt中"

fclose(in1);

fclose(out1);

elseif(m==1)

//建立有向图的邻接表

if((in2=fopen("

graphics2.txt"

打开graphics2.txt失败!

if((out2=fopen("

adjlist2.txt"

打开adjlist2.txt失败!

fscanf(in2,"

//向序列号为i的表头插入一个边节点

//输出图的邻接表

有向图的邻接表为:

fprintf(out2,"

有向图的邻接表已保存到adjlist2.txt"

fclose(in2);

fclose(out2);

}/*EndofCreatAdjList()*/

intmatrix[MAX_SIZE+1][MAX_SIZE+1];

//初始化图的邻接矩阵

=MAX_SIZE;

for(j=1;

j<

j++)

matrix[i][j]=0;

//建立无向图的邻接矩阵

adjlmatrix1.txt"

打开adjmatrix1.txt失败!

matrix[i][j]=matrix[j][i]=1;

=b;

matrix[i][j]<

'

'

;

%d"

matrix[i][j]);

无向图的邻接矩阵已保存到adjmatrix1.txt中!

//建立有向图的邻接矩阵

adjmatrix2.txt"

打开adjmatrix2.txt失败!

for(k=1;

matrix[i][j]=1;

有向图已保存到adjmatrix2.txt中!

}/*EndofCreatAdjMatrix()*/

visited,inti,intn)

//从初始点出发递归深度优先搜索邻接表GL表示的图

flag=0;

\n================================="

\n图的深度优先遍历序列:

i<

visited[i]=true;

while(p!

=NULL)

intj=p->

//j为Vi的一个邻接点的序号

if(!

visited[j])

DFSAdjList(GL,visited,j,n);

next;

}/*EndofDFSAdjList()*/

//从初始点开始广度优先搜索邻接表GL表示的图

constintMaxLength=100;

//定义一个队列q,其元素类型为整型

intq[MaxLength]={0};

//定义队首和对尾指针

intfront=0,rear=0;

\n图的广度优先遍历序列:

visited[j]=false;

//访问Vi

q[++rear]=i;

while(front!

=rear)

//当队列非空时进行循环处理

//删除队首元素,第一次执行时k的值为i

front=(front+1)%MaxLength;

intk=q[front];

//取邻接表的表头指针

EdgeNode*p=GL[k];

//依次搜索Vk的每个节点

//Vj为Vk的一个邻接节点

j<

visited[j]=true;

rear=(rear+1)%MaxLength;

q[rear]=j;

}/*EndofBFSAdjList()*/

j)

//检查输入的边序号是否越界,如越界择重输入

while

(1)

(i>

=0&

&

=n&

j>

=n))

\n输入有误!

break;

}/*EndofCheck()*/

main.cpp源代码如下:

intmain()

intn;

intm;

//是否为有向图

bool*visited=newbool[MAX_SIZE];

ADJLISTgl;

//初始化邻接表

InitialAdjList(gl,MAX_SIZE);

=============================="

请选择图是否有向(0无/1有):

cin>

>

m;

MainMenue();

请输入你的选择:

"

ch;

switch(ch)

case'

1'

:

CreatAdjList(gl,n,m);

2'

CreatAdjMatrix(gl,n,m);

3'

visited[i]=false;

DFSAdjList(gl,visited,1,n);

4'

BFSAdjList(gl,visited,1,n);

5'

default:

输入有误!

return0;

}

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

当前位置:首页 > 成人教育 > 电大

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

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