图的邻接矩阵建立

#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)   //有向网
                               {
                                   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;
}

猜你喜欢

转载自blog.csdn.net/fight_snail/article/details/80148685