首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C语言实现具有邻接表的图

邻接表是一种常用的图的表示方法,用于存储图中各个顶点之间的关系。下面是用C语言实现具有邻接表的图的示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

// 定义图的最大顶点数
#define MAX_VERTEX_NUM 100

// 定义邻接表中的边结点
typedef struct ArcNode {
    int adjvex;                 // 该边所指向的顶点的位置
    struct ArcNode* nextarc;    // 指向下一条边的指针
} ArcNode;

// 定义邻接表中的顶点结点
typedef struct VNode {
    int data;                   // 顶点的数据
    ArcNode* firstarc;          // 指向第一条依附该顶点的边的指针
} VNode, AdjList[MAX_VERTEX_NUM];

// 定义图的结构体
typedef struct {
    AdjList vertices;           // 邻接表
    int vexnum;                 // 顶点数
    int arcnum;                 // 边数
} ALGraph;

// 初始化图
void InitGraph(ALGraph* G, int vexnum, int arcnum) {
    G->vexnum = vexnum;
    G->arcnum = arcnum;
    for (int i = 0; i < G->vexnum; i++) {
        G->vertices[i].data = i;    // 顶点数据默认为顶点的位置
        G->vertices[i].firstarc = NULL;
    }
}

// 添加边
void AddEdge(ALGraph* G, int start, int end) {
    ArcNode* arcNode = (ArcNode*)malloc(sizeof(ArcNode));
    arcNode->adjvex = end;
    arcNode->nextarc = G->vertices[start].firstarc;
    G->vertices[start].firstarc = arcNode;
}

// 打印图的邻接表
void PrintGraph(ALGraph* G) {
    for (int i = 0; i < G->vexnum; i++) {
        printf("顶点 %d 的邻接表:", i);
        ArcNode* arcNode = G->vertices[i].firstarc;
        while (arcNode != NULL) {
            printf("%d ", arcNode->adjvex);
            arcNode = arcNode->nextarc;
        }
        printf("\n");
    }
}

int main() {
    int vexnum = 5;     // 顶点数
    int arcnum = 7;     // 边数

    ALGraph G;
    InitGraph(&G, vexnum, arcnum);

    AddEdge(&G, 0, 1);
    AddEdge(&G, 0, 4);
    AddEdge(&G, 1, 2);
    AddEdge(&G, 1, 3);
    AddEdge(&G, 1, 4);
    AddEdge(&G, 2, 3);
    AddEdge(&G, 3, 4);

    PrintGraph(&G);

    return 0;
}

这段代码实现了一个具有邻接表的图,其中包括了初始化图、添加边和打印图的邻接表等功能。通过调用InitGraph函数初始化图,然后使用AddEdge函数添加边,最后调用PrintGraph函数打印图的邻接表。

这个示例中没有涉及到具体的云计算相关内容,因此无法提供腾讯云相关产品和产品介绍链接地址。如果需要了解腾讯云的云计算产品,可以访问腾讯云官方网站进行查阅。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

遍历(下)——邻接

概述 在我上一篇博客:遍历(上)——邻接矩阵 中主要介绍了邻接矩阵BFS和递归DFS与非递归DFS这3种遍历算法。在这篇博客我将主要叙述邻接以上3中遍历算法。...首先来看看邻接表示方法。 邻接主要是针对稀疏图中邻接矩阵造成空间浪费而提出。下面我们来看看邻接表示。 1)无向表示 ? 2)有向 ?...(说明:对于BFS,DFS递归与非递归算法在这篇文章就不再重复,如有不了解请移步我上一篇博客:遍历(上)——邻接矩阵 ) ---- 广度优先遍历(BFS) //广度优先遍历(BFS) void...return this->next; } }; class Graph{ private: vector Edgelist; //邻接...{ cout<<"请输入顶点数与边数:"<<endl; int nv,ne; cin>>nv>>ne; Graph graph(nv,ne); cout<<"邻接

