要吐了,typedef东西太多了,完全记不住......
#include <stdio.h>
#define MaxVNum 10
typedef int Vertex;
typedef int WeightType;
typedef struct AdjNode* EdgeListNode;
struct AdjNode {
Vertex NodeName;
WeightType weight;
struct Adjnode* next;/*是指向下一个点,但点里面不是只有node_name*/
};
/*构造结构数组的元素表示形式,因为邻接表表示图,每个顶点相当于一个元素*/
/*每一个元素,就是一个指针,顺着指针拉出来是表示连通边一条链表*/
typedef struct {
EdgeListNode MyEdges;
}AdjList[MaxVNum];/*图有几个点,结构数组就有几个元素*/
/*现在来定义整张图*/
typedef struct graph* LGraph;
struct graph {
int Nv, Ne;
AdjList G;
};
/*初始化一个有顶点但没有边的图*/
LGraph CreateGraph(int VertexNum)
{
LGraph g = malloc(sizeof(struct graph));
if (g == NULL)
Error("no space!");
else
{
g->Nv = VertexNum;
g->Ne = 0;
for (int i = 0; i < g->Nv; i++)
g->G[i].MyEdges = NULL;
}
return g;
}
/*定义一条边的结构*/
struct edge {
Vertex v1;
Vertex v2;
WeightType weight;
};
typedef struct edge* Edge;
/*向graph里面插入边*/
void InsertEdge(LGraph g, Edge e)
{
/*EdgeList是指向一个邻接Node*/
EdgeListNode new = malloc(sizeof(struct AdjNode));
new->NodeName = e->v1;
new->weight = e->weight;
/*显然插在表头更方便,但数组下标的点不是和AdjNode连在一起的*/
/*而是直接一个指针指向下一个节点,自己不和他们连*/
new->next = g->G[e->v2].MyEdges;
g->G[e->v2].MyEdges = new;
/*如果是无向图,倒过来再搞一边*/
new = malloc(sizeof(struct AdjNode));
new->NodeName = e->v2;
new->next = g->G[e->v1].MyEdges;
g->G[e->v1].MyEdges = new;
}
/*完整建立一张图*/
LGraph BuildGraph(int VerNum)
{
LGraph g = CreateGraph(VerNum);
/*输入有几条边*/
scanf("%d\n", &(g->Ne));
if (g->Ne != 0)
{
for (int i = 0; i < g->Ne; i++)
{
Edge e = malloc(sizeof(struct edge));
scanf("%d %d %d\n", &(e->v1), &(e->v2), &(e->weight));
InsertEdge(g, e);
}
}
return g;
}