#include<stdlib.h>
#include<stdio.h>
#define maxs 20 //最大顶点数
#define MAX_ 0 //表示点与点之间不可到达
typedef char vtype;
typedef enum{dg,dn,udg,udn}graphkind; //有向图,有向网,无向图,无向网
typedef struct
{
vtype vexs[maxs]; //储存顶点
int arcs[maxs][maxs]; //邻接矩阵
int vexnum,arcnum; //顶点数,弧数
graphkind kind; //图的种类
}mgraph;
mgraph *creat(mgraph *p)
{
int num;
int choose;
while(1)
{
printf("输入顶点个数(num<=%d):",maxs);
scanf("%d",&num);
if(num>maxs)
{
printf("error input!");
system("pause");
}
else
break;
}
if(num==0) //顶点数为0
p=NULL;
else
{
if(!(p=(mgraph*)malloc(sizeof(mgraph))))
{
printf("内存申请失败!\n");
exit(0);
}
while(1)
{
system("cls");
printf("图的种类\n");
printf("1.有向图\n");
printf("2.有向网\n");
printf("3.无向图\n");
printf("4.无向网\n");
printf("输入你的选择(1-4):");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
p->kind=dg;
break;
}
case 2:
{
p->kind=dn;
break;
}
case 3:
{
p->kind=udg;
break;
}
case 4:
{
p->kind=udn;
break;
}
default:
{
printf("error input!\n");
system("pause");
}
}
if(choose>=1&&choose<=4)
break;
}
if(1)
{
int i,j;
vtype ch;
int weight; //权重
p->vexnum=num; //顶点数//
p->arcnum=0; //初始化弧数
if(p->kind==dg||p->kind==udg) //初始化邻接矩阵
{
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
{
p->arcs[i][j]=0;
}
}
else
{
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
{
p->arcs[i][j]=MAX_;
}
}
ch=getchar(); //读回车缓存,避免回车读入顶点
printf("输入顶点:");
for(i=1;i<=num;i++)
{
scanf("%c",&p->vexs[i]);
}
for(i=1;i<=num;i++)
{
ch=getchar(); //读入回车缓存,避免回车影响结果
printf("输入%c能到达的顶点(format:a,b):",p->vexs[i]);
while(1)
{
ch=getchar(); //输入数据
for(j=1;j<=num;j++)
if(p->vexs[j]==ch)
{
if(p->kind==udg) //无向图
{
p->arcs[i][j]=1;
p->arcs[j][i]=1;
}
if(p->kind==dg) //有向图
{
p->arcs[i][j]=1;
}
if(p->kind==udn) //无向网
{
ch=getchar();
printf("输入%c到%c的权值:",p->vexs[i],p->vexs[j]);
scanf("%d",&weight);
p->arcs[i][j]=weight;
p->arcs[j][i]=weight;
}
if(p->kind==dn) //有向网
{
scanf("%d",&weight);
p->arcs[i][j]=weight;
}
p->arcnum++;
}
if(ch=='\n')
break;
}
}
if(p->kind==udg||p->kind==udn) //无向图,无向网计算弧数
{
weight=0;
for(i=1;i<=p->vexnum;i++)
for(j=i;j<=p->vexnum;j++)
if(p->arcs[i][j]==p->arcs[j][i]&&p->arcs[i][j]!=MAX_&&p->arcs[i][j]!=0)
weight++;
p->arcnum=weight;
}
}
}
return p;
}
void show(mgraph *p)
{
int i,j;
if(p)
{
printf("图的种类:%d\n",p->kind);
printf("图的顶点为:");
for(i=1;i<=p->vexnum;i++)
printf("%c ",p->vexs[i]);
printf("\n");
printf("图的邻接矩阵为:\n");
for(i=1;i<=p->vexnum;i++)
for(j=1;j<=p->vexnum;j++)
{
printf("%5d",p->arcs[i][j]);
if(j==p->vexnum)
printf("\n");
}
printf("图的顶点数:%d\n",p->vexnum);
printf("图的弧数:%d\n",p->arcnum);
}
else
printf("无此图!\n");
}
int main()
{
mgraph *p,s;
p=&s;
p=creat(p);
show(p);
system("pause");
return 0;
}
#include<stdio.h>
#define maxs 20 //最大顶点数
#define MAX_ 0 //表示点与点之间不可到达
typedef char vtype;
typedef enum{dg,dn,udg,udn}graphkind; //有向图,有向网,无向图,无向网
typedef struct
{
vtype vexs[maxs]; //储存顶点
int arcs[maxs][maxs]; //邻接矩阵
int vexnum,arcnum; //顶点数,弧数
graphkind kind; //图的种类
}mgraph;
mgraph *creat(mgraph *p)
{
int num;
int choose;
while(1)
{
printf("输入顶点个数(num<=%d):",maxs);
scanf("%d",&num);
if(num>maxs)
{
printf("error input!");
system("pause");
}
else
break;
}
if(num==0) //顶点数为0
p=NULL;
else
{
if(!(p=(mgraph*)malloc(sizeof(mgraph))))
{
printf("内存申请失败!\n");
exit(0);
}
while(1)
{
system("cls");
printf("图的种类\n");
printf("1.有向图\n");
printf("2.有向网\n");
printf("3.无向图\n");
printf("4.无向网\n");
printf("输入你的选择(1-4):");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
p->kind=dg;
break;
}
case 2:
{
p->kind=dn;
break;
}
case 3:
{
p->kind=udg;
break;
}
case 4:
{
p->kind=udn;
break;
}
default:
{
printf("error input!\n");
system("pause");
}
}
if(choose>=1&&choose<=4)
break;
}
if(1)
{
int i,j;
vtype ch;
int weight; //权重
p->vexnum=num; //顶点数//
p->arcnum=0; //初始化弧数
if(p->kind==dg||p->kind==udg) //初始化邻接矩阵
{
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
{
p->arcs[i][j]=0;
}
}
else
{
for(i=1;i<=num;i++)
for(j=1;j<=num;j++)
{
p->arcs[i][j]=MAX_;
}
}
ch=getchar(); //读回车缓存,避免回车读入顶点
printf("输入顶点:");
for(i=1;i<=num;i++)
{
scanf("%c",&p->vexs[i]);
}
for(i=1;i<=num;i++)
{
ch=getchar(); //读入回车缓存,避免回车影响结果
printf("输入%c能到达的顶点(format:a,b):",p->vexs[i]);
while(1)
{
ch=getchar(); //输入数据
for(j=1;j<=num;j++)
if(p->vexs[j]==ch)
{
if(p->kind==udg) //无向图
{
p->arcs[i][j]=1;
p->arcs[j][i]=1;
}
if(p->kind==dg) //有向图
{
p->arcs[i][j]=1;
}
if(p->kind==udn) //无向网
{
ch=getchar();
printf("输入%c到%c的权值:",p->vexs[i],p->vexs[j]);
scanf("%d",&weight);
p->arcs[i][j]=weight;
p->arcs[j][i]=weight;
}
if(p->kind==dn) //有向网
{
ch=getchar();
printf("输入%c到%c的权值:",p->vexs[i],p->vexs[j]);
scanf("%d",&weight);
p->arcs[i][j]=weight;
}
p->arcnum++;
}
if(ch=='\n')
break;
}
}
if(p->kind==udg||p->kind==udn) //无向图,无向网计算弧数
{
weight=0;
for(i=1;i<=p->vexnum;i++)
for(j=i;j<=p->vexnum;j++)
if(p->arcs[i][j]==p->arcs[j][i]&&p->arcs[i][j]!=MAX_&&p->arcs[i][j]!=0)
weight++;
p->arcnum=weight;
}
}
}
return p;
}
void show(mgraph *p)
{
int i,j;
if(p)
{
printf("图的种类:%d\n",p->kind);
printf("图的顶点为:");
for(i=1;i<=p->vexnum;i++)
printf("%c ",p->vexs[i]);
printf("\n");
printf("图的邻接矩阵为:\n");
for(i=1;i<=p->vexnum;i++)
for(j=1;j<=p->vexnum;j++)
{
printf("%5d",p->arcs[i][j]);
if(j==p->vexnum)
printf("\n");
}
printf("图的顶点数:%d\n",p->vexnum);
printf("图的弧数:%d\n",p->arcnum);
}
else
printf("无此图!\n");
}
int main()
{
mgraph *p,s;
p=&s;
p=creat(p);
show(p);
system("pause");
return 0;
}