邻接表构建图

 

一个是顶点表,包括顶点和指向下一个邻接点的指针

一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针

刚开始的时候把顶点表初始化,指针指向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 }  

 

posted @ 2016-10-28 17:32  XuJiaqing  阅读(4433)  评论(0编辑  收藏  举报