图的邻接表存储
邻接表是图的一种链式存储结构。
在邻接表中,对图中的每一个定点建立一个单链表,第i个单链表中的结点表示依附于定点vi的边。
每一个结点由三个域构成,表节点,头结点,还有存储图的。
假设像构建下图的一个图的结构
那么程序例如以下:
#include<stdio.h> #include<stdlib.h> #define MAXNUM 100 typedef struct node //边表节点 { int adjvex; struct node* next; }EdgeNode; typedef struct //顶点表节点 { char vertex; EdgeNode* firstedge; }VertexNode; typedef struct { VertexNode adjlist[MAXNUM]; int n,e; }ALGraph; void create(ALGraph* G) { int i,j,k,w,v; EdgeNode *s; printf("读入顶点数和边数"); scanf("%d,%d",&G->n,&G->e); for (i=0;i<G->n;i++) { fflush(stdin); printf("建立顶点表"); G->adjlist[i].vertex=getchar(); G->adjlist[i].firstedge=NULL; } printf("建立边表\n"); for (k=0;k<G->e;k++) { printf("读入(vi-vj)的顶点对序号"); scanf("%d,%d",&i,&j); s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=j; s->next=G->adjlist[i].firstedge; //插入表头 G->adjlist[i].firstedge=s; s=(EdgeNode*)malloc(sizeof(EdgeNode)); s->adjvex=i; s->next=G->adjlist[j].firstedge; G->adjlist[j].firstedge=s; } } int main() { int i; ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph)); create(G); for (i=0;i< G->n;i++) { printf("%d->",i); while(G->adjlist[i].firstedge!=NULL) { printf("%d->",G->adjlist[i].firstedge->adjvex); G->adjlist[i].firstedge=G->adjlist[i].firstedge->next; } printf("\n"); } }