邻接表构建图
一个是顶点表,包括顶点和指向下一个邻接点的指针
一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针
刚开始的时候把顶点表初始化,指针指向null。然后边表插入进来,是插入到前一个,也就是直接插入到firstedge指向的下一个,而后面的后移
1 #include <stdio.h> 2 #include <stdlib.h> 3 //定义最大的定点的个数为100 4 #define MaxVertexNum 100 5 6 typedef char VertexType; 7 /*边表节点*/ 8 typedef struct node 9 { 10 int adjvex;//指示具体顶点的存储位置index 11 node* next;//下一个边表节点的位置 12 }EdgeNode; 13 /*顶点表节点*/ 14 typedef struct 15 { 16 VertexType vertex;//顶点名 17 EdgeNode* firstedge;//指示后继的边表节点 18 }VertexNode; 19 //顶点表节点重命名 AdjList一维数组,依次从上向下存储,index 0 1 2 3... 20 typedef VertexNode AdjList[MaxVertexNum]; 21 22 typedef struct 23 { 24 AdjList adjlist; //顶点表数组 25 int n,e; //定义了图的顶点数和边数 26 }ALGraph; 27 /*创建无向图的方法*/ 28 void create(ALGraph*); 29 30 void main() 31 { 32 //为图分配堆空间 33 ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph)); 34 //创建无向图 35 create(G); 36 //循环图的顶点数 37 for (int i=0;i< G->n;i++) 38 { 39 printf("%d->",i); 40 while(G->adjlist[i].firstedge!=NULL) 41 { 42 printf("%d->",G->adjlist[i].firstedge->adjvex); 43 G->adjlist[i].firstedge=G->adjlist[i].firstedge->next; 44 } 45 printf("\n"); 46 } 47 } 48 /*创建无向图的方法*/ 49 void create(ALGraph* G) 50 { 51 int i,j,k,w,v; 52 //申明边表节点 53 EdgeNode *s; 54 //确定一个图的顶点数目和边的数目 55 printf("读入顶点数和边数:\n"); 56 scanf("%d,%d",&G->n,&G->e); 57 //通过顶点的数目,建立顶点表 58 for (i=0;i<G->n;i++) 59 { 60 fflush(stdin); 61 printf("建立顶点表"); 62 //读入顶点名 63 G->adjlist[i].vertex=getchar(); 64 //每个顶点的指向为Null 65 G->adjlist[i].firstedge=NULL; 66 } 67 //开始建立边表 68 printf("建立边表\n"); 69 //通过边数控制循环 70 for (k=0;k<G->e;k++) 71 { 72 //代表vi和vj之间存在边 73 printf("读入(vi-vj)的顶点对序号"); 74 scanf("%d,%d",&i,&j); 75 //为边表分配空间 76 s=(EdgeNode*)malloc(sizeof(EdgeNode)); 77 s->adjvex=j; 78 s->next=G->adjlist[i].firstedge; //插入表头 79 G->adjlist[i].firstedge=s; 80 81 s=(EdgeNode*)malloc(sizeof(EdgeNode)); 82 s->adjvex=i; 83 s->next=G->adjlist[j].firstedge; 84 G->adjlist[j].firstedge=s; 85 } 86 }
带着热忱学技术,带着耐心做技术,带着分享去交流,带着微笑探我们的程序人生!