图:图是现实生活中经常经常用到的一种多对多的数据组织形式,在程序设计中有着广泛的应用,邻接矩阵则是用一组一维数组存储途中顶点的信息,用矩阵表示图中各顶点之间的邻接关系。
通过该程序可以实现以邻接矩阵为储存结构的有向图,无向图,有向网,无向网的创建操作。
程序如下
#include<stdlib.h>
#include<stdio.h>
#define max_vertex_num 10
#define infinity 32768
#define Ture 1
#define False 0
#define Error -1
#define Ok 1
typedef enum{dg,dn,udg,udn} graphkind;
typedef char vertexdata;
typedef struct arcnode
{
int adj;
} arcnode;
typedef struct
{
vertexdata vexs[max_vertex_num];
arcnode arcs[max_vertex_num][max_vertex_num];
int vexnum,arcnum;
graphkind kind;
}adjmatrix;
int locatevertex(adjmatrix *G,vertexdata v)//求顶点位置的函数
{
int j=Error,k;
for(k=0;k<G->vexnum;k++)
if(G->vexs[k]==v)
{
j=k;
break;
}
return j;
}
void menu()
{
printf("*************************\n");
printf("*请选择命令序号(0-4):\t*\n");
printf("*1 输入有向网:\t\t*\n");
printf("*2 输入无向网:\t\t*\n");
printf("*3 输入有向图:\t\t*\n");
printf("*4 输入无向图:\t\t*\n");
printf("*0 退出:\t\t*\n");
printf("*************************\n");
}
int creatdn(adjmatrix *G)
{
int i,j,k,weight;
vertexdata v1,v2;
printf("您选择的是输入有向网!\n");
printf("请输入有向网的弧数和顶点数\n");
fflush(stdin); //清空输入缓冲区
scanf("%d,%d",&G->arcnum,&G->vexnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=infinity;
for(i=0;i<G->vexnum;i++)
{
printf("输入图的顶点\n");
fflush(stdin);
scanf("%c",&G->vexs[i]);
}
for(k=0;k<G->arcnum;k++)
{
printf("输入一条边的两个顶点及权值\n");
fflush(stdin);
scanf("%c,%c,%d",&v1,&v2,&weight);
i=locatevertex(G,v1);
j=locatevertex(G,v2);
G->arcs[i][j].adj=weight;
}
return Ok;
}
int creatudn(adjmatrix *G)
{
int i,j,k,weight;
vertexdata v1,v2;
printf("您选择的是输入无向网!\n");
printf("请输入无向网的弧数和顶点数\n");
fflush(stdin); //清空输入缓冲区
scanf("%d,%d",&G->arcnum,&G->vexnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=infinity;
for(i=0;i<G->vexnum;i++)
{
printf("输入图的顶点\n");
fflush(stdin);
scanf("%c",&G->vexs[i]);
}
for(k=0;k<G->arcnum;k++)
{
printf("输入一条边的两个顶点及权值\n");
fflush(stdin);
scanf("%c,%c,%d",&v1,&v2,&weight);
i=locatevertex(G,v1);
j=locatevertex(G,v2);
G->arcs[i][j].adj=weight;
G->arcs[j][i].adj=weight;
}
return Ok;
}
int creatdg(adjmatrix *G)
{
int i,j,k;
vertexdata v1,v2;
printf("您选择的是输入有向图!\n");
printf("请输入有向图的弧数和顶点数\n");
fflush(stdin);
scanf("%d,%d",&G->arcnum,&G->vexnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=0;
for(i=0;i<G->vexnum;i++)
{
printf("输入图的顶点\n");
fflush(stdin);
scanf("%c",&G->vexs[i]);
}
for(k=0;k<G->arcnum;k++)
{
printf("输入一条弧的两个顶点\n");
fflush(stdin);
scanf("%c,%c",&v1,&v2);
i=locatevertex(G,v1);
j=locatevertex(G,v2);
G->arcs[i][j].adj=1;
}
return Ok;
}
int creatudg(adjmatrix *G)
{
int i,j,k;
vertexdata v1,v2;
printf("您选择的是输入无向图!\n");
printf("请输入无向图的弧数和顶点数\n");
fflush(stdin);
scanf("%d,%d",&G->arcnum,&G->vexnum);
for(i=0;i<G->vexnum;i++)
for(j=0;j<G->vexnum;j++)
G->arcs[i][j].adj=0;
for(i=0;i<G->vexnum;i++)
{
printf("输入图的顶点\n");
fflush(stdin);
scanf("%c",&G->vexs[i]);
}
for(k=0;k<G->arcnum;k++)
{
printf("输入一条弧的两个顶点\n");
fflush(stdin);
scanf("%c,%c",&v1,&v2);
i=locatevertex(G,v1);
j=locatevertex(G,v2);
G->arcs[i][j].adj=1;
G->arcs[j][i].adj=1;
}
return Ok;
}
void display(adjmatrix *G)
{
int i,j;
printf("输出如下:\n");
for(i=0;i<G->vexnum;i++)
{
for(j=0;j<G->vexnum;j++)
printf("%d\t",G->arcs[i][j].adj);
printf("\n");
}
}
void function()
{
adjmatrix G;
int i;
menu();
scanf("%d",&i);
while(1)
{
switch(i)
{
case 1:{
creatdn(&G);
display(&G);}break;
case 2:{
creatudn(&G);
display(&G);}break;
case 3:{
creatdg(&G);
display(&G);}break;
case 4:{
creatudg(&G);
display(&G);}break;
case 0:exit(1);
default:printf("输入的命令错误!请重新输入:\n");
}
menu();
scanf("%d",&i);
}
}
int main()
{
function();
return 0;
}