#include <stdio.h>
#include <malloc.h>
#define MaxVertexNum 10
typedef struct ENode *PtrToENode;
typedef int Vertex;
struct ENode{
Vertex V1,V2;
int Weight;
};
typedef PtrToENode Edge;
typedef struct AdjVNode *PtrToAdjVNode;
struct AdjVNode{
Vertex AdjV;
int Weight;
PtrToAdjVNode Next;
};
typedef struct Vnode{
PtrToAdjVNode FirstEdge;
int AdjV;
}AdjList[MaxVertexNum];
typedef struct GNode *PtrToGode;
struct GNode{
int Nv;
int Ne;
AdjList G;
};
typedef PtrToGode LGraph;
LGraph CreateGraph(int VertexNum);
void InsertEdge(LGraph Graph,Edge E);
LGraph BuildGraph();
LGraph BuildGraph(){
LGraph Graph;
Edge E;
int Nv,i;
printf("输入结点数:\n");
scanf("%d",&Nv);
Graph = CreateGraph(Nv);
printf("输入边数:\n");
scanf("%d",&(Graph->Ne));
if(Graph->Ne != 0){
E = (Edge)malloc(sizeof(struct ENode));
for(i = 0;i < Graph->Ne;i++){
printf("输入要插入边的两个顶点以及权重:\n");
scanf("%d %d %d",&(E->V1),&(E->V2),&(E->Weight));
InsertEdge(Graph,E);
}
}
return Graph;
}
void InsertEdge(LGraph Graph,Edge E){
PtrToAdjVNode NewNode;
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V2;
NewNode->Weight = E->Weight;
NewNode->Next = Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge = NewNode;
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->V1;
NewNode->Weight = E->Weight;
NewNode->Next = Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge = NewNode;
}
LGraph CreateGraph(int VertexNum){
Vertex V,W;
LGraph Graph = (LGraph)malloc(sizeof(struct GNode));
Graph->Nv = VertexNum;
Graph->Ne = 0;
for(V = 0;V < Graph->Nv;V++){
Graph->G[V].AdjV = V;
Graph->G[V].FirstEdge = NULL;
}
return Graph;
}
int main () {
LGraph Graph = BuildGraph();
int i,j;
printf("创建的图的邻接表为:\n");
for(i = 0;i < Graph->Nv;i++){
PtrToAdjVNode p;
p = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
if(Graph->G[i].FirstEdge != NULL){
p = Graph->G[i].FirstEdge;
printf("%d: ",Graph->G[i].AdjV);
while(p != NULL){
printf("%d %d ",p->AdjV,p->Weight);
p = p->Next;
}
}
printf("\n");
}
return 0;
}