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

无向图邻接表的C语言实现

无向图邻接表是一种常用的图的表示方法,它通过使用数组和链表的结合来表示图中的顶点和边。下面是无向图邻接表的C语言实现示例:

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

// 邻接表中的节点
typedef struct Node {
    int vertex;             // 顶点编号
    struct Node* next;      // 指向下一个节点的指针
} Node;

// 图的邻接表
typedef struct Graph {
    int numVertices;        // 图中顶点的数量
    Node** adjLists;        // 存储邻接表的数组
} Graph;

// 创建一个新的节点
Node* createNode(int v) {
    Node* newNode = malloc(sizeof(Node));
    newNode->vertex = v;
    newNode->next = NULL;
    return newNode;
}

// 创建一个图
Graph* createGraph(int vertices) {
    Graph* graph = malloc(sizeof(Graph));
    graph->numVertices = vertices;

    // 创建存储邻接表的数组
    graph->adjLists = malloc(vertices * sizeof(Node*));

    // 初始化数组为空
    for (int i = 0; i < vertices; i++) {
        graph->adjLists[i] = NULL;
    }

    return graph;
}

// 添加边
void addEdge(Graph* graph, int src, int dest) {
    // 添加从源顶点到目标顶点的边
    Node* newNode = createNode(dest);
    newNode->next = graph->adjLists[src];
    graph->adjLists[src] = newNode;

    // 添加从目标顶点到源顶点的边(因为是无向图)
    newNode = createNode(src);
    newNode->next = graph->adjLists[dest];
    graph->adjLists[dest] = newNode;
}

// 打印邻接表表示的图
void printGraph(Graph* graph) {
    for (int i = 0; i < graph->numVertices; i++) {
        Node* temp = graph->adjLists[i];
        printf("顶点 %d 的邻接表:", i);
        while (temp) {
            printf(" -> %d", temp->vertex);
            temp = temp->next;
        }
        printf("\n");
    }
}

int main() {
    int vertices = 5;
    Graph* graph = createGraph(vertices);

    addEdge(graph, 0, 1);
    addEdge(graph, 0, 4);
    addEdge(graph, 1, 2);
    addEdge(graph, 1, 3);
    addEdge(graph, 1, 4);
    addEdge(graph, 2, 3);
    addEdge(graph, 3, 4);

    printGraph(graph);

    return 0;
}

这段代码实现了无向图邻接表的创建、添加边和打印邻接表的功能。通过创建一个包含顶点数量和邻接表数组的结构体,可以方便地表示和操作无向图的邻接表。

对于无向图邻接表的C语言实现,我们推荐使用腾讯云的云服务器(CVM)来运行和部署这段代码。腾讯云的云服务器提供了高性能、稳定可靠的计算资源,适合用于运行各种应用程序和服务。您可以通过以下链接了解更多关于腾讯云云服务器的信息:

腾讯云云服务器(CVM)产品介绍:https://cloud.tencent.com/product/cvm

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

