第7章 图文档格式.docx
《第7章 图文档格式.docx》由会员分享,可在线阅读,更多相关《第7章 图文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
typedefcharVertexType[MAX_NAME];
//顶点类型!
!
typedefcharInfoType;
//相关信息类型
typedefenum{DG,DN,UDG,UDN}GraphKind;
//{有向图,有向网,无向图,无向网}//!
1!
枚举怎么用?
?
typedefstructArcCell{
VRTypeadj;
//VRType是顶点关系类型。
对无权图,用1或0
//表示相邻否;
对带权图,则为权值类型。
InfoType*info;
//该弧相关信息指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedefstruct{
VertexTypevexs[MAX_VERTEX_NUM];
//顶点向量
AdjMatrixarcs;
//邻接矩阵
intvexnum,arcnum;
//图的当前顶点数和弧数
GraphKindkind;
//图的种类标志
}MGraph;
//函数声明
intLocateVex(MGraphG,VertexTypeu);
voidCreateGraph(MGraph&
G);
voidCreateFUDG(MGraph&
//由文件构造
voidCreateFUDN(MGraph&
voidCreateDG(MGraph&
voidCreateDN(MGraph&
voidCreateUDG(MGraph&
voidCreateUDN(MGraph&
voidDestroyGraph(MGraph&
VertexType&
GetVex(MGraphG,intv);
//为什么要加&
StatusPutVex(MGraph&
G,VertexTypev,VertexTypevalue);
//若G中存在顶点u,则返回顶点在图中的位置;
否则返回-1
intLocateVex(MGraphG,VertexTypeu)
{
inti;
for(i=0;
i<
G.vexnum;
++i)
if(strcmp(u,G.vexs[i])==0)
returni;
return-1;
}
/*==================================================
//算法7.1
//采用数组(邻接矩阵)表示法,构造图G。
G)
scanf("
%s"
&
G.kind);
switch(G.kind){
caseDG:
CreateDG(G);
//构造有向图G
break;
caseDN:
CreateDN(G);
//构造有向网G
caseUDG:
CreateUDG(G);
//构造无向图G
caseUDN:
CreateUDN(G);
//构造无向网G
}
====================================================*/
printf("
请输入图的类型(有向图:
0,有向网:
1,无向图:
2,无向网:
3):
"
);
%d"
//采用数组(邻接矩阵)表示法,构造无向图G。
由文件构造
inti,j,k;
charfilename[13];
VertexTypeva,vb;
FILE*graphlist;
请输入数据文件名:
filename);
graphlist=fopen(filename,"
r"
//打开数据文件,并以graphlist表示
fscanf(graphlist,"
G.vexnum);
G.arcnum);
++i)//构造顶点向量
fscanf(graphlist,"
G.vexs[i]);
++i)//初始化邻接矩阵
for(j=0;
j<
++j)
{
G.arcs[i][j].adj=0;
//图
G.arcs[i][j].info=NULL;
//没有相关信息
}
for(k=0;
k<
G.arcnum;
++k)
{
%s%s"
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=UDG;
//算法7.2
//采用数组(邻接矩阵)表示法,构造无向网G。
inti,j,k,w;
G.arcs[i][j].adj=INFINITY;
//网
%s%s%d"
va,vb,&
w);
G.arcs[i][j].adj=G.arcs[j][i].adj=w;
//无向网
G.kind=UDN;
//采用数组(邻接矩阵)表示法,构造有向图G
inti,j,k,l,IncInfo;
chars[MAX_INFO];
请输入有向图G的顶点数,弧数,弧是否含其它信息(是:
1,否:
0):
%d%d%d"
G.vexnum,&
G.arcnum,&
IncInfo);
请输入%d个顶点的值(<
%d个字符):
\n"
G.vexnum,MAX_NAME);
scanf("
请输入%d条弧的弧尾弧头(以空格作为间隔):
G.arcnum);
%s%s%*c"
//%*c吃掉回车符
G.arcs[i][j].adj=1;
//有向图
if(IncInfo)
printf("
请输入该弧的相关信息(<
MAX_INFO);
gets(s);
l=strlen(s);
if(l)
{
G.arcs[i][j].info=(char*)malloc((l+1)*sizeof(char));
//有向
strcpy(G.arcs[i][j].info,s);
}
G.kind=DG;
//采用数组(邻接矩阵)表示法,构造有向网G
inti,j,k,w,IncInfo;