要完整地表示一个图,就需要明确图中有什么,很简单,节点和边。
所以,在用邻接表表示一个图的时候,我们需要分别表示其节点和边,然后用边将节点连接起来即可。
使用邻接表,文字上的描述就是,将所有节点放入一张邻接表中,对于每个节点的邻接节点,用一个链表将其连接起来。
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。
时间: 2024-10-09 23:25:35