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

邻接表是一种链式的存储结构。对于图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;
}

附上测试数据:

/*12
5 8 9
6 1 12
8 3 11
1 2 4
3 1 22
4 3 17
7 4 25
6 5 9
8 7 7
1 6 9
3 2 19
6 7 4*/


你可能感兴趣的:(图的存储三部曲——其二:邻接表)