邻接表建立图

  • 有向图
  • 无向图
  • 邻接表存图进行拓扑排序

不得不说网上的真的是太乱了,看得我脑壳疼
自己写的可以,感觉好的话可以当成模板。

有向图

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>using namespace std;
#define maxn 200int v, e;
//表结点
typedef struct _Enode
{int ivex; //该边所指向的节点位置int value;//如果边有权值的话,就对其赋值struct _Enode* next_edge; //指向下一条边
}ENode,*PENode;//头结点
typedef struct _VNode
{int data;ENode* fidt_edge;
}VNode;//邻接表
typedef struct _LGraph
{int vex_num; //点的数量int edg_num; //边的数量VNode vexs[maxn]; //一维数组存表头节点
}LGraph;LGraph* create()
{LGraph* pG;pG = (LGraph*)malloc(sizeof(LGraph));memset(pG, 0, sizeof(LGraph));pG->vex_num = v;  //顶点数pG->edg_num = e; //边数for (int i = 0; i < v; ++i) //初始化定点表的指针域为空pG->vexs[i].fidt_edge = NULL;//建立链表for (int i = 0; i < e; ++i) {int v1, v2;scanf_s("%d%d", &v1, &v2);ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间p1->ivex = v2;//该边指向的节点// 头插法建立p1->next_edge = pG->vexs[v1].fidt_edge;pG->vexs[v1].fidt_edge = p1;}return pG;}
int main()
{while (~scanf_s("%d%d", &v, &e)){if (v == 0 && e == 0)break;LGraph* pG;pG = create();}return 0;
}

无向图

在代码的建立链表的地方变成

//建立链表for (int i = 0; i < e; ++i) {int v1, v2;scanf_s("%d%d", &v1, &v2);ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间p1->ivex = v2;//该边指向的节点// 头插法建立p1->next_edge = pG->vexs[v1].fidt_edge;pG->vexs[v1].fidt_edge = p1;//另一条边ENode* p2 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间p2->ivex = v1;//该边指向的节点// 头插法建立p2->next_edge = pG->vexs[v2].fidt_edge;pG->vexs[v2].fidt_edge = p2;}

邻接表存图进行拓扑排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>using namespace std;
#define maxn 200int v, e;
//表结点
typedef struct _Enode
{int ivex; //该边所指向的节点位置struct _Enode* next_edge; //指向下一条边
}ENode,*PENode;//头结点
typedef struct _VNode
{int data;int indegree;//记录定点的入度ENode* fidt_edge;
}VNode;//邻接表
typedef struct _LGraph
{int vex_num; //点的数量int edg_num; //边的数量VNode vexs[maxn]; //一维数组存表头节点
}LGraph;LGraph* create()
{LGraph* pG;pG = (LGraph*)malloc(sizeof(LGraph));memset(pG, 0, sizeof(LGraph));pG->vex_num = v;  //顶点数pG->edg_num = e; //边数for (int i = 0; i < v; ++i) //初始化定点表的指针域为空pG->vexs[i].fidt_edge = NULL;for (int i = 0; i < e; ++i){int v1, v2;scanf_s("%d%d", &v1, &v2);ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间p1->ivex = v2;//该边指向的节点// 头插法建立p1->next_edge = pG->vexs[v1].fidt_edge;pG->vexs[v1].fidt_edge = p1;}return pG;}void TopSort(LGraph* pG)
{stack<int>s;int count, k, i;ENode* p;for (int i = 0; i < v; ++i) //记录各个顶点的入度{//遍历整个邻接表,如果表结点的值为 i,则i对应的头结点的入度加1p = pG->vexs[i].fidt_edge; //获得其指向的第一条边while (p){pG->vexs[p->ivex].indegree++; //该边表存的位置对应的头结点的入度数量加1p = p->next_edge;}}//将入度为0的压入栈中for (int i = 0; i < v; ++i)if (pG->vexs[i].indegree == 0)s.push(i);count = 0;//对输出的顶点计数while (!s.empty()){int k = s.top(); //取出s.pop();++count;//与k节点相邻的节点的入度减1for (p = pG->vexs[k].fidt_edge; p; p = p->next_edge){int to;to = p->ivex;pG->vexs[to].indegree--;//减为0的话就压入栈中if (pG->vexs[to].indegree == 0)s.push(to);}}if (count < pG->vex_num)printf("NO\n");elseprintf("YES\n");
}int main()
{while (~scanf_s("%d%d", &v, &e)){if (v == 0 && e == 0)break;LGraph* pG;pG = create();TopSort(pG);}return 0;
}

邻接表建立图(c语言)相关推荐

  1. 用邻接表存储图c语言,邻接表、邻接多重表、十字链表及C语言实现

    上一节介绍了如何使用顺序存储结构存储邻接多重表和 邻接的意思是顶点之间有边或者弧存在,通过当前顶点,可以直接找到下一个顶点. 邻接表 使用邻接表存储图时,对于图中的每一个顶点和它相关的邻接点,都存储到 ...

  2. mysql 邻接表_图的邻接表存储结构详解

    通常,图更多的是采用链表存储,具体的存储方法有 3 种,分别是邻接表.邻接多重表和十字链表. 本节先讲解图的邻接表存储法.邻接表既适用于存储无向图,也适用于存储有向图. 在具体讲解邻接表存储图的实现方 ...

  3. 邻接表-建立无向图、无向网、有向图、有向网

    #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 #define OK  1 #define ERR ...

  4. 邻接表存储图的广度优先遍历

    试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储 ...

  5. 邻接表存储图利用BFS遍历

    //今天上机写的邻接表存储图利用BFS遍历: #include<stdio.h> #include<stdlib.h> #include<string.h> #in ...

  6. 【图论】关于邻接表建图

    邻接表 作为一名现役Oier在做过无数图论题目和搜索题目之后,可以说是相当熟悉了,但是今天做的一道题,让我对于邻接表表示直接懵逼,原来在跑最短路的时候还是明白每个数组各自的作用的,然而一旦在其它题目中 ...

  7. QDUOJ 生化危机 邻接表存图+BFS

    生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败 ...

  8. 迪杰斯特拉最全详解(朴素版,堆优化+邻接表存图/链式前向星存图)

    迪杰斯特拉 迪杰斯特拉算法分析 迪杰斯特拉(朴素版) 迪杰斯特拉堆优化(邻接表存图) 迪杰斯特拉堆优化(链式前向星存图) 最短路--spfa(链式前向星存图) 迪杰斯特拉算法分析 一般用三种数据结构存 ...

  9. c语言邻接表的构建_c语言数据结构--图的邻接矩阵和邻接表操作的基本操作

    #include #include #include #define MAX 100 typedef char DataType; typedef int VectorRelationType; ty ...

最新文章

  1. 用C#或JavaScript扩展XSLT
  2. fir.im 全名 Fly It Remotely ,是一个为移动开发者服务,FIR一个免费的App托管平台
  3. range 和 xrange
  4. [渝粤教育] 广东-国家-开放大学21秋期末考试中国近现代史纲要(A)10881k1
  5. python web框架基础
  6. php foreach 为什么在if条件下多条数据只取出一条数据_微信大牛教你深入了解数据库索引...
  7. docker mysql 主从配置
  8. mybatis和spring jdbc持久层框架事务支持分析
  9. express 文件服务器,Express搭建一个简单后台服务器
  10. flash动画制作成品_Flash如何制作雪糕被吃掉的动画
  11. 简述旋转编码器的工作原理_绝对值编码器工作原理以及故障处理方法有哪些?...
  12. ActiveX开发流程
  13. 在图形用户登录界面输入正确用户名与密码后,闪了一下(即将要登录进去那一刹那),它NND给我蹦出来了!
  14. 夜晚怎么能不吃宵夜呢
  15. 拼图java 源代码,Java语言实现拼图游戏源代码
  16. Unity声音 Sound (圣典篇)
  17. 解决uni-app微信小程序底部input输入框,键盘弹起时页面整体上移问题
  18. REST and RPC
  19. Win10计算机窗口空白,Win10系统下启用或关闭windows功能打开后显示空白如何解决...
  20. 学计算机核显足够了吗,独立显卡、核心显卡和集成显卡的区别

热门文章

  1. pycharm如何标记代码?创建代码标签?创建数字标签?收藏代码标签
  2. python 优雅的 列表推导式(for in if)生成器表达式 集合推导式和字典推导式 列表动态构建器(不用先创建空容器【空列表】,再一个一个append()进去那样麻烦了)
  3. Java 基础学习(Markdown语法)
  4. dell服务器从硬盘引导,就是折腾 篇三:戴尔H710 mini(D1版本)阵列卡刷直通模式 附硬盘引导和还原IR模式办法...
  5. html select显示树形菜单_HTML标签总结
  6. centos 7 minimal connect: Network is unreachable和ifconfig command not found
  7. vim 分屏 最大化_5分钟学会Vim分屏操作方方面面
  8. 安装百分之80卡住_新车买回来要不要安装发动机护板呢?装好还是不好?
  9. html框模型,4-2css中的框模型简介
  10. 访问域名不走dns服务问题排查,报错could not resolve host