图的基本操作邻接矩阵法Word下载.docx
- 文档编号:21064861
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:29
- 大小:378.99KB
图的基本操作邻接矩阵法Word下载.docx
《图的基本操作邻接矩阵法Word下载.docx》由会员分享,可在线阅读,更多相关《图的基本操作邻接矩阵法Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
插入新顶点,请输入顶点的值:
scanf("
v1);
InsertVex(g,v1);
插入与新顶点有关的弧或边,请输入弧或边数:
%d"
&
n);
for(k=0;
k<
n;
k++)
{
printf("
请输入另一个顶点的值:
scanf("
v2);
if(g.kind<
=1)//有向
{
printf("
对于有向图或网,请输入另一个顶点的方向(0:
弧头,1,弧尾)"
j);
if(j)
InsertArc(g,v2,v1);
else
InsertArc(g,v1,v2);
}
else
InsertArc(g,v1,v2);
}
删除顶点及其相关的弧或边,请输入顶点的值:
DeleteVex(g,v1);
DestroyGraph(g);
}
标头.h
#include<
math.h>
io.h>
process.h>
iostream>
#defineTRUE1
#defineFLASE0
#defineOK1
#defineERROR0
#defineFALSE0
#defineINFINITYINT_MAX//无穷大
typedefintstatus;
#defineMAX_VERTEX_NUM20
#defineMAX_NAME5
#defineMAX_INFO20
typedefintVRType;
typedefcharInfoType;
typedefcharVertexType[MAX_NAME];
enumGraphKind{DG,DN,AG,AN};
//有向图,有向网,无向图,无向图
typedefstruct
VRTypeadj;
//顶点关系类型。
对无权图,用1或0表示相邻与否
//对带权图,则为权值类型
InfoType*info;
//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
structMGraph
{VertexTypevexs[MAX_VERTEX_NUM];
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum,arcnum;
//图的当前定点数和弧数
GraphKindkind;
//图的种类标志
};
intLocateVex(MGraphG,VertexTypeu)
//初始条件:
图G存在,u和G中顶点有相同的特征
//操作结果:
若G中存在顶点u,则返回顶点在途中的位置,否则返回-1
inti;
G.vexnum;
++i)
if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
statusCreateFAG(MGraph&
G)
//采用数组(邻接矩阵)表示法,由文件构造没有相关信息的无向图G
inti,j,k;
charfilename[13];
VertexTypeva,vb;
FILE*graphlist;
请输入文件名(f7-1.dat):
filename);
graphlist=fopen(filename,"
r"
fscanf(graphlist,"
G.vexnum);
G.arcnum);
++i)//构造顶点向量
G.vexs[i]);
++i)//初始化邻接矩阵
for(j=0;
j<
++j)
G.arcs[i][j].adj=0;
//
G.arcs[i][j].info=NULL;
for(k=0;
G.arcnum;
++k)
{fscanf(graphlist,"
va,vb);
i=LocateVex(G,va);
j=LocateVex(G,vb);
G.arcs[i][j].adj=G.arcs[j][i].adj=1;
//无向图
fclose(graphlist);
G.kind=AG;
statusCreateDG(MGraph&
{//采用数组(邻接矩阵)表示法,构造有向图G
inti,j,k,l,IncInfo;
chars[MAX_INFO],*info;
请输入有向图G的顶点数,弧数,弧是否含有其他信息(是:
1,,否:
0):
%d%d%d"
G.vexnum,&
G.arcnum,&
IncInfo);
请输入%d个顶点的值(<
%d个字符):
G.vexnum,MAX_NAME);
for(j=0;
G.arcs[i][j].adj=0;
//图
G.arcs[i][j].info=NULL;
请输入%d条弧的弧尾,弧头(以空格为间隔):
G.arcnum);
%s%s%*c"
//用%*c吃掉回车符
i=LocateVex(G,va);
j=LocateVex(G,vb);
G.arcs[i][j].adj=1;
//有向图
if(IncInfo)
请输入关于该弧的相关信息(<
MAX_INFO);
gets(s);
l=strlen(s);
if(l)
info=(char*)malloc((l+1)*sizeof(char));
strcpy(info,s);
G.arcs[i][j].info=info;
//有向
G.kind=DG;
statusCreateDN(MGraph&
{//采用数组(邻接矩阵)表示法,构造有向网G
inti,j,k,w,IncInfo;
请输入有向网G的顶点数,弧数,弧是否含其他信息(是:
1,否:
%d个字符):
for(i=0;
G.arcs[i][j].adj=INFINITY;
//网
请输入%d条弧尾,弧头,权值(以空格为间隔):
%s%s%d%*c"
va,vb,&
w);
//%*c吃掉回车字符
i=LocateVex(G,va);
G.arcs[i][j].adj=w;
//有向网
if(IncInfo)
请输入该弧的相关信息(<
gets(s);
w=strlen(s);
if(w)
{
info=(char*)malloc((w+1)*sizeof(char));
strcpy(info,s);
G.arcs[i][j].info=info;
}
G.kind=DN;
statusCreateAG(MGraph&
{//采用数组(邻接矩阵)表示法构造无向图G
chars[MAX_INFO],*Info;
请输入无向图G的顶点数,边数,边是否含其他信息(是:
1否:
0)"
%d,%d,%d"
{G.arcs[i][j].adj=0;
//图
请输入%d条边的顶点1顶点2(以空格为间隔):
//无向图
请输入该边的相关信息(<
%d个字符)"
Info=(char*)malloc((l+1)*sizeof(char));
strcpy(Info,s);
G.arcs[i][j].info=G.arcs[j][i].info=Info;
//无向
statusCreateAN(MGraph&
{//采用数组(邻接矩阵)表示法,构造无向网G。
算法7.2
请输入无向网G的顶点数,边数,边是否含其他信息(是:
1,否0):
++i)//构造定点向量
G.arcs[i][j].adj=INFINITY;
G.arcs[i][j].info=NULL;
请输入%d条边的顶点1,顶点2权值(以空格做间隔):
//%c吃掉回车符
G.arcs[i][j].adj=G.arcs[j][i].adj=w;
//无向
G.arcs[i][j].info=G.arcs[j][i].info=info;
//无向
}
G.kind=AN;
statusCreateGraph(MGraph&
{//采用数组(邻接矩阵)表示法,构造图G。
算法7.1
请输入图G的类型(有向图:
0,有向网:
1,无向图:
2,无向网:
3)"
G.kind);
switch(G.kind)
caseDG:
returnCreateDG(G);
caseDN:
returnCreateDN(G);
//有向网
caseAG:
returnCreateAG(G);
caseAN:
returnCreateAN(G);
//无向网
default:
voidDestroyGraph(MGraph&
{//初始条件:
图G存在。
操作结果:
销毁图G
inti,j;
if(G.kind<
2)//有向
for(i=0;
i++)//释放该弧的相关信息(如果有的话)
for(j=0;
j++)
if(G.arcs[i][j].adj==1&
&
G.kind==0||G.arcs[i][j].adj!
=INFINITY&
G.kind==1)
//有向图的弧||有向网的弧
if(G.arcs[i][j].info)//有先关信息
{
free(G.arcs[i][j].info);
G.arcs[i][j].info=NULL;
}
else//无向
i++)//释放该边的相关信息(如果有的话)
for(j=i+1;
if(G.arcs[i][j].adj==1&
G.kind==2||G.arcs[i][j].adj!
G.kind==3)
//无向图的边,无向网的边
if(G.arcs[i][j].info)//有相关信息
{
free(G.arcs[i][j].info);
G.arcs[i][j].info=G.arcs[j][i].info=NULL;
}
G.vexnum=0;
G.arcnum=0;
VertexType&
GetVex(MGraphG,intv)
图G存在,v是G中的某个顶点的序号。
返回v的值
if(v>
=G.vexnum||v<
0)
exit(ERROR);
returnG.vexs[v];
statusPutVex(MGraph&
G,VertexTypev,VertexTypevalue)
{//初始条件:
图G存在,v是G中的某个顶点,操作结果:
对v赋新值value
intk;
k=LocateVex(G,v);
//k为顶点v在图G中的序号
if(k<
returnERROR;
strcpy(G.vexs[k],value);
intFirstAdjVex(MGraphG,VertexTypev)
图G存在,v是G的某个顶点
//操作结果:
返回V的第一个邻结点的序号。
若顶点在G中没有邻接点,则返回-1
inti,j=0,k;
if(G.kind==DN||G.kind==AN)
j=INFINITY;
i++)
if(G.arcs[k][i].adj!
=j)
intNextAdjVex(MGraphG,VertexTypev,VertexTypew)
图G存在,v是G中某个顶点,w是v的邻接点
返回v的(相对于w的)下一个邻接点的序号,若w是v的最后一个邻接点,返回-1
inti,j=0,k1,k2;
k1=LocateVex(G,v);
//k1为顶点v在图G中的序号
k2=LocateVex(G,w);
//k2为顶点w在图G中的序号
if(G.kind==DN||G.kind==AN)//网
//无穷大;
for(i=k2+1;
if(G.arcs[k1][i].adj!
=j)//非空
returni;
voidInsertVex(MGraph&
G,VertexTypev)
{//初始条件:
图G存在,v和图G中的顶点有相同特征
在图G中怎加新的顶点v,(不增加与定点相关的弧留待InsertArc()做)
strcpy(G.vexs[G.vexnum],v);
//构造新顶点向量
=G.vexnum;
if(G.kind%2)//网
G.arcs[G.vexnum][i].adj=INFINITY;
//初始化改行邻接矩阵的值(无边或无弧)
G.arcs[i][G.vexnum].adj=INFINITY;
//初始化该列的邻接矩阵的值(无边或弧)
else//图
G.arcs[G.vexnum][i].adj=0;
G.arcs[i][G.vexnum].adj=0;
G.arcs[G.vexnum][i].info=NULL;
G.arcs[i][G.vexnum].info=NULL;
G.vexnum+=1;
//顶点数加一
statusDeleteVex(MGraph&
{//初始条件:
删除G中顶点v及其相关弧
VRTypem=0;
//k为待删除顶点v的序号
0)//
m=INFINITY;
if(G.arcs[j][k].adj!
=m)//有入弧或边
if(G.arcs[j][k].info)//有相关信息
free(G.arcs[j][k].info);
//释放相关信息
G.arcnum--;
//修改弧数
if(G.kind==DG||G.kind==DN)//有向
for(j=0;
if(G.arcs[k][j].adj!
=m)//有出弧
if(G.arcs[k][j].info)//有相关信息
free(G.arcs[k][j].info);
G.arcnum--;
for(j=k+1;
strcpy(G.vexs[j-1],G.vexs[j]);
for(i=0;
for(j=k+1;
G.arcs[i][j-1]=G.arcs[i][j];
//移动待删除顶点之后的矩阵元素
G.arcs[j-1][i]=G.arcs[j][i];
//移动待删除顶点之下的矩阵元素
G.vexnum--;
ret
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基本 操作 邻接矩阵