算法学习 - 图的创建和打印

图表示

之前的博客里已经说过了图的两种表示方法,一个是邻接链表,一个是邻接矩阵的方法。

前面适合稀疏图,后面自然就适合稠密图。

图创建

邻接矩阵

邻接矩阵其实就是二维矩阵,在前面的图表示已经简单的说过了,直接建立一个int G[NumVertex][NumVertex]然后直接输入就好了。

下面着重讲一下邻接链表的方法。

邻接链表

表示方法已经说过了,传送门:图表示

下面看下代码:

struct Node{
    int val;
    int length;
    Node* next;
    Node(): val(0), length(0), next(NULL) {}
};

typedef Node* Graph;

Graph CreateG (Graph G){
    int num;
    scanf("%d", &num); // input the number of the vertex
    G = (Graph)malloc(sizeof(struct Node) * (num+1)); //malloc memory for graph
    G[0].length = num; //save the graph vertex number
    degree = (int *)malloc((num+1) * sizeof(int));
    memset(degree, 0, num*sizeof(int));
    for (int i = 1; i <= num; i++) {
        G[i].val = i;
        G[i].next = NULL;
        int outdegree = 0;
        scanf("%d", &outdegree);
        for (int j = 0; j < outdegree; j++) {
            Node* temp = (Node*)malloc(sizeof(struct Node));
            scanf("%d %d",&(temp->val), &(temp->length));
            temp->next = G[i].next;
            G[i].next = temp;
            degree[temp->val] += 1;
        }
    }
    return G;
}

这就是创建的代码了。

图打印

邻接链表

打印这里只说邻接链表的方法了,因为矩阵也是很简单。就是两层for循环就解决了。

下面看邻接链表的代码:

void PrintG (Graph G){
//    int length = sizeof(G)/sizeof(struct Node);
    int length = G[0].length;
    Node * temp;
    for (int i = 1; i <= length; i++) {
        temp = &G[i];
        printf("Node: %d ",temp->val);
        while (temp->next) {
            printf("-> %d(%d)",temp->next->val, temp->next->length);
            temp = temp->next;
        }
        printf("\n");
    }
}

代码就是上面的了,我这个打印没有在G[0].length已经保存了整个链表的顶点数。

时间: 2024-10-08 09:03:08

算法学习 - 图的创建和打印的相关文章

算法学习 - 图的拓扑排序

拓扑排序 拓扑排序是对有向无圈图的顶点的一种排序,使得如果存在一条从Vi到Vj的路径,那么排序中Vj一定出现在Vi后面. 所以假如图里面有圈就不可能完成排序的. 第一种方法 一种简单的办法就是在排序算法中,先找到任意一个没有入边的顶点,然后显示该顶点,并把它和它的边一起从图里删掉.依次类推到最后. 入度(indegree): 顶点v的入度为,所有指向顶点v的变数(u, v). 出度(outdegree): 顶点v的出度为,顶点v所发出的边数(v, u). 下面写下这种方法的伪代码,因为这个的时间

算法学习 - 图表示

图 之前学了链表,队列,堆栈等~ 然后学树,二叉树~ 现在学图,实际上就是结构看起来复杂了一点,点与点之间关系更多了. 图表示 图有两种表示方法: 邻接表 邻接链表 这两种表示方法都可以表示所有图,他们之间的区别是所用的空间不一样.邻接表就是用二维数组来表示一个图.所需空间为O(N^2).(M为边数量, N为点数量).而邻接链表的表示方法更适合稀疏图(就是边比较少的图).它的空间复杂度为O(N+M)有向图. 邻接表 其实就是二维数组啊,int Graph[N][N].然后假设节点为a b c d

算法学习 - 图的广度优先遍历(BFS) (C++)

广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不懂的人.请先学下图的存储方法.在我的之前博客里. 传送门:图表示方法 然后我们如果有一个图例如以下: 节点1->3->NULL 节点2->NULL 节点3->2->4->NULL 节点4->1->2->NULL 这样我们已经知道这是一个什么图了. 如果我们

算法学习 - 图的深度优先遍历(DFS) (C++)

深度优先遍历 在图的遍历中,其中深度优先遍历和广度优先遍历是最常见,也最简单的两种遍历方法. 深度优先遍历的思想就是一直向下找,找到尽头之后再去其他分支查找. 在上一篇博客中我已经写了广度优先遍历(BFS). 想看的传送门:图的广度优先遍历 代码实现 这里实现和BFS的差别在于,在BFS中,我们使用的容器是队列(queue),是先进先出的, 而在DFS中我们需要使用的是栈(stack)一个先进后出的容器. 其他基本原理相同. // // main.cpp // DFS // // Created

数据挖掘算法学习(一)K-Means算法

博主最近实习开始接触数据挖掘,将学习笔记分享给大家.目前用的软件是weka,下篇文章会着重讲解. 算法简介: K-Means算法是输入聚类个数k,以及包含n个数据对象的数据库,输出满足方差最小标准的k个聚类.并使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类对象相似度较小. 算法假设: 均方误差是计算群组分散度的最佳参数. 算法输入: 聚类个数k:包含n个数据对象的数据集. 算法输出: k个聚类 算法思想: (a)绿点表示数据集在二级的欧几里德空间,初始化的中心点u1和u2用红的和蓝

广义表的创建与打印

广义表的创建与打印            本文取自<数据结构与算法>(C语言版)(第三版),出版社是清华大学出版社. 本博文作为学习资料整理. 源码是VC++ 6.0上可运行程序,我挪到了VS2010中运行. 在VS2010中新建C++ Win32 控制台应用程序项目,创建结果截图:            1.广义表的创建: 广义表的存储结构示意图:演示样例:C(x, y, (a, b)) 广义表能够通过以下的递归方式进行定义. 基本项:(1)广义表为空表,当s为空时:(2)广义表为原子结点.

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

dijkstra算法学习

dijkstra算法学习 一.最短路径 单源最短路径:计算源点到其他各顶点的最短路径的长度 全局最短路径:图中任意两点的最短路径 Dijkstra.Bellman-Ford.SPFA求单源最短路径 Floyed可以求全局最短路径,但是效率比较低 SPFA算法是Bellman-Ford算法的队列优化 Dijkstra算法不能求带负权边的最短路径,而SPFA算法.Bellman-Ford算法.Floyd-Warshall可以求带负权边的最短路径. Bellman-Ford算法的核心代码只有4行,Fl

数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树

[本文谢绝转载,原文来自http://990487026.blog.51cto.com] 树 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树 二叉树的创建,关系建立 二叉树的创建,关系建立2 三叉链表法 双亲链表: 二叉树的遍历 遍历的分析PPT 计算二叉树中叶子节点的数目:使用全局变量计数器 计算二叉树中叶子节点的数目:不使用全局变量计数器 无论是先序遍历,中序遍历,后序遍历,求叶子的数字都不变;因为本质都是一样的,任何一个节点都会遍历3趟 求二叉树的高度 二叉树的拷