【练习】邻接矩阵法创建图

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
typedef char VertexType[4];
typedef char InfoPtr;
typedef int VRType;
#define INFINITY 65535          /*定义一个无限大的值*/
#define MaxSize 50              /*最大顶点个数*/
typedef enum{DG,DN,UG,UN}GraphKind;     /*图的类型:有向图、有向网、无向图和无向网*/
typedef struct
{
    VRType adj;                 /*对于无权图,用1表示相邻,0表示不相邻;对于带权图,存储权值*/
    InfoPtr *info;              /*与弧或边的相关信息*/
}ArcNode,AdjMatrix[MaxSize][MaxSize];
typedef struct                  /*图的类型定义*/
{
    VertexType vex[MaxSize];    /*用于存储顶点*/
    AdjMatrix arc;              /*邻接矩阵,存储边或弧的信息*/
    int vexnum,arcnum;          /*顶点数和边(弧)的数目*/
    GraphKind kind;             /*图的类型*/
}MGraph;
void CreateGraph(MGraph *N);
int LocateVertex(MGraph N,VertexType v);
void DestroyGraph(MGraph *N);
void DisplayGraph(MGraph N);

void CreateGraph(MGraph *N)
/*采用邻接矩阵表示法创建有向网N*/
{
    int i,j,k,w,InfoFlag,len;
    char s[MaxSize];
    VertexType v1,v2;
    printf("请输入有向网N的顶点数,弧数,弧的信息(是:1,否:0): ");
    scanf("%d,%d,%d",&(*N).vexnum,&(*N).arcnum,&InfoFlag);
    printf("请输入%d个顶点的值(<%d个字符):\n",N->vexnum,MaxSize);
    for(i=0;i<N->vexnum;++i)        /*创建一个数组,用于保存网的各个顶点*/
        scanf("%s",N->vex[i]);
    for(i=0;i<N->vexnum;i++)        /*初始化邻接矩阵*/
        for(j=0;j<N->vexnum;j++)
        {
            N->arc[i][j].adj=INFINITY;
            N->arc[i][j].info=NULL; /*弧的信息初始化为空*/
        }
        printf("请输入%d条弧的弧尾 弧头 权值(以空格作为间隔): \n",N->arcnum);
        for(k=0;k<N->arcnum;k++)
        {
            scanf("%s%s%d",v1,v2,&w);   /*输入两个顶点和弧的权值*/
            i=LocateVertex(*N,v1);
            j=LocateVertex(*N,v2);
            N->arc[i][j].adj=w;
            if(InfoFlag)                /*如果弧包含其它信息*/
            {
                printf("请输入弧的相关信息: ");
                gets(s);
                len=strlen(s);
                if(len)
                {
                    N->arc[i][j].info=(char*)malloc((len+1)*sizeof(char)); /* 有向 */
                    strcpy(N->arc[i][j].info,s);
                }
            }
        }
        N->kind=DN;                     /*图的类型为有向网*/
}
int LocateVertex(MGraph N,VertexType v)
/*在顶点向量中查找顶点v,找到返回在向量的序号,否则返回-1*/
{
    int i;
    for(i=0;i<N.vexnum;++i)
        if(strcmp(N.vex[i],v)==0)
            return i;
        return -1;
}

void DestroyGraph(MGraph *N)
/*销毁网N*/
{
    int i,j;
    for(i=0;i<N->vexnum;i++)                /*释放弧的相关信息*/
        for(j=0;j<N->vexnum;j++)
            if(N->arc[i][j].adj!=INFINITY)  /*如果存在弧*/
                if(N->arc[i][j].info!=NULL) /*如果弧有相关信息,释放该信息所占用空间*/
                {
                    free(N->arc[i][j].info);
                    N->arc[i][j].info=NULL;
                }
    N->vexnum=0; /*将网的顶点数置为0*/
    N->arcnum=0; /*将网的弧的数目置为0*/
}



void DisplayGraph(MGraph N)
/*输出邻接矩阵存储表示的图G*/
{
    int i,j;
    printf("有向网具有%d个顶点%d条弧,顶点依次是: ",N.vexnum,N.arcnum);
    for(i=0;i<N.vexnum;++i)             /*输出网的顶点*/
        printf("%s ",N.vex[i]);
    printf("\n有向网N的:\n");           /*输出网N的弧*/
    printf("序号i=");
    for(i=0;i<N.vexnum;i++)
        printf("%8d",i);
    printf("\n");
    for(i=0;i<N.vexnum;i++)
    {
        printf("%8d",i);
        for(j=0;j<N.vexnum;j++)
            printf("%8d",N.arc[i][j].adj);
        printf("\n");
    }
}
void main()
{

    MGraph N;
    printf("创建一个网:\n");
    CreateGraph(&N);
    printf("输出网的顶点和弧:\n");
    DisplayGraph(N);
    printf("销毁网:\n");
    DestroyGraph(&N);
}

这里写图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值