数据结构——邻接矩阵法(C语言实现)
- 直接上代码:
//邻接矩阵法
#include <stdio.h>
#define max 100
#define Elemtype char
typedef struct{
Elemtype vex[max];
int edge[max][max];
int vexnum,arcnum; //图的当前顶点数和弧数
int mbool;
}MGraph;
int main()
{
MGraph mgraph;
printf("输入顶点个数:\n");
scanf("%d",&mgraph.vexnum);
getchar();
printf("请输入edge矩阵:\n");
int i,j;
for(i = 0;i < mgraph.vexnum;i++)
for(j = 0;j < mgraph.vexnum;j++)
{
scanf("%d",&mgraph.edge[i][j]);
getchar();
}
//检验矩阵是否无误
// printf("矩阵为:\n");
// for(i = 0;i < mgraph.vexnum;i++)
// {
// for(j = 0;j < mgraph.vexnum;j++)
// {
// printf("%d ",mgraph.edge[i][j]);
// }
// printf("\n");
// }
printf("请输入元素值:\n");
for(i = 0;i < mgraph.vexnum;i++)
scanf("%c",&mgraph.vex[i]);
//检验元素值是否无误
// for(i = 0;i < mgraph.vexnum;i++)
// printf("%c",mgraph.vex[i]);
// printf("\n");
printf("请输入此图为有向图还是无向图:\n有向图输入0.无向图输入1:\n");
scanf("%d",&mgraph.mbool);
int count = 0,number[max] = {0};
if(mgraph.mbool == 1)
{
for(i = 0;i < mgraph.vexnum;i++)
{
count = 0;
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[i][j] != 0)
count++;
else continue;
}
if(count != 0)
{
printf("第%d个顶点%c与%d个顶点连通;\n",i+1,mgraph.vex[i],count);
printf("度为%d\n",count);
printf("分别为:\n");
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[i][j] !=0)
printf("第%d个顶点%c\n",j+1,mgraph.vex[j]);
}
printf("\n\n");
}
else
printf("第%d个顶点%c没有与任何顶点连通;\n\n",i+1,mgraph.vex[i]);
}
}
else if(mgraph.mbool == 0)
{
for(i = 0;i < mgraph.vexnum;i++)
{
count = 0;
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[i][j] != 0)
count++;
else continue;
}
number[i] += count;
if(count != 0)
{
printf("第%d个顶点%c有%d个指向其它顶点边;\n",i+1,mgraph.vex[i],count);
printf("出度为%d\n",count);
printf("分别为:\n");
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[i][j] !=0)
printf("第%d个顶点%c\n",j+1,mgraph.vex[j]);
}
printf("\n\n");
}
else
printf("第%d个顶点%c出度为0;\n\n",i+1,mgraph.vex[i]);
}
for(i = 0;i < mgraph.vexnum;i++)
{
count = 0;
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[j][i] != 0)
count++;
else continue;
}
number[i] += count;
if(count != 0)
{
printf("第%d个顶点%c有%d个被其它顶点指向的边;\n",i+1,mgraph.vex[i],count);
printf("入度为%d\n",count);
printf("分别为:\n");
for(j = 0;j < mgraph.vexnum;j++)
{
if(mgraph.edge[j][i] !=0)
printf("第%d个顶点%c\n",j+1,mgraph.vex[j]);
}
printf("\n\n");
}
else
printf("第%d个顶点%c入度为0;\n\n",i+1,mgraph.vex[i]);
}
}
if(mgraph.mbool == 0)
for(i = 0;i < mgraph.vexnum;i++)
printf("第%d个元素%c的度为%d\n",i+1,mgraph.vex[i],number[i]);
return 0;
}
中间循环有点冗杂,可以优化,初学轻喷.