88110
  • 数据结构 邻接

    大家好,又见面了,我是你们朋友全栈君。 呃,下面该写邻接了……. 邻接出现是因为若是稀疏邻接矩阵会造成空间浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小那种。...邻接为了避免内存浪费引入了链式存储,它处理办法是: 1.一个一维数组存储顶点,当然你也可以单链表存储, 2.单链表存储顶点邻接点,可以将顶点改为结构体数组,结构体中存放邻接指针,邻接点也创建一个结构体...下面是一个无向邻接中数据存储图示如下(emmm,无向果然没有有向好画): emmm,终于画完了,我来介绍下这个 顶点也就是个结构体数组,是存放顶点结构,顶点中有data元素...边也是一个结构体,内有adivex元素,存放邻接下标,weight存放顶点与邻接点之间线权重,next是边结构体指针,存放该顶点下一个邻接点,next就是负责将顶点邻接点连起来。...numarc; //当前邻接边数 }GraphAdjList; //建立邻接 void CreateAdjListGraph(GraphAdjList &G) { ArcNode

    1K20

    c语言实现顺序_顺序代码讲解以及实现

    大家好,又见面了,我是你们朋友全栈君。 你们每个赞都能让我开心好几天✿✿ヽ(°▽°)ノ✿ 目录 一、学习内容 二、准备工作 三、顺序结构 四、顺序基本操作 1. 创建顺序 2....因为顺序数据类型不一定是int,有可能是double等其他类型,采用宏定义好处就是:若需要改变顺序数据类型,只需要在宏定义处改变int为其他数据类型即可(理论上确实如此,但由于我代码后面用到了随机数产生顺序元素...实际上就是表明顺序基本操作一个状态。bool逻辑值也可以,或者等等,只要能表示出顺序基本操作状态即可。...) { printf("您插入元素超出了您创建顺序范围!...) { printf("您删除元素超出了您创建顺序范围!

    1.9K20

    数据结构与算法 - 邻接 (思想以及实现方式)

    PS:邻接,存储方法跟树孩子链表示法相类似,是一种顺序分配和链式分配相结合存储结构。如这个表头结点所对应顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向单向链表中。...邻接储存方式相对于邻接矩阵比较节约空间,对于邻接矩阵需要分别把顶点和边(顶点之间关系)一维数组和二维数组储存起来。...邻接 有向 无向邻接 有向 邻接实现步骤 结构体 创建 顶点和边数,顶点需要用一维数组保存 获取顶点下标,因为链接结点中index域是顶点下标值。...邻接矩阵 一维数组(顶点) 二维数组(邻接关系) 1:易于判定顶点是否邻接,查顶点邻接点 2:插入、删除顶点复杂 邻接 头结点(顶点) 结点(邻接关系) 1:易于:查询某顶点邻接点,边或弧插入...4:逆邻接 所谓逆邻接就是方向相反链接到顶点后面,一看图便知。 ? 完: 下一篇讲会讲解深度优先遍历和广度优先遍历基本使用和思想。

    3.6K30

    C语言实现哈希_哈希c语言代码

    常见Hash算法有:MAC,CRC,MD5/MD4,SHA等。 ---- 简单哈希实现c语言。 哈希原理 哈希是为了根据数据部分内容(关键字),直接计算出存放完整数据内存地址。...也就是把具有相同hash值元素放到一起,形成一个链表。这样在插入和寻找数据时候就需要进一步判断。...举个例子:有三个key:key1,key3,key5通过散列算法keyToIndex得到索引值都为2,也就是这三个key产生了碰撞,对于碰撞处理,采取链表连接起来,而没有进行再散列。...,因为C标准库中string.h中有一系列这样函数。...因为这个哈希中保存是键值对,所以这个方法是从哈希中查找key对应value

    4.9K20

    存储方式之前向星与邻接

    常用邻接矩阵和邻接都挺简单,就不提了。 这个是ACM版本前向星,本质就是数组替换了链表,效果就是更方便一些。 虽然不如十字链表删除方便,但是也能比较方便地写出边删除操作。...void clear(){ info.clear(); next.resize(0); to.resize(0); } }; 想了一下还是提一下邻接吧...struct Edge{ int from,to,weight; }; vector G[maxn];//可以用来模拟邻接 //使用时候给对应数组G[node]插入边即可,其实也挺方便...另外一个是刘汝佳蓝书里面的实现,应该也是邻接,只是G[maxn][edgeNum]里面放不再是直接放边对象,而是改为了边索引号n。...在很多时候,对边信息没有过多要求时,直接一两个int数组就可以表示全其信息,也比较方便。唯一问题是不好删除。

    37610

    数据结构:存储结构之邻接

    对于来说,邻接矩阵是不错一种图存储结构,但是我们也发现,对于边数相对顶点较少,这种结构是存在对存储空间极大浪费。...因此我们考虑另外一种存储结构方式:邻接(Adjacency List),即数组与链表相结合存储方法。 邻接处理方法是这样。...1、图中顶点一个一维数组存储,另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接指针,以便于查找该顶点边信息。...2、图中每个顶点vi所有邻接点构成一个线性,由于邻接个数不定,所以单链表存储,无向称为顶点vi,有向称为顶点vi作为弧尾出边。 例如图7-4-6就是一个无向邻接结构。...若是有向邻接结构是类似的,如图7-4-7,以顶点作为弧尾来存储边容易得到每个顶点出度,而以顶点为弧头容易得到顶点入度,即逆邻接。 ?

    3.4K81

    基于邻接AOE网实现关键路径查询

    按照邻接”存储结构表示AOE网,实现求其关键路径算法,并验证如下图1所示AOE网关键路径。...要求1.输入顶点数目.2.按偏序顺序输入各边顶点及权值.3.输入(0,0)结束4.程序会自动计算出关键路径知识点AOE网,即边表示活动网,是一个带权有向无环,其中顶点表示事件(Event),每个事件表示在它之前活动已经完成...算法设计输入e条弧,创建有向存储结构。判断是否为AOE网从源点出发,令ve[0]=0,按拓扑顺序求其余各顶点最早发生时间ve[i]。...在循环中同时遍历邻接中每一个边所存储指向节点,并且更新其ve[i].注:更新时,比较边权加上更新结点前一个结点ve与 该结点本身ve大小(全部初始化为0),取最大值。...iostream>#include #include #include #include using namespace std;/*创建邻接

    20131

    【数据结构与算法】 ( 存储形式 | 基本概念 | 表示方式 | 邻接矩阵 | 邻接 | 创建 | 代码示例 )

    文章目录 一、存储形式 二、基本概念 三、表示方式 1、邻接矩阵 2、邻接 四、创建 ( 代码示例 ) 一、存储形式 ---- 线性元素 , 有 一个 直接前驱 和 一个...结点之间边 有方向 ; 节点之间边有箭头 ; 带权 : 边 是有 权重 , 计算时不仅要计算路径 , 还要考虑路径权重 ; 三、表示方式 ---- 表示方式 : 邻接矩阵 : 二维数组...; 邻接 : 链表 ; 1、邻接矩阵 中有 6 个结点 , 0 ~ 5 ; 使用 6x6 矩阵 表示 , 第 i 行 第 j 列 元素表示 结点 i 和 结点 j 是否连接 ; 默认情况下...邻接矩阵 要 为 n 个顶点 分配 n x n 大小空间 , 存储结点间边是否存在 , 这样会造成一定损失 ; 邻接 中 , 只存储 存在 边 , 不存储 不存在 边 ; 邻接 底层数据结构...( 代码示例 ) ---- 创建下图数据结构 , 使用 邻接矩阵 表示 ; 使用矩阵表示上图 : \begin{bmatrix} 0 & A & B & C & D & E \\ A & 0 &

    2.2K20

    【数据结构与算法】基本结构介绍 | 邻接邻接矩阵编码实战

    作者 :“大数据小禅” 文章简介:本篇文章对基本数据结构 进行了一个概述,并使用领接矩阵与邻接方式来实现一个 个人主页: 大数据小禅 基本结构介绍 应用 分类 应用...– 无权 表示 邻接矩阵 顶点与顶点是相连1来表示,不相连则用0。...adjMartix = new AdjMartix(); adjMartix.showAdj(); adjMartix.adj(3); } } 运行结果: 邻接...邻接它主要就是关心是存在边,不存在边则不管,因此的话不会有空间上浪费,邻接=数组+链表。...链表数组 TreeSet低层使用就是红黑树实现 private static TreeSet[] adj; //从文件中读取相关信息 //存放边信息

    51510

    详解第一篇:基本概念及其存储结构(邻接矩阵和邻接

    每个节点可以与其他节点直接或间接连接,这些连接关系可以具有方向性(有向)或无方向性(无向)。因此,可用于表示各种关系,如网络、社交关系、地图等,并且在计算机科学和现实生活中有广泛应用。...邻接矩阵存储优点是能够快速知道两个顶点是否连通,取到权值 3....2.2 邻接矩阵代码实现 那下面我们就来实现一下邻接矩阵: 结构定义 那我们这里呢还是搞成模板,因为顶点值可以是任意类型,那我们模板都需要给哪些参数呢?...(每个顶点都有一个对应链表,多条链表一个指针数组就可以维护起来) 注意:无向图中同一条边在邻接中出现了两次。...但是不方便确定两个顶点是否相连和获取权值(要遍历其中一个顶点边链表查找O(N)) 2.4 邻接代码实现 那我们再来实现一下邻接

    3.2K10

    6-2 邻接存储广度优先遍历 (20 分)

    本文链接:https://blog.csdn.net/shiliang97/article/details/103128882 6-2 邻接存储广度优先遍历 (20 分) 试实现邻接存储广度优先遍历...函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接存储,定义如下: /* 邻接定义...PtrToGNode LGraph; /* 以邻接方式存储类型 */ 函数BFS应从第S个顶点出发对邻接存储Graph进行广度优先搜索,遍历时裁判定义函数Visit访问每个顶点。...*/ }; typedef PtrToGNode LGraph; /* 以邻接方式存储类型 */ bool Visited[MaxVertexNum]; /* 顶点访问标记 */ LGraph...CreateGraph(); /* 创建并且将Visited初始化为false;裁判实现,细节不 */ void Visit( Vertex V ) { printf(" %d", V)

    2.9K10

    C语言实现线性

    线性是最简单数据结构之一, 一个线性是n个具有相同特性数据元素有限序列。...线性中数据元素之间关系是一对一关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接(注意,这句话只适用大部分线性,而不是全部。...比如,循环链表逻辑层次上也是一种线性(存储层次上属于链式存储),但是把最后一个数据元素尾指针指向了首位结点)。...#define LISTINCREMENT 10 //线性存储空间分配增量(当存储空间不够时要用到,暂时未使用`1) typedef int listElemType; typedef struct...(sqList.c文件): // // Created by tioncico on 19-4-24. // #include "sqList.h" /**  * 初始化线性  * @param

    1K20
    领券