无向图

#include<stdio.h>
#include<stdlib.h>


#define MAX_VERTEX_NUM 20//定义图中的最大顶点的个数
#define NUM 5//定义图中所包含的节点的个数
#define INFINITY 10000//定义最大值 在对图中顶点关系进行初始化时使用


typedef enum{DG, DN, UDG, UDN}GraphKind;//有向图 有向网 无向图 无向网
typedef struct ArcCell
{
    int adj;//顶点关系类型  无权图为0 1  表示相邻否
                    // 带权图则为权值类型
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//定义一个二维邻接矩阵


typedef struct
{
    char verx[MAX_VERTEX_NUM];//顶点向量(本质上来说 在这个数组中才存储了图中所有有价值的顶点的值 一维连续)
                                //该数组的初始化大小必须大于图中所包含的顶点的个数
    AdjMatrix arcs;   //图结构体中包含邻接矩阵这一元素(通过某两个顶点在顶点数组中的位置对相应的二维邻接矩阵中的元素进行赋值)
    int vexnum, arcnum;  //图的当前节点数和弧数 只在函数开始时进行一次初始化
    GraphKind kind; //图的种类标志
}MGraph, *MGraphList;//图


void CreatUDN(FILE *fp, MGraphList &G);//创建一个图 fp为文件指针 从文件中读取数据
int LocateVex(MGraphList G, char v);//对v在图中的位置进行定位
void OutPutMGraph(MGraphList G);//输出邻接矩阵


int main ()
{
    FILE *fp;//定义打开文件的指针
    MGraphList G;//定义图的起点


    CreatUDN(fp, G);//本函数为从文件中读取信息
    OutPutMGraph(G);//输出图(实际上是输出图的邻接矩阵)


}


int LocateVex(MGraphList G, char v)//函数作用:查找某顶点在图中的位置
{
    int i;
    for(i=1; i<=G->vexnum; i++)//G->vexnum是图的顶点数
    {
        if(G->verx[i]==v)//如果找到就返回该值在图的顶点数列中的位置
            return i;//图的顶点数列是一个一维连续的数组
                    //图的邻接矩阵是一个二维的不连续的数组
    }
    return 0;
}


void CreatUDN(FILE *fp, MGraphList &G)
{
    char v1, v2;//定义两个顶点x
    int i, j, k, weight;//i和j分别为两个顶点在图中的位置下标 weight为权值 无向图中两顶点之间连通时为1


    G=(MGraphList)malloc(sizeof(MGraph));//为图的起点指针分配空间!!!!!!!!!


    G->vexnum=NUM;//对图中的顶点数进行初始化
    G->arcnum=G->vexnum*G->vexnum;//对弧数进行初始化 对无向图来说一个顶点对应两条弧


    if((fp=fopen("UDN.txt", "r"))==NULL)//打开文件
        printf("error");


    for(i=1; i<=G->vexnum; i++)//将verx[0]空出来
            fscanf(fp, "%c", &G->verx[i]);//为图中的顶点进行赋值 共有G->vexnum个


    for(i=1; i<=G->vexnum; i++)
        for(j=1; j<=G->vexnum; j++)//将G的第0行和之后每一行的第0个元素都空出来
        G->arcs[i][j]={INFINITY};//利用二维for循环 对二维邻接矩阵数组进行初始化
                                //与G->arcs[i][j].adj=10000作用相同 因为该结构体只包含一个元素
    for(k=1; k<=G->arcnum; k++)//注意是G->arcnum 即图的弧的数量 因为顶点之间的关系多于顶点的个数
    {   //注意是从1开始的 并且是一个新的计数变量k 而不可以使用i和j  因为与后面的位置量重复
        fscanf(fp, "%c%c%d", &v1, &v2, &weight);//从文件中读取一条弧的两个顶点和该弧的权值
        i=LocateVex(G, v1);//对弧一个顶点在图中的位置进行定位
        j=LocateVex(G, v2);//对弧的另一个顶点在图中的位置进行定位
                            //将两个顶点在顶点数组中的位置综合起来就是该弧关系在邻接矩阵中的位置
        G->arcs[i][j].adj=weight;//将该弧关系的权值赋给邻接矩阵中相应的位置  无向图中为1
        G->arcs[j][i]=G->arcs[i][j];//因为是无向图 所以权值的分布是对称的
                                    //利用对称性 可以再一个for循环中就进行整个二维邻接矩阵数组的赋值
                                    //为负值的元素的值为 上一个for循环中初始化的INFINITY
    }//将全部的0位置空出来是为了在LocateVex未找到该值在图中的位置因此返回0的时候
    //下一步对G->arcs的操作 对所输出的邻接矩阵不起作用
}




void OutPutMGraph(MGraphList G)//对邻接矩阵进行输出
{
    int i, j;
    for(i=1; i<=G->vexnum; i++)//现将图中所有的顶点的值进行输出 创造一个表的表头
        printf("%3c", G->verx[i]);
    printf("\n");
    for(i=1; i<=G->vexnum; i++)
    {
        printf("%c", G->verx[i]);//在输出每一行的邻接矩阵之前 先对该行所代表的那个顶点进行输出
        for(j=1; j<=G->vexnum; j++)
        {
            if(G->arcs[i][j].adj==INFINITY)//如果该位置所对应的两个顶点之间未连通则输出一个无穷符号
                printf(" ∞");
            else
                printf("%3d", G->arcs[i][j]);//表示该位置对应的两个顶点之间有对应关系
        }
        printf("\n");
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值