【库】c实现图(数组表示法)

---------------------------graph.h--------------------

    /*一个最简单图实现,只提供了最基本的接口
     *用数组存储的无向图,本代码用到c99新增的bool类型。
     *建议使用dev c++4.9.9.0编译该代码*/
    #ifndef GRAPH_H
    #define GRAPH_H
    /*函数返回状态*/
    #ifndef OK
    #define OK 1     /*成功*/
    #define ERR -1    /*失败*/
    #endif
    /*定义函数中可能用到最大最小值*/
    #ifndef MAX 
    #define MAX 100
    #define MIN 0
    #endif
    /**/
    typedef int status;      /*函数返回状态*/
    typedef int elemtype;    /*用户根据需要更改此数据类型*/
    typedef  struct {
        elemtype date;       /*图顶点存储的数据*/
        int      arcn;       /*图顶点的度数*/
    } date;/*图的顶点*/
    typedef  bool  adjmatrix[ MAX ][ MAX ];/*图的关系矩阵类型*/
    typedef struct {
        date        vec[ MAX ];             /*存储顶点的向量*/
        adjmatrix   arcs;                   /*图的关系矩阵*/
        int         node_number, arc_number;/*顶点和边的数目*/
    } graph;/*一个图类型定义*/
    status creategraph( graph *gptr );      /*建立一个图*/
    int find_gnode( const graph*, const elemtype ); /*查找一个顶点*/  
    status print_graph( const graph *gptr );       /*打印*/
    #endif  

---------------------graph.c-------------------------------------------

#include <stdio.h>
#include "graph.h" 
status creategraph( graph *gptr )  /*建立图*/
{
   int i, j, k;
   if( gptr == NULL )   /*如果指针为空*/
     return ERR;
   printf( "请输入顶点个数:" );
   scanf( "%d", &gptr->node_number );
   printf( "请输入边数:" );
   scanf( "%d", &gptr->arc_number );
   printf( "请输入%d个数据:", gptr->node_number );
   for( i = 0; i < gptr->node_number; ++i )
    {/*初始化并设置数据向量*/
        scanf( "%d", &gptr->vec[i].date );
        gptr->vec[i].arcn = 0;
    }    
   for( i = 0; i < gptr->node_number; ++i ) 
     for( j = 0; j < gptr->node_number; ++j )
         gptr->arcs[i][j] = false;      /*初始化关系矩阵*/  
   for( k = 0; k < gptr->arc_number; ++k )
   {/*设计关系矩阵*/
       elemtype a, b;
       printf( "请输入相邻的节点的数据:" );
       scanf( "%d %d", &a, &b );
       i = find_gnode( gptr, a );
       j = find_gnode( gptr, b );
       if( ( i < 0 ) || ( j < 0 ) )
       return ERR;
       gptr->arcs[i][j] = gptr->arcs[j][i] = true;
   }   
   for( i = 0; i < gptr->node_number; ++i )
     for( j = 0; j < gptr->node_number; ++j )
      gptr->vec[i].arcn += gptr->arcs[i][j];
           /*计算每个顶点的度*/    
   return OK;    
}   
int find_gnode( const graph *gptr, const elemtype date )
{                                                /*查找顶点*/
    int i;
    if( gptr == NULL ) /*如果指针为空,返回负值*/
     return -1;
    for( i = 0; i < gptr->node_number; ++i )
     if( date == gptr->vec[i].date )
       return i;
    return -1; /*没找到也返回负值*/
}
status print_graph( const graph *gptr )/*打印*/
{
    int i, j;
    if( gptr == NULL )
     return ERR;
    printf( "图中存储数据(节点度数)如下:/n" ); 
    for( i = 0; i < gptr->node_number; ++i )
     printf("%d(%d)/t", gptr->vec[i].date, gptr->vec[i].arcn );
    printf( "/n" );
    printf( "图的关系矩阵如下:/n" );
    for( i = 0; i < gptr->node_number; ++i )
    { for( j = 0; j < gptr->node_number; ++j )
      printf( "%d/t", gptr->arcs[i][j] );
         printf( "/n" );
    }
     return OK;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值