图的邻接表的建立

#include<stdlib.h>
#include<stdio.h>
#define maxs 20
typedef char vertextype;
typedef enum{dg,udg,dn,udn}graphkind;
typedef struct arcnode         
{
  int adivex;               //该弧所指结点位置
  int weight;               //权重
  struct arcnode *nextarc;      //指向下一条弧的指针
}arcnode;
typedef struct vnode
{
  vertextype data;       //顶点信息
  arcnode *firstarc;    //指向第一条依附该顶点弧的指针
}vnode;
typedef struct
{
  vnode vexs[maxs];        
  int arcnum,vexnum;    //弧数,顶点数
  enum graphkind kind;
}algraph;
algraph *creat(algraph *p)
{
  int num;
  int choose;
  vertextype ch;
  printf("输入顶点数:");
  scanf("%d",&num);
  if(num==0)
 p=NULL;
  else
  {
     if(!(p=(algraph*)malloc(sizeof(algraph))))
{
  printf("error!\n");
  exit(0);
}
     while(1)
{
system("cls");
        printf("图的种类\n");
printf("1.有向图\n");
printf("2.无向图\n");
printf("3.有向网\n");
printf("4.无向网\n");
printf("请输入你的选择:");
scanf("%d",&choose);
switch(choose)
{
case 1:
{
 p->kind=dg;
 break;
}
case 2:
{
 p->kind=udg;
 break;
}
case 3:
{
 p->kind=dn;
 break;
}
case 4:
{
 p->kind=udn;
 break;
}
default:
{
 printf("error input!\n");
 system("pause");
}
}
if(choose>=1&&choose<=4)
break;
}
      ch=getchar();
 if(1)
 {
 int i,j;
 arcnode *s;
 p->vexnum=num;
 p->arcnum=0;
 printf("输入顶点:");
   for(i=0;i<num;i++)
{
scanf("%c",&p->vexs[i].data);
if(!(p->vexs[i].firstarc=(arcnode*)malloc(sizeof(arcnode))))   //为第一个依附该顶点的弧申请空间
{
 printf("error!\n");
 exit(0);
}
p->vexs[i].firstarc->adivex=i;
}


for(i=0;i<num;i++)
{
  ch=getchar();      //读入回车,避免回车读入数据中
  p->vexs[i].firstarc->nextarc=NULL;
  printf("输入%c可到达的顶点:",p->vexs[i].data);
  while(1)
  {
    ch=getchar();       //数据输入  
for(j=0;j<num;j++)
if(ch==p->vexs[j].data)
{
  if(!(s=(arcnode*)malloc(sizeof(arcnode))))
  {
    printf("error!\n");
exit(0);
  }
  s->adivex=j;
  if(p->kind==dn||p->kind==udn)
  {
  ch=getchar();       //读入回车,避免回车读入权重
    printf("输入%d到%d权重:",p->vexs[i].firstarc->adivex,s->adivex);
scanf("%d",&s->weight);
  }
  s->nextarc=p->vexs[i].firstarc->nextarc;
  p->vexs[i].firstarc->nextarc=s;
}
if(ch=='\n')
break;
  }
}
  for(i=0;i<num;i++)
 {
   s=p->vexs[i].firstarc->nextarc;
while(s!=NULL)
{
 p->arcnum=p->arcnum+1;     //图的数量为结点数
 s=s->nextarc;
}
 }
        if(p->kind==udg||p->kind==udn)     //网弧的数量为结点数一半
{
p->arcnum=p->arcnum/2;
}
 }
  }
  return p;
}
void show(algraph *p)
{
  int i;
  arcnode *s;
  if(p)
  {
        printf("图的种类:%d\n",p->kind);
printf("图的顶点数:%d\n",p->vexnum);
printf("图的弧数:%d\n",p->arcnum);
printf("图的邻接表:\n");
    for(i=0;i<p->vexnum;i++)
{
 s=p->vexs[i].firstarc;
 printf("%c-%d",p->vexs[i].data,s->adivex);
 while(s!=NULL)
 {
             s=s->nextarc;
if(s!=NULL)
    printf("%3d %d",s->adivex,s->weight);
 }
 if(s==NULL)
 printf("\n");
}
  }
  else
     printf("无此图!\n");
}
int main()
{
  algraph *p,s;
  p=&s;
  p=creat(p);
  show(p);
  system("pause");
  return 0;
}

猜你喜欢

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