图的基本操作

图这一章我一直觉得自己学的不是很好。。。这次就只放代码,不敢多说什么了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
typedef char VertexType;			//顶点类型应由用户定义
typedef int EdgeType; //边上的权值类型应由用户定义

#define MAXVEX 100

typedef struct EdgeNode{ //边表结点
int adjvex; //邻接点域,存储该顶点对应的下标
EdgeType weight; //用于存储权值,对于非网图可以不需要
struct EdgeNode *next; //链域,指向下一个邻接点
}EdgeNode;

typedef struct VertexNode{ //顶点表结点
VertexType data; //顶点域
EdgeNode *firstedge; //边表头指针
}VertexNode, AdjList[MAXVEX];

typedef struct{
AdjList adjList;
int numVertexes, numEdges; //图中当前顶点数和边数
}GraphAdjList;

/*头插法建立图的邻接表结构*/
void CreatALGraph(GraphAdjList *G){
int i, j, k;
EdgeNode *e;
printf("请输入顶点数和边数:");
scanf("%d, %d", &G->numVertexes, &G->numEdges); //输入顶点数和边数
for (i = 0; i < G->numVertexes; i++){ //读入顶点信息,建立顶点表
scanf("%c", &G->adjList[i].data); //输入顶点信息
G->adjList[i].firstedge = NULL; //将边表置为空表
}
for (k = 0; k < G->numEdges; k++){ //建立边表
printf("输入(vi, vj)上的顶点序号:\n");
scanf("%d, %d", &i, &j); //输入(vi, vj)上的顶点序号
e = (EdgeNode *)malloc(sizeof(EdgeNode)); //向内存申请空间
e->adjvex = j; //邻接序号为j
e->next = G->adjList[i].firstedge; //将e指针指向当前顶点所指向的结点
G->adjList[i].firstedge = e; //将当前顶点的指针指向e

e = (EdgeNode *)malloc(sizeof(EdgeNode)); //向内存申请空间,生成边表结点
e->adjvex = i; //邻接序号为i
e->next = G->adjList[j].firstedge; //将e指针指向当前顶点指向的结点
G->adjList[j].firstedge = e; //将当前顶点的指针指向e
}
}