第十二周--图基本算法库

【项目1 - 图基本算法库】 定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。  要求:  1、头文件graph.h中定义相关的数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括: void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵 void ArrayToList(int *Arr, int n, ALGraph *&G); 阅读详情
/*
 *Copyright (c) 2015 烟台大学计算机与控制工程学院
 *All right reserved.
 *标题:数据结构实践——图基本算法库
 *作者:杨珺
 *date:2015年11月16日
 *版本:V1.0.1
 *操作系统:XP
 *运行环境:VC6.0
 *问题描述:图的存储结构主要包括邻接矩阵和邻接表,本算法库提供存储结构的定义,以及用于构造图存储结构、不同结构的转换及显示的代码。
*/


头文件graph.h:

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED

#define MAXV 100                //最大顶点个数
#define INF 32767       //INF表示∞
typedef int InfoType;

//以下定义邻接矩阵类型
typedef struct
{
    int no;
    InfoType info;
} VertexType;

typedef struct
{
    int edges[MAXV][MAXV];
    int n,e;
    VertexType vexs[MAXV];
} MGraph;

//以下定义邻接表类型
typedef struct ANode
{
    int adjvex;
    struct ANode *nextarc;
    InfoType info;
} ArcNode;

typedef int Vertex;

typedef struct Vnode            //邻接表头结点的类型
{
    Vertex data;                //顶点信息
    int count;                  //存放顶点入度,只在拓扑排序中用
    ArcNode *firstarc;          //指向第一条弧
} VNode;

typedef VNode AdjList[MAXV];    //AdjList是邻接表类型

typedef struct
{
    AdjList adjlist;
    int n,e;
} ALGraph;

void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
void DispAdj(ALGraph *G);//输出邻接表G



#endif // GRAPH_H_INCLUDED


源文件graph.cpp:

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g)
{
    int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
    g.n=n;
    for (i=0; i<g.n; i++)
        for (j=0; j<g.n; j++)
        {
            g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用
            if(g.edges[i][j]!=0)
                count++;
        }
    g.e=count;
}

void ArrayToList(int *Arr, int n, ALGraph *&G)
{
    int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    G->n=n;
    for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值
        G->adjlist[i].firstarc=NULL;
    for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素
        for (j=n-1; j>=0; j--)
            if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                p->adjvex=j;
                p->info=Arr[i*n+j];
                p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
                G->adjlist[i].firstarc=p;
            }

    G->e=count;
}

void MatToList(MGraph g, ALGraph *&G)
//将邻接矩阵g转换成邻接表G
{
    int i,j;
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值
        G->adjlist[i].firstarc=NULL;
    for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素
        for (j=g.n-1; j>=0; j--)
            if (g.edges[i][j]!=0)       //存在一条边
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                p->adjvex=j;
                p->info=g.edges[i][j];
                p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
                G->adjlist[i].firstarc=p;
            }
    G->n=g.n;
    G->e=g.e;
}

void ListToMat(ALGraph *G,MGraph &g)
//将邻接表G转换成邻接矩阵g
{
    int i,j;
    ArcNode *p;
    for (i=0; i<g.n; i++)   //先初始化邻接矩阵
        for (j=0; j<g.n; j++)
            g.edges[i][j]=0;
    for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值
    {
        p=G->adjlist[i].firstarc;
        while (p!=NULL)
        {
            g.edges[i][p->adjvex]=p->info;
            p=p->nextarc;
        }
    }
    g.n=G->n;
    g.e=G->e;
}

void DispMat(MGraph g)
//输出邻接矩阵g
{
    int i,j;
    for (i=0; i<g.n; i++)
    {
        for (j=0; j<g.n; j++)
            if (g.edges[i][j]==INF)
                printf("%3s","∞");
            else
                printf("%3d",g.edges[i][j]);
        printf("\n");
    }
}

void DispAdj(ALGraph *G)
//输出邻接表G
{
    int i;
    ArcNode *p;
    for (i=0; i<G->n; i++)
    {
        p=G->adjlist[i].firstarc;
        printf("%3d: ",i);
        while (p!=NULL)
        {
            printf("-->%d/%d ",p->adjvex,p->info);
            p=p->nextarc;
        }
        printf("\n");
    }
}


main.cpp:

#include <stdio.h>
#include <malloc.h>
#include "graph.h"

