首页
学习
活动
专区
工具
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[]

    1.9K00

    【图论-存邻接矩阵 邻接 链式前

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

    55653

    存储方式之前星与邻接

    常用邻接矩阵和邻接都挺简单,就不提了。 这个是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。

    37610

    遍历(下)——邻接

    概述 在我上一篇博客:遍历(上)——邻接矩阵 中主要介绍了邻接矩阵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; //依次构造

    88110

    数据结构 邻接

    大家好,又见面了,我是你们朋友全栈君。 呃,下面该写邻接了……. 邻接出现是因为若是稀疏,用邻接矩阵会造成空间浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用那种。...下面是一个邻接中数据存储图示如下(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; //因为是

    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.4K50

    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 解题思路: 坑点:输入可能含有多个连通分量。

    80431

    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(直接选择深度大往上跳),并且把路径上所有点用并查集缩起来,每个时刻上树上还没有被缩起来边就是桥。

    85110

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

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

    3.6K30

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

    常见Hash算法有:MAC,CRC,MD5/MD4,SHA等。 ---- 简单哈希实现c语言。 哈希原理 哈希是为了根据数据部分内容(关键字),直接计算出存放完整数据内存地址。...下图是一个哈希运行时内存布局: 先说一下原理。 先是有一个bucket数组,也就是所谓桶。 哈希特点就是数据与其在位置存在相关性,也就是有关系,通过数据应该可以计算出其位置。...,因为C标准库中string.h中有一系列这样函数。...//哈希中插入数据 int insertEntry(table* t , const char* key , const char* value) { int index , vlen1 ,...因为这个哈希中保存是键值对,所以这个方法是从哈希中查找key对应value

    4.9K20
    领券