数据结构实验图的基本操作Word文件下载.docx
《数据结构实验图的基本操作Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验图的基本操作Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构实验图的基本操作Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-12/9/84b41539-9ef2-4f93-b13c-1e6f0e1994f7/84b41539-9ef2-4f93-b13c-1e6f0e1994f71.gif)
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->
d
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();
//过滤