图的存储三部曲——其二:邻接表
来源:互联网 发布:淘宝pu皮少女双肩包 编辑:程序博客网 时间:2024/06/05 03:56
邻接表是一种链式的存储结构。对于图G中的每个顶点Vi吧所有邻接于Vi顶点Vj链成一个单链表,这个单链表称为顶点Vi的邻接表。
邻接表中每个表节点有三个属性:其一,邻接点序号to,用以存放与顶点Vi 相邻接的顶点vj的序号j,其二,边上的权值我,其三,为指针next,用来将邻接表的所有节点链在一起。另外,为每个顶点Vi的邻接表设置一个具有两个属性的表头节点:一个是顶点序号from,另一个是指向其邻接表的指针first,它是指向Vi的邻接表的第一个节点的指针。建立一个Vnode的数组就可以访问每个顶点的邻接表了。
#include <string.h>#include <stdio.h>#include <iostream>using namespace std;const int maxn=100005;struct edgenode{ int to; int w; edgenode *next;};struct vnode{ int from; edgenode *first;};vnode adjilist[maxn];int main(){ int n,m,j,i,w; while(cin >> n>> m) { for(int ii=1;ii<=m;ii++) { cin>> i>> j>>w; edgenode *p=new edgenode(); p->to=j; p->w=w; p->next=adjilist[i].first; adjilist[i].first = p; } for(int i=1;i<=n;i++) { for(edgenode *k=adjilist[i].first;k!=NULL;k=k->next) { cout << i << " "<< k->to<<' ' << k->w<< endl; } } } return 0;}
另外,还可以只用到一个结构体,接着结构体数组定义为结构体指针数组,代码如下:
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;struct edgenode{ int to; int w; edgenode *next;}*N[10005];int main(){ int i,j,w,n; while(~scanf("%d",&n)) { for(int kk=0; kk<n; kk++) { cin >>i>> j>>w; edgenode *p=new edgenode(); p->to=j; p->w=w; p->next=N[i]; N[i]=p; } for(int i=1; i<=n; i++) { for(edgenode *k=N[i]; k!=NULL; k=k->next) { cout <<i <<" "<<k ->to<<" "<< k->w<<endl; } } } return 0;}
附上测试数据:
/*125 8 96 1 128 3 111 2 43 1 224 3 177 4 256 5 98 7 71 6 93 2 196 7 4*/
0 0
- 图的存储三部曲——其二:邻接表
- 图的存储——邻接表
- 图的存储结构——邻接表的建立
- 图——操作用邻接表存储的图
- 图的存储形式——邻接表
- 图的存储结构——邻接表
- 数据结构—图的存储—邻接表和邻接矩阵
- 数据结构——图的存储 邻接表
- 图的存储结构——邻接表
- 图的存储结构——邻接链表
- 图的存储结构——邻接表
- 图的存储结构—邻接矩阵、邻接表
- 图的邻接表存储
- 图的邻接表存储
- 图的邻接表存储
- 图的存储-邻接表
- 图的邻接表存储
- 图的邻接表存储
- MeasureSpec介绍及使用详解
- C++数组长度
- to_char对日期时间简单的处理
- javascript调用c++等语言写的active dll
- struct vm_area_struct
- 图的存储三部曲——其二:邻接表
- plot函数
- 我的左脚》My Left Foot
- Kruskal算法计算最小生成树
- HDU 4217 Data Structure? 线段树 OR 树状数组
- oracle的表空间的理解
- android 高效开发 Android App 的 10 个建议
- 第六周项目3-多文件组织
- cout格式化输出