int main()
{
    MGraph g1,g2;
    ALGraph *G1,*G2;
    int A[6][6]=
    {
        {0,5,0,7,0,0},
        {0,0,4,0,0,0},
        {8,0,0,0,0,9},
        {0,0,5,0,0,6},
        {0,0,0,5,0,0},
        {3,0,0,0,1,0}
    };

    ArrayToMat(A[0], 6, g1);  //取二维数组的起始地址作实参,用A[0],因其实质为一维数组地址,与形参匹配
    printf(" 有向图g1的邻接矩阵:\n");
    DispMat(g1);

    ArrayToList(A[0], 6, G1);
    printf(" 有向图G1的邻接表:\n");
    DispAdj(G1);

    MatToList(g1,G2);
    printf(" 图g1的邻接矩阵转换成邻接表G2:\n");
    DispAdj(G2);

    ListToMat(G1,g2);
    printf(" 图G1的邻接表转换成邻接邻阵g2:\n");
    DispMat(g2);
    printf("\n");
    return 0;
}


运行结果:

 

总结:

        用邻接矩阵和邻接表存储方法,要多画图。这个算法库里的基本运算,能看懂了却自己打不出来。

Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019) 本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。 阅读详情

相关推荐

AI Agent ReAct架构设计模型剖析

ReAct通过"思考-行动-观察"循环运作:智能体先进行自然语言推理,再调用外部工具执行行动,观察结果后继续推理直至解决问题。这种架构提高了透明度和准确性,减少幻觉风险,使LLM能主动分解任务并利用外部数据源。实现关键在于精心设计的提示模板,引导LLM按结构化格式响应,而非依赖模型固有能力。

weixin_43939320的博客 1250

图基本算法库

#ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED #define MAXV 100                //最大顶点个数 #define INF 32767       //INF表示∞ typedef int InfoType; //以下定义邻接矩阵类型 typedef struct {     int

szk1234567890的博客 488

国产化办公新选择:在银河麒麟V10上部署ToDesk远程桌面

本文详细介绍了在国产操作系统银河麒麟V10上部署ToDesk远程桌面的完整指南。作为国产远程控制工具,ToDesk在连接速度、系统适配性和用户体验方面表现优异,特别适合国产化办公场景。文章包含X86和ARM架构的安装步骤、常见问题排查及性能优化技巧,帮助用户高效实现远程办公。

weixin_33742618的博客 234

第十二周项目(1):图基本算法库

问题及代码: graph.h /* *烟台大学计算机与控制工程学院 *作 者:杨宁 *完成日期:2015年11月16日 *问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 */ #ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED #define MAXV 100

yn2333的博客 426

[特殊字符] PetaLinux Qt 程序(WindRadar)无法自动启动问题解决文档

摘要:本文档解决了PetaLinux 2020.1系统中Qt程序(WindRadar)无法开机自动显示界面的问题。通过分析发现,自动启动时缺少DISPLAY=:0.0环境变量导致Qt找不到显示设备。最终在autostart.sh脚本中添加该变量,并完善了字体加载、驱动加载、显示设备检测等流程,确保程序正常自启显示界面。完整脚本包含路径检测、环境配置和错误处理,经验证各项功能均正常运行。

梁俊星的博客 327

MFC属性网格控件(CMFCPropertyGridCtrl)完全指南:构建专业属性编辑界面

本文详细介绍了MFC中的CMFCPropertyGridCtrl控件的使用方法。主要内容包括:控件基础用法(初始化、添加属性、事件处理)、高级设置(自定义外观、创建属性类型、动态更新)、派生类实现(自定义绘制、搜索过滤功能)、界面集成技巧(对话框布局、属性编辑器)以及实际应用示例。文章重点讲解了如何通过继承和自定义实现复杂功能,并提供了性能优化、多语言支持等最佳实践方案。该控件适用于需要大量参数配置的应用程序,能够创建类似Visual Studio属性窗口的专业界面。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 155

第十二周 项目1 图基本算法库

问题及代码: main.cpp: /* * 烟台大学计算机与控制工程学院 *文件名称:mian.cpp *作 者:刘磊 *完成日期:2015.11.23 *版 本 号:v1.0 * *问题描述:图的基本算法库 * *输入描述:无 *程序输出:无 */ #include #include #include "gra

DDraven的博客 312

MathType公式使用技巧汇总——Mathtype怎么在word中编辑公式?论文中公式有哪技巧?有哪些注意事项?论文中的公式怎么写?

如果word中到公式编号(2-1)中间的符号如下图........ .......类似与省略号的,这是手动打的空格,公式和编号的位置都是手动敲空格操作的,这种就只是使用MathType写了公式而已,格式上还是很不方便的。**如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。如果要修改公示,直接双击文档中的公式,就会自动弹出MathType公式编辑窗口,进行修改。而第二种,是公式里面带的括号符号,他是可以随着公式结构自适应变化的。这时需要将公式插入到一行文字的某处,

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 5万+

第十二周项目1图的基本算法库

问题及代码: #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED /* *烟台大学计控学院 *作 者:孙启先 *完成日期:2016年11月17日 *问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 要求: 1、头文件graph.h中定义相关的数据结构并声明用于完成基本运算的函数。

