#include "conio.h"
#include "stdio.h"
#define MAXSIZE 100 //最大顶点数
struct Graph
{
char vexs[MAXSIZE]; //顶点数组
int arcs[MAXSIZE][MAXSIZE]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
};
main()
{
int quit=0,i,j;
struct Graph MGraph; //定义一个图
MGraph.vexnum=0;
MGraph.arcnum=0; //图的当前顶点数和弧数为0
for(i=0;i<MAXSIZE;i++) //邻接矩阵初始化
{
for(j=0;j<MAXSIZE;j++)
MGraph.arcs[i][j]=0;
}
while(!quit) //图的操作菜单
{
char ch;
clrscr();
puts("1 插入图节点");
puts("2 插入弧");
puts("3 当前节点数量");
puts("4 察看指定节点的度");
puts("5 察看当前邻接矩阵");
puts("6 退出");
ch=getch();
switch(ch)
{
case '1':InsertVex(&MGraph);break;
case '2':InsertArc(&MGraph);break;
case '3':ShowVexNum(&MGraph);break;
case '4':ShowDepth(&MGraph);break;
case '5':Showarcs(&MGraph);break;
case '6':quit=1;break;
}
}
}
InsertVex(struct Graph *MGraph)
{
char data;
clrscr();
printf("请输入节点:");
data=getche(); //不能用getchar,这样相当于输入了一个'/n'节点
MGraph->vexs[MGraph->vexnum]=data; //储存在顶点数组里
MGraph->vexnum++; //当前顶点+1
puts("/n插入成功");
printf("%d",MGraph->vexnum);
getch();
}
InsertArc(struct Graph *MGraph)
{
char node1,node2;
int i,j;
clrscr();
printf("请输入弧的相关信息:");
node1=getche();
node2=getche(); //同样这里也不能用getchar
for(i=0;i<MGraph->vexnum;i++)
{
printf("i:%c",MGraph->vexs[i]);
if (MGraph->vexs[i]==node1) //查找这两个节点,找到后跳出循环
break;
}
for(j=0;j<MGraph->vexnum;j++)
if(MGraph->vexs[j]==node2)
break;
MGraph->arcs[i][j]=MGraph->arcs[j][i]=1; //在邻接矩阵中储存该关系
}
ShowVexNum(struct Graph *MGraph)
{
clrscr();
printf("共有%d个节点",MGraph->vexnum); //显示当前节点数
getch();
}
ShowDepth(struct Graph *MGraph)
{
int i,j,depth=0;
char ch;
clrscr();
printf("请输入要检查的节点:");
ch=getche();
for(i=0;i<MGraph->vexnum;i++) //查找该节点
if(MGraph->vexs[i]==ch)
break;
for(j=0;j<MGraph->vexnum;j++) //计算出该行有多少个1 ,是1则depth+1
if(1==MGraph->arcs[i][j])
depth++;
printf("/n该节点的度为:%d",depth);
getch();
}
Showarcs(struct Graph *MGraph)
{
int i,j;
for(i=0;i<MGraph->vexnum;i++) //两个循环套用显示当前邻接矩阵的状态
for(j=0;j<MGraph->vexnum;j++)
{
printf("%5d",MGraph->arcs[i][j]);
if(j==MGraph->vexnum-1)
printf("/n");
}
getch();
}