相关·内容

  • 无向图----无向图的实现

    (有权无向图则为边的权重和) 连通图:从任一顶点能够达到另一个任意顶点。...无向图的API: public class Graph Graph(int V)        创建一个含有V个顶点但不含有边的图 int V()        顶点数 int E()       ...对于含有上百万个顶点的图,V^2的空间需求是不能满足的。 邻接表数组:可以实现。使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表。...(V) 邻接集 E+V logV logV logV+degree(V) 使用邻接表实现Graph性能有如下特点: 使用的空间和V+E成正比 添加一条边所需要的时间为常数 遍历顶点v所需要的时间和v的度数成正比...邻接表的Java语言实现: public class Graph { private int V;//顶点数 private int E;//边数 private Bag[]

    2K00

    【图论-存图】邻接矩阵 邻接表 链式前向星

    这篇文章主要来讲一下邻接矩阵 邻接表 链式前向星(本篇需要具备一定图的基础知识,至少邻接矩阵之前要会,这里主要讲解邻接表和链式前向星) 我不大喜欢说废话,所以直接上图 邻接矩阵:用二维数组存储点与点之间的关系...而动态数组,在C语言里面我们用链表,如果是C++的话,用vector。...没错,所以在一定程度上,我认为邻接表其实就是邻接矩阵把那些没必要的点给扣掉。...,我个人觉得,可以简单理解为邻接表的降为 细看操作 首先来看边的结构 假如,我们有一个无向图 假如说,我们输入一条边: 1 2 5 那这个时候,我们把e[0]的to设置为2,w设置为5。...当然如果你要弄成无向图的话,再反过来添加就可以了 如果是无向图的话,插入第一个点是这样的 然后,我们把1 4 3插入(这个图因为是无向图,所以这个地方,e的下标是2) 所以说这个插入顺序和链接顺序有点像栈

    58153

    图的存储方式之前向星与邻接表

    常用的邻接矩阵和邻接表都挺简单的,就不提了。 这个是ACM版本的前向星,本质就是用数组替换了链表,效果就是更方便一些。 虽然不如十字链表删除方便,但是也能比较方便地写出边删除的操作。...if(info.size()<i+1) info.resize(i+1); } void add(int i,int j){//添加一条从i到j的边,有向...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。

    38510

    图的遍历(下)——邻接表

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

    91410

    数据结构 图的邻接表

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

    1.1K20

    C++ 不知图系列之基于链接表的无向图最短路径搜索

    图的常用存储方式有 2 种: 邻接炬阵。 链接表。 邻接炬阵的优点和缺点都很明显。优点是简单、易理解,对于大部分图结构而言,都是稀疏的,使用矩阵存储空间浪费就较大。...链接表相比较邻接矩阵存储方案,使用起来更方便,对于空间的使用是刚好够用原则,不会产生太多空间浪费。理解起来,也较简单。 本文将以链接表方式存储图结构,在此基础上实现无向图最短路径搜索。 1....链接表 链接表的存储思路: 使用链接表实现图的存储时,有主表和子表概念。 主表: 用来存储图对象中的所有顶点数据。 子表: 每一个顶点自身会维护一个子表,用来存储与其相邻的所有顶点数据。...权重可以是时间、速度、量程数…… 2.1 无权无向图最短路径算法 查找无向图中任意两个顶点间的最短路径长度,可以直接使用广度搜索算法。如下图求解 A0 ~ F5 的最短路径。...总结 本文讲解了如何使用链表存储图数据结构,以及使用广度搜索算法实现无向无权重图中顶点之间的路径搜索。

    1.3K20

    有向图的环和有向无环图

    本篇主要分享关于有向图的环和有向无环图(DAG,估计做大数据的同学到处都可以看到),所以相关概念我就不做详细介绍了。 ?...用有向图中各个节点代表着一个又一个的任务,而其中的方向代表的任务的执行顺序。而方向代表着这个在执行这个任务之前必须完成其他节点,例如上图中在5执行必须执行3和0 节点。...所以可以想到有向图中有向环的检测非常重要,例如上面 要是5之前 3要执行,3之前4要执行,4之前5要执行,那么着三个限制条件永远事不可能被执行的,要是一个优先级限制的问题中存在有向环,那么这个问题肯定是无解的...有向环的检测的理念是我们找到了一条边v-》w 要是w已经存在在栈中,就找到了一个环,因为栈中表示的是一条有w-》v的路径,而v-》w正好补全了这个环。也就是存在有向环。所以这个优先任务是有问题的。...简单梳理跨数据中心数据库 云观察系列:漫谈运营商公有云发展史 云观察系列:百度云的一波三折 云观察系列:阿里云战略观察 超融合方案分析系列(7)思科超融合方案分析

    1.6K50

    OJ刷题记录:无向图的邻接矩阵表示法验证程序 题目编号:515

    无向图的邻接矩阵表示法验证程序 题目编号:515 题目描述: 采用邻接矩阵表示无向图,完成图的创建、图的深度优先遍历、图的广度优先遍历操作。其中图的顶点信息是字符型,图中顶点序号按字符顺序排列。...本输入样例中所用的图如下所示: 输入描述 第一行输入两个值,第一个是图中顶点的个数,第二个是图中边的条数 第二行输入各顶点的信息,即输入每个顶点字符 第三行开始输入每条边,每条边的形式为两个顶点的序号...,中间以空格隔开,输入完一条边换行 输出描述 首先输出图的顶点信息,输出完毕换行 接着输出图的邻接矩阵,假如图中有n个顶点,则输出形式为n行n列的邻接矩阵,输出完毕换行 接下来一行输出从图的第一个顶点开始进行深度优先遍历的序列...,中间以空格隔开,输出完毕换行 最后一行输出从图的第一个顶点开始进行广度优先遍历的序列,中间以空格隔开,输出完毕换行 输入样例 5 7 A B C D E 0 1 0 2 0 3 1 2...B C D E 解题思路: 坑点:输入的图可能含有多个连通分量。

    81931

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

    图的邻接表储存方式相对于邻接矩阵比较节约空间,对于邻接矩阵需要分别把顶点和边(顶点之间的关系)用一维数组和二维数组储存起来。...邻接表 有向图 无向图 逆邻接表 有向图 邻接表实现步骤 结构体 创建图 顶点和边数,顶点需要用一维数组保存 获取顶点的下标,因为链接结点中的index域是顶点的下标值。...= tb;//把新建的结点链接在顶点后面 /*如果为无向图,则加入以下代码 e=(EdgeNode*)malloc(sizeof(EdgeNode));...vertices[i].data == data){ return i; } } printf("没有这个字符"); return -1; } 所得有向图和无向图的结构图不一样...邻接矩阵 一维数组(顶点) 二维数组(邻接关系) 1:易于判定顶点是否邻接,查顶点的邻接点 2:插入、删除顶点复杂 邻接表 头结点(顶点) 表结点(邻接关系) 1:易于:查询某顶点的邻接点,边或弧的插入

    3.8K30

    B 酱的无向图 题解

    B 酱的无向图 题解 [mdx_warning]本题目有版权,禁止复制[/mdx_warning] 题目描述 B 酱有n个节点的无向图,初始时图中没有边。...他依次向图中加入了m条无向边,并询问你加入每条边后图中桥的个数是多少。被删除后能使图中连通块个数增加的边就称为桥。注意图中可能会出现重边及负环。...输入格式 输入第一行为三个正整数n,m, p, p 的含义将在输出格式中介绍。 接下来 m 行,每行两个正整数 u, v,表示新加入的一条边。...1\leq n,m\leq 5 \times 10^5 思路 对于每一条边,如果加入后无环,那么将其塞入树中,并标出每个点的深度与父亲。...如果是一条非树边,那么就暴力求出他们的LCA(直接选择深度大的往上跳),并且把路径上所有点用并查集缩起来,每个时刻上树上还没有被缩起来的边就是桥。

    86010

    数据结构:图的存储结构之邻接表

    对于图来说,邻接矩阵是不错的一种图存储结构,但是我们也发现,对于边数相对顶点较少的图,这种结构是存在对存储空间的极大浪费的。...2、图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图称为顶点vi作为弧尾的出边表。 例如图7-4-6就是一个无向图的邻接表结构。...若是有向图,邻接表的结构是类似的,如图7-4-7,以顶点作为弧尾来存储边表容易得到每个顶点的出度,而以顶点为弧头的表容易得到顶点的入度,即逆邻接表。 ?...下面示例无向图的邻接表创建:(改编自《大话数据结构》) #include using namespace std; #define MAXVEX 100 /* 最大顶点数,应由用户定义...,对于无向图来说,一条边对应都是两个顶点,所以在循环中,一次就针对i和j分别进行了插入。

    3.5K81
    领券