数据结构之图的存储结构——动态邻接表

来源:互联网 发布:九回时间旅行 知乎 编辑:程序博客网 时间:2024/05/16 04:44

邻接表是图的一种链式存储结构。对于图G中每个定点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表称为顶点Vi邻接表。

邻接表有三种实现方法,分别为动态建表实现,使用STL中的vector模拟链表实现和静态建表实现。   

动态建表中建立一个VNode的数组就可以访问每个顶点的邻接表。

动态建表要求对于每个读入的边数据新建一个EdgeNode对象,加到对应的VNode的邻接表里,同时,需要动态申请内存。在样例实现中,将新节点加到了链表的头部。

对于动态建立的邻接表,它的时间和空间效率比较高,但是这些内存的释放是个问题,判断任意两个顶点(Vi和Vj)之间是否有边相连效率低,需要搜索第i个和第j个链表。

#include<iostream.h>#include<stdlib.h>#include<algorithm>const int maxn=100;//数据结构//**********************************struct EdgeNode    //邻接表结点{int to;//终点int w;//权值EdgeNode *next;//指向下一条的指针};struct VNode//起点表结点{int from;//起点EdgeNode *first;//邻接表头指针};VNode Adjlist[maxn];//整个图的邻接表//**********************************int main(){int i,j,w;int n=10,m=10;memset(Adjlist,NULL,sizeof(Adjlist));  //初始化邻接表为NULLfor(int t=1;t<=m;t++){cin>>i>>j>>w;EdgeNode *p=new EdgeNode();p->to=j;p->w=w;p->next=Adjlist[i].first;Adjlist[i].first=p;}for(i=1;i<=n;i++){for(EdgeNode * k=Adjlist[i].first;k!=NULL;k=k->next)   //打印出起点为i的所有边{cout<<i<<' '<<k->to<<' '<<k->w<<endl;}}return 0;}


原创粉丝点击