一个是顶点表,包括顶点和指向下一个邻接点的指针
一个是边表, 数据结构跟顶点不同,存储的是顶点的序号,和指向下一个的指针
刚开始的时候把顶点表初始化,指针指向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("
");
46 }
47 }
48 /*创建无向图的方法*/
49 void create(ALGraph* G)
50 {
51 int i,j,k,w,v;
52 //申明边表节点
53 EdgeNode *s;
54 //确定一个图的顶点数目和边的数目
55 printf("读入顶点数和边数:
");
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("建立边表
");
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 }