邻接矩阵图

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define maxsize 100
#define infinity 1000
typedef char vertag[4];
typedef enum                      //图类型的定义 
{
DN,DG,UG,UN
}graphkind;
typedef struct 
{
int adj;
char *infopro;
}arcnode,graph[maxsize][maxsize]; 
typedef struct
{
vertag vex[maxsize];            //顶点数组的获取
int arcnum,vexnum;            //顶点数、边的数目
graph arc;
graphkind kind;
}mgraph;
void creategraph(mgraph *n)
{
int i,j,k,l,w,len,infrog;
char s[maxsize];
vertag v1,v2;
printf("请输入有向网n的顶点数、边数、边的信息(是:1,否:0):");
scanf("%d%d%d",&(*n).arcnum,&(*n).vexnum,&infrog);
printf("请输入%d个顶点的值:",n->arcnum);
for(i=0;i<n->arcnum;i++)
{
    scanf("%s",n->vex[i]);
}
for(i=0;i<n->arcnum;i++)
   for(j=0;j<n->arcnum;j++)
   {
      n->arc[i][j].adj=infinity;
      n->arc[i][j].infopro=NULL;
   }
printf("请输入%d条弧的弧尾、弧头、权值(以空格作为间隔):\n",n->vexnum);
for(i=0;i<n->vexnum;i++)
{
scanf("%s%s%d",v1,v2,&w);
k=locate(*n,v1);
l=locate(*n,v2);
n->arc[k][l].adj=w;
if(infrog)
{
printf("请输入弧的信息:");
gets(s);
len=strlen(s);
if(len)
{
n->arc[k][l].infopro=(char *)malloc((len+1)*sizeof(char));
    strcpy(n->arc[k][l].infopro,s);
}

}
}n->kind=DN;
}
int locate(mgraph n,vertag v)
{
int i;
for(i=0;i<n.vexnum;i++)
if(strcmp(v,n.vex[i]))
return i;
return -1;
}
void destroy(mgraph n)
{
int i,j;
for(i=0;i<n.arcnum;i++)
    for(j=0;j<n.arcnum;j++)
    {
    if(n.arc[i][j].adj!=infinity)
    {
    n.arc[i][j].adj=infinity;
}
if(n.arc[i][j].infopro!=NULL)
{
free(n.arc[i][j].infopro);
n.arc[i][j].infopro=NULL;
}
}
n.arcnum=0;
n.vexnum=0;
}
void display(mgraph n)
{
int i,j;
printf("有向网具有%d个顶点%d条弧,顶点依次是:",n.arcnum,n.vexnum);
for(i=0;i<n.vexnum;i++)
{
printf("%s ",n.vex[i]);
}
printf("\n");
printf("有向网n的:\n");
printf("序号i=");
for(i=0;i<n.arcnum;i++)
{
printf("%8d",i);
}
printf("\n");
for(i=0;i<n.arcnum;i++)
{
printf("%8d",i);
for(j=0;j<n.arcnum;j++)
printf("%8d",n.arc[i][j].adj);
printf("\n");

}
int main()
{
mgraph n;
printf("创建一个表:\n");
creategraph(&n);
printf("输出网的顶点和弧:\n");
display(n);
return 0;

}

/*邻接矩阵的总体思路:利用两个数组实现,一位数组存放顶点,二位数组则存放顶点之间的关系,通过locate函数的调用寻找到该顶点与顶点之间的位置关系。*/


猜你喜欢

转载自blog.csdn.net/zhouzhou_98/article/details/80672984