数据结构实验图的基本操作Word文件下载.docx

上传人:b****5 文档编号:17768768 上传时间:2022-12-09 格式:DOCX 页数:24 大小:98.92KB
下载 相关 举报
数据结构实验图的基本操作Word文件下载.docx_第1页
第1页 / 共24页
数据结构实验图的基本操作Word文件下载.docx_第2页
第2页 / 共24页
数据结构实验图的基本操作Word文件下载.docx_第3页
第3页 / 共24页
数据结构实验图的基本操作Word文件下载.docx_第4页
第4页 / 共24页
数据结构实验图的基本操作Word文件下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构实验图的基本操作Word文件下载.docx

《数据结构实验图的基本操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验图的基本操作Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构实验图的基本操作Word文件下载.docx

G,GraphKindkd)//采用数组邻接矩阵表示法,构造图G

{//构造有向网G

inti,j,k,q;

charv, w;

ﻩG.kind=kd;

//图的种类

ﻩprintf("输入要构造的图的顶点数和弧数:

\n");

scanf("

%d,%d"

&

G.vexnum,&G.arcnum);

ﻩgetchar();

//过滤回车

printf("

依次输入图的顶点名称ABCD...等等:

\n"

);

for(i=0;

 i<

G.vexnum;

i++) scanf("%c"

,&

G.vexs[i]);

//构造顶点数据

ﻩgetchar();

//过滤回车

  for(i=0;

i<

G.vexnum;

i++) //邻接矩阵初始化

for(j=0;

 j<G.vexnum;

 j++)

ﻩif(kd==DN||kd==AN)

ﻩG.arcs[i][j]=MaxValue;

//网,初始值为无穷大

ﻩﻩelse

ﻩﻩG.arcs[i][j]=0;

  //图,初始为0

ﻩif(kd==DN||kd==AN)

ﻩprintf("

按照:

尾顶点名->

头顶点名,权值 输入数据:

如A->

B,23 \n");

else

ﻩprintf("

按照:

尾顶点名->

头顶点名输入数据:

A->

B\n");

ﻩfor(k=0;

k<

G.arcnum;

k++){ //构造邻接矩阵

if(kd==DN||kd==AN)

 scanf("

%c->

%c,%d"

&v,&w,&

q);

//输入弧的两个定点及该弧的权重

ﻩelse

ﻩscanf("

%c->

%c"

&v,&

w);

ﻩgetchar();

for(i=0;

i<

G.vexnum;

 i++)

ﻩﻩif(G.vexs[i]==v)break;

//查找出v在vexs[]中的位置i

    if(i==G.vexnum){cerr<

<

"

vertexERROR!

;

exit

(1);

}     

ﻩ for(j=0;

j<

G.vexnum;

j++) 

ﻩﻩﻩif(G.vexs[j]==w)break;

//查找出v在vexs[]中的位置j

  if(j==G.vexnum){cerr<

vertexERROR!

";

exit

(1);

}

ﻩif(kd==AN)//无向网

ﻩ{

G.arcs[i][j]=q;

 //邻接矩阵对应位置置权值

G.arcs[j][i]=q;

//无向图为对称矩阵

ﻩ}

elseif(kd==DN)//有向网

G.arcs[i][j]=q;

ﻩﻩelse if(kd==AG)//无向图

ﻩ{

ﻩG.arcs[i][j]=1;

 //对称矩阵

ﻩG.arcs[j][i]=1;

ﻩ}

ﻩﻩelse  //有向图

ﻩﻩG.arcs[i][j]=1;

//ﻩgetchar();

}//CreateGraph

/*注意输入格式,按以下方式输入

构造有向网

输入要构造的网的顶点数和弧数:

4,5

依次输入网的顶点名称ABCD...等等:

abcd

 尾顶点名->

头顶点名,权值输入数据:

如A->

B,23

a->

b,5

c,8

c->

b,7

d,4

d->

c,3

输出邻接矩阵

 ∞  |   5 |8| 4 |

 ∞ |  ∞  |∞| ∞ |

 ∞ |7 | ∞ | ∞|

∞| ∞ | 3 |∞ |

Pressanykey to continue

*/

void PrintMGraph(MGraph&

G)

{

ﻩint i,j;

switch(G.kind)

ﻩ{

ﻩ caseDG:

        for(i=0;

i<G.vexnum;

 i++)

ﻩ {

ﻩfor (j=0;

j<

G.vexnum;

j++)

 printf("%2.d | ",G.arcs[i][j]);

printf("\n"

);

ﻩﻩ }

ﻩbreak;

ﻩcaseDN:

for(i=0;

i<

G.vexnum;

i++)

ﻩﻩ{

ﻩﻩ for(j=0;

G.vexnum;

j++){

ﻩif(G.arcs[i][j]!

=MaxValue)printf("   %2.d |"

G.arcs[i][j]);

ﻩﻩ elseprintf("

 ∞ | ");

ﻩ}

 printf("

\n"

}

ﻩﻩ break;

ﻩcase AG:

  for (i=0;

 i<

G.vexnum;

i++)

ﻩﻩ {

ﻩﻩ for(j=0;

j<G.vexnum;

j++){

ﻩﻩ printf(" %2.d |"

G.arcs[i][j]);

ﻩ }

   printf("

\n"

ﻩ }

ﻩﻩ break;

ﻩcase AN:

//********完成构造无向网****************

  /*请模仿编写无向网*/

ﻩ  for(i=0;

i<G.vexnum;

ﻩﻩ for(j=0;

G.vexnum;

 j++){

ﻩ   if(G.arcs[i][j]!

=MaxValue) printf("

%2.d|"

G.arcs[i][j]);

ﻩﻩﻩ elseprintf("

∞|"

ﻩ}

ﻩ printf("\n"

ﻩbreak;

}

//*****************完成函数**********************************

voidcountdig(MGraphG)//请完成计算图的入度或初度

if(G.kind==DG||G.kind==DN)

ﻩ{

//计算有向图或网的各个顶点的入度与出度

intoutD,inD;

ﻩint i,j;

for(i=0;

i<G.vexnum;

i++){

ﻩﻩﻩoutD=inD=0;

ﻩfor(j=0;

j<

G.vexnum;

j++){

ﻩﻩif(G.arcs[i][j]!

=0&

&

G.arcs[i][j]!

=MaxValue)

ﻩﻩﻩoutD++;

ﻩ}

for(j=0;

j++){

ﻩﻩﻩif(G.arcs[j][i]!

=0&

&G.arcs[j][i]!

=MaxValue)

ﻩﻩinD++;

ﻩﻩ}

ﻩprintf("%c:

出度是%d,入度是%d\n",G.vexs[i],outD,inD);

ﻩ}

ﻩelse

{

//计算无向图或网的度

ﻩﻩinti,j;

ﻩintDu;

for(i=0;

G.vexnum;

i++){

ﻩﻩDu=0;

ﻩﻩfor(j=0;

G.vexnum;

j++){

ﻩﻩﻩif(G.arcs[i][j]!

=0&

&G.arcs[i][j]!

=MaxValue)

ﻩﻩﻩﻩDu++;

ﻩﻩﻩ}

ﻩprintf("

%c的度是%d\n",G.vexs,Du);

//************参照p265设计深度有限搜索***********

voidDFSMatrix(MGraphG,inti,intn,bool*visited)

cout<

<G.vexs[i]<<

'

 '

visited[i]=true;

for(int j=0;

n;

j++)

if(G.arcs[i][j]!

=0&&

G.arcs[i][j]!

=MaxValue&& !

visited[j])

  DFSMatrix(G,j,n,visited);

}

//************参照p268设计广度有限搜索***********

voidBFSMatrix(MGraphG,inti, intn,bool*visited)

constintMaxSize=30;

 intq[MaxSize]={0};

int front=0,rear=0;

 cout<

G.vexs[i]<<

''

 visited[i]=true;

q[++rear]=i;

while(front!

=rear){

front=(front+1)%MaxSize;

intk=q[front];

 for(intj=0;

n;

 if(G.arcs[i][j]!

&G.arcs[i][j]!

=MaxValue&&

 !

visited[j]){

 cout<

<G.vexs[j]<

<'

 ';

  visited[j]=true;

 rear=(rear+1)%MaxSize;

 q[rear=j];

  }

void main()

ﻩMGraphG;

intk;

printf("

请选择图的种类:

0:

有向图,1:

有向网,2:

无向图,3:

无向网.请选择:

scanf("%d",&k);

switch(k) { //DG,DN,AG,AN

ﻩﻩcase0:

ﻩﻩprintf("

构造有向图\n"

ﻩﻩCreateGraph(G,DG);

 // 采用数组邻接矩阵表示法,构造有向图

ﻩbreak;

ﻩﻩcase1:

ﻩprintf("

构造有向网\n"

CreateGraph(G,DN);

 //采用数组邻接矩阵表示法,构造有向网AGG

ﻩbreak;

ﻩﻩcase2:

ﻩprintf("

构造无向图\n"

ﻩCreateGraph(G,AG);

//采用数组邻接矩阵表示法,构造无向图AGG

break;

ﻩcase 3:

ﻩprintf("

构造无向网\n"

ﻩﻩﻩCreateGraph(G,AN);

 //采用数组邻接矩阵表示法,构造无向网AGG

ﻩﻩﻩbreak;

PrintMGraph(G);

//打印图的邻接矩阵

ﻩbool*visited=newbool[G.vexnum];

ﻩinti;

cout<

"按图的邻接矩阵得到的深度优先遍历序列"

endl;

for(i=0;

i<

i++)visited[i]=false;

ﻩDFSMatrix(G,0,G.vexnum,visited);

按图的邻接矩阵得到的广度优先遍历序列"

endl;

for(i=0;

i<G.vexnum;

i++)visited[i]=false;

ﻩBFSMatrix(G,0,G.vexnum,visited);

ﻩcout<

度:

countdig(G);

258:

//p-258 图的存储结构以 邻接表表示,构造图的算法。

//已完成若干函数,对尚未完成的请补全

//请注意输入格式,按以下方式构建一个图

/* 

请选择图的种类:

有向图,1:

有向网,2:

无向图,3:

无向网.请选择:

构造有向图

输入要构造的有向图的顶点数和弧数:

4,5

依次输入图的顶点名称ABCD...等等:

abcd

头顶点名输入数据:

B

a->

b

c

a->

c->b

#include <

iostream.h>

#include<stdio.h>

#include<stdlib.h>

#include<

string.h>

typedefchar VertexType;

 //顶点的名称为字符

constintMaxVertexNum=10;

 //图的最大顶点数

constint MaxEdgeNum=100;

//边数的最大值

typedefintWeightType;

   //权值的类型

const WeightType MaxValue=32767;

//权值的无穷大表示

typedef  VertexTypeVexlist [MaxVertexNum];

 //顶点信息,定点名称

                     //邻接矩阵

typedef  enum{DG,DN,AG,AN} GraphKind;

//有向图,有向网,无向图,无向网

struct EdgeNode{//链表边结点,表示弧

ﻩint adjvex;

 //存放与头结点顶点有关的另一个顶点在邻接表(数组)中的下标。

EdgeNode *next;

//指向链表下一个结点

WeightType info;

//权重值,或为该弧相关信息

};

typedefstruct VNode{ //邻接表,表示顶点

 VertexTypedata;

    //顶点数据,顶点名称

 EdgeNode *firstarc;

 //指向边结点链表第一个结点

}VNode,AdjList[MaxVertexNum];

typedefstruct{

AdjListvertices;

ﻩintvexnum,arcnum;

// 图的当前顶点数和弧数

 GraphKindkind;

 //图的种类标志

} ALGraph;

voidCreateGraph_DG(ALGraph&

G){//构造有向图G

EdgeNode*p;

 inti,j,k;

charv,w;

G.kind=DG;

 //图的种类

printf("

输入要构造的有向图的顶点数和弧数:

ﻩscanf("

%d,%d",&

G.vexnum,&

G.arcnum);

getchar();

printf("依次输入图的顶点名称ABCD...等等:

\n");

 for(i=0;

G.vexnum;

 i++) {

ﻩﻩscanf("

G.vertices[i].data);

ﻩG.vertices[i].firstarc=NULL;

 //初始化指向链表指针

getchar();

ﻩprintf("

 尾顶点名->头顶点名输入数据:

如A->B\n");

for(k=0;

 k<G.arcnum;

k++){

  scanf("%c->%c",&v,&

w);

ﻩﻩgetchar();

ﻩfor(i=0;

ﻩﻩif(G.vertices[i].data==v)break;

//查找出v在vertices[]中的位置i

   if(i==G.vexnum){cerr<

vertexERROR!

}        

ﻩfor(j=0;

j<G.vexnum;

 j++)

ﻩﻩﻩif(G.vertices[j].data==w)break;

//查找出w在vertices[]中的位置i

 if(j==G.vexnum) {cerr<<

vertexERROR!

exit

(1);

}    

ﻩﻩ

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

//申请弧结点

ﻩp->

adjvex=j;

       //置入弧尾顶点号

p->

info=MaxValue;

    //图的权值默认为无穷大

  p->next=G.vertices[i].firstarc;

//插入链表

ﻩG.vertices[i].firstarc=p;

////////////////////////////////////////////////////////////////////////////////////////////////

voidCreateGraph_DN(ALGraph&

G)//构造有向网G

  EdgeNode*p;

  int i,j,k;

char v,w;

WeightTypeq;

ﻩG.kind=DN;

  //图的种类

printf("输入要构造的有向网的顶点数和弧数:

\n"

scanf("

%d,%d"

,&G.vexnum,&

G.arcnum);

getchar();

 printf("

依次输入图的顶点名称ABCD...等等:

\n");

  for (i=0;

G.vexnum;

 i++) {

ﻩscanf("

%c"

G.vertices[i].data);

//构造顶点数据

ﻩG.vertices[i].firstarc=NULL;

//初始化指向链表指针

ﻩgetchar();

printf("

头顶点名,权值  输入数据:

如A->B,8\n");

ﻩfor(k=0;

G.arcnum;

k++){

    scanf("

%c->

%c,%d",&

v,&

w,&q);

ﻩgetchar();

ﻩfor(i=0;

G.vexnum;

i++)

ﻩﻩif(G.vertices[i].data==v)break;

//查找出v在vertices[]中的位置i

 if(i==G.vexnum){cerr<

<"

vertexERROR!

";

}     

ﻩfor(j=0;

G.vexnum;

 j++) 

ﻩﻩif(G.vertices[j].data==w) break;

//查找出w在vertices[]中的位置i

   if(j==G.vexnum){cerr<

vertexERROR!

} 

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

//申请弧结点

p->adjvex=j;

     //置入弧尾顶点号

ﻩﻩp->

info=q;

     //图的权值默认为无穷大

 p->next=G.vertices[i].firstarc;

ﻩG.vertices[i].firstarc=p;

 

ﻩ}

voidCreateGraph_AG(ALGraph&

G)//构造无向图G

 EdgeNode*p;

  inti,j,k;

ﻩchar v,w;

ﻩG.kind=AG;

 //图的种类

ﻩprintf("输入要构造的有向图的顶点数和弧数:

ﻩscanf("%d,%d"

G.vexnum,&

G.arcnum);

getchar();

  printf("

依次输入图的顶点名称ABCD...等等:

  for(i=0;

G.vexnum;

 i++){

ﻩﻩscanf("%c"

G.vertices[i].data);

ﻩG.vertices[i].firstarc=NULL;

//初始化指向链表指针

ﻩgetchar();

//过滤

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

当前位置:首页 > 高中教育 > 其它课程

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

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