图的邻接表表示

  要完整地表示一个图,就需要明确图中有什么,很简单,节点和边。

  所以,在用邻接表表示一个图的时候,我们需要分别表示其节点和边,然后用边将节点连接起来即可。

  使用邻接表,文字上的描述就是,将所有节点放入一张邻接表中,对于每个节点的邻接节点,用一个链表将其连接起来。

1 邻接表中边、节点、图定义

 1 typedef struct Edge
 2 {
 3     int adjvex;
 4     struct Edge *nextEdge;
 5 }Edge;
 6 //顶点表
 7 typedef struct VNode
 8 {
 9     int data;
10     Edge *firstEdge;
11 }VNode;
12 //邻接表
13 typedef struct AGraph
14 {
15     VNode adjlist[MAXSIZE];
16     int n,e;
17 }AGraph;

  定义是按照从上往下写的,但是思考的时候,应该从下往上思考。

  我们现在需要一个图,图中是若干节点,有e条边。

  图中的这n和节点,我们需要知道哪些边是和它相接的,所以,对应每个节点(VNode),我们需要一个头指针(firstEdge),指向其第一条边,通过这个指针,邻接表中每个节点就具有了向外延伸的能力。延伸的过程就是建立单向链表。类似于“头插法”。

  邻接表表示,最直观的就是表示了图中的n个节点,以及和每个节点相邻的边,节点存储在顺序表中,边存储在单向链表中。

2 创建

 1 void creategra(AGraph *g,int n,int e)
 2 {
 3     Edge *s;
 4     g->n = n;
 5     g->e = e;
 6     for(int i=0;i<n;i++)
 7     {
 8         g->adjlist[i].data=i;
 9         g->adjlist[i].firstEdge=NULL;
10     }
11     printf("input the edge\n");
12     int a,b;
13     for(int i=0;i<e;i++)
14     {
15         scanf("%d%d",&a,&b);  //a到b有路径
16         s = (Edge *)malloc(sizeof(Edge));
17         s->adjvex=b;
18         s->nextEdge=g->adjlist[a].firstEdge;
19         g->adjlist[a].firstEdge=s;
20     }
21 }

  对于一个图,有n个节点,我们假设节点是从0到n-1。将这n个节点放到邻接表中(8行),开始时没有任何边和他们链接(9行)。

  我们有了节点之后,就需要用边将他们连接起来,例如,a到b有路径,我们就申请一块空间存储a->b这条边的信息(16行)。这条边邻接节点是b。将这条边插入到邻接表中(18、19行)。那么,a这个节点的第一条边就是a->b。当我们再连接a和c时,a这个节点的第一条边就是a->c,他的下一条边就是a->b。

 

posted @ 2015-10-19 15:40  康小武  阅读(2534)  评论(0编辑  收藏  举报