Sqixian97的博客 317

仿真学习系列(四十九):Sigrity仿真之电容库制作

在高速电路设计中,电源完整性(PI)是确保系统稳定、可靠运行的关键因素。随着电子产品对性能的要求不断提升,PDN(电源分配网络)的设计与优化变得尤为重要。为了确保电源网络在高速工作状态下不会引发电压波动和信号干扰,我们需要在设计中精确地选择电容器进行优化,而电容库的制作则是这一过程的核心。 OptimizePI作为一个强大的电源完整性优化工具,能够帮助设计师根据不同的目标,批量进行PDN仿真,以得出最佳电容选择。

案例文章,高速信号 227

某城商银行生产容器云平台详细设计方案分享及经验总结

AS3模式的CIS容器部署在K8S集群内,作为F5的控制器,CIS容器通过对K8S集群内Configmap资源进行监控,将Configmap资源中的内容转化为F5的配置,将配置推送给 F5 ,CIS容器还通过K8S标准的API接口完成业务发现和实时监听集群内Pod的变化,一旦Pod发生变化,相应的更新会及时推送给F5,并完成更新。容器技术发展非常迅速,现在应用大多以容器作为承载介质,前两年在容器云上承载的应用类型主要是Web类,随着容器云领域的不断发展,越来越多的应用类型将迁移至容器云,包括有状态应用。

qq_61890005的博客 857

第十二周项目1-图基本算法库

/*   Copyright (c)2016,烟台大学计算机与控制工程学院   All rights reserved.   文件名称:第十二周项目1 - 图基本算法库.cpp   作    者:杨陈晓琳   完成日期:2016年11月17日   版 本 号:v1.0      问题描述:  定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。    要求:    1

cc1562cxl的博客 300

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

第十二周 图基本算法库

/* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称: main.cpp,top.h,1.cpp * 作者:于东林 * 完成日期:2015年12月30日 * 版本号:codeblocks * * 问题描述:  图的存储结构主要包括邻接矩阵和邻接表,本算法库提供存储结构的定义,以及用于构造图存储结构

ydl197791的博客 383

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

第十二周项目1——图基本算法库

问题: /* * Copyright (c)2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目1.cpp * 作 者:陈晨 * 完成日期:2016年11月16日 * 版 本 号:v1.0 *问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 *输入描述:

chenchen0808的博客 783

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第十二周 【项目一 图基本算法库】

/*问题及代码 *Copyright(c)2016,烟台大学计算机学院 *All right reserved. *文件名称:图算法库 .cpp *作者:李潇 *完成日期;2016年11月13日 *版本号;v1.0 *问题描述: 定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 要求: 头文件

sdlixiao6的博客 590

第十二周 项目1-图基本算法库

/* *Copyright (c)2016,烟台大学计算机学院 *All rights reserved. *文件名称:传写.cpp *作者:李欣 *完成日期:2016年11月17日 *版本号:v1.0 * *问题描述:图基本算法库 */ graph.cpp #include #include #include "graph.h" int main() {

zcqdlixin的博客 199

第十二周项目1—图基本算法库

/* * Copyright (c)2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目1.cpp * 作 者:天意 * 完成日期:2016年11月24日 * 版 本 号:v1.0 * 问题描述: 定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 要求: 1、头文件graph.h

tianyi__0626的博客 242

第十二周项目一 图基本算法库

问题及代码: /* *烟台大学计算机与控制工程学院 *作 者:孙丽玮 *完成日期:2016年11月15日 *问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。 要求: 1、头文件graph.h中定义相关的数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:

AFencounter的博客 391

第十二周项目1 图基本算法库

/* 02.*Copyright (c) 2015,烟台大学计算机学院 03.*All rights reserved. 04.*文件名称:tu.cpp 05.*作者:朱希康 06.*完成日期:2015年11月26日 07.*版本号:vc++6.0 08.* 09.*问题

zxk201458506144的博客 456

第十二周 图基本算法库

/*  Copyright (c)2016,烟台大学计算机与控制工程学院  All rights reserved.  文件名称:图基本算法库.cpp  作    者:郝环宇 完成日期:2016.11.17 版 本 号:v1.0    问题描述:  定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。   要求:   1、头文件graph.h中定义相关的数据结构并声明

Long_Mao000的博客 659

第十二周——【项目1 - 图基本算法库】

/* * Copyright (c) 2015, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:main.cpp,btree.h,btree.cpp * 作者:于奎民 * 完成日期:2015年11月5日 * 版本号:code ::Block 12.11 * 问题描述:定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。

于奎民的博客 430
上一篇: 第十一周--线索化二叉树(中序)
下一篇: 第十二周--操作用邻接表存储的图
杨珺
博客等级 码龄11年 31粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值