图的存储三部曲——其二:邻接表

来源:互联网 发布:淘宝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
原创粉丝点击