数据结构--基于天勤--有向有权图

/*

图(有向有权图)
2018.12.16 初步完成
2018.12.18 加入文件操作

*/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define INF 1000

int visit[MAXSIZE];//【深度/广度优先遍历使用】全局数组,存放元素访问标记,访问为1,未访问为0
int dist[MAXSIZE];//【单源最短路径使用】从源结点到每个结点的最短路径的长度
int path[MAXSIZE];//【单源最短路径使用】保存path[vi]从v0到vi最短路径上vi的前一个结点
//【边--链表存储】定义 边 ------存储边的数据结构是 链表
typedef struct EdgeNode 
{
    int adjacentVertex;//该边指向的结点位置(下一个节点),相当于指是记录指向的结点的下标 adjacent  vertex 临接结点
    int weight;//定义边的权值
    struct EdgeNode *nextEdge;//指向下一条边的指针
}EdgeNode;

//【顶点--数组存储】定义 顶点 -------存储顶点的数据结构是 数组
typedef struct VertexNode
{
    char data;//顶点信息
    EdgeNode *firstEdge;//指向第一条边的指针
}VertexNode;

//定义 图
typedef struct
{
    VertexNode adjacentList[MAXSIZE];//【邻接链表表头数组】[是一个结构体数组](每个元素都含有 顶点信息 和 指向第一条边的指针)
    int vertexNumber;//顶点数
    int edgeNumber;//边数
    int edgeWeight[MAXSIZE][MAXSIZE];//【有向有权图-邻接矩阵】两顶点的权值(有向有权图),无法直接到达设为INF
}Graph;
//置0一个一维数组
void setZero(int *visit)
{
    for (int i = 0; i < MAXSIZE; i++)
    {
        visit[i] = 0;
    }
    return;
}
//链表建立方式为 头插法
void createGraphF(Graph *g)
{
    //初始化图的 顶点数 边数
    int vertexNumber;
    int edgeNumber;
    printf("请输入要建立的图的 顶点数 边数:");
    scanf("%d %d", &vertexNumber, &edgeNumber);
    g->vertexNumber = vertexNumber;
    g->edgeNumber = edgeNumber;      //图的顶点数和边数初始化完毕

    //初始化图的 权重数组 全部赋值为INF
    for (int i = 0; i < g->vertexNumber; i++)
        for (int j = 0; j < g->vertexNumber; j++)
        {
            g->edgeWeight[i][j] = INF;
        }
    
    //建立了只有顶点的图
    for(int i =0;i<vertexNumber;i++)
    {
        g->adjacentList[i].data = i;
        g->adjacentList[i].firstEdge = NULL;
    }

    EdgeNode *newNode;//用来临时存放边结点
    //插入边--边的开始 结束/边的权值
    for (int i = 0; i < g->edgeNumber; i++)
    {
        //插入边和权值
        int startSubscript;//前驱结点的下标
        int endSubscript;//后继结点的下表
        int weight;//边的权重
        scanf("%d %d %d", &startSubscript, &endSubscript, 
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值