- 图例:
- 代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100
//边的定义
typedef struct ENode
{
int start;
int end;
int weight; //权重
}*Edge;
//邻接点
typedef struct AdjVNode
{
int AdjV; //点下标
int weight; //点权重
struct AdjVNode* next; //next指针
}*pAdjVNode;
//表头节点
typedef struct VNode
{
pAdjVNode firstEdge; // 边表头指针
} AdjList[maxn];
//图节点
typedef struct GNode
{
int VetexNum; //顶点
int EdgeNum; //边数
AdjList G; //邻接表
}*pGraph;
pGraph InitGraph(int VetexNum)
{
pGraph Graph = (pGraph)malloc(sizeof(GNode));
Graph->VetexNum = VetexNum;
Graph->EdgeNum = 0;
//注意初始化邻接表头指针
for (int i = 0; i < Graph->VetexNum; ++i)
{
Graph->G[i].firstEdge = NULL; //初始化每一条边的开始节点都是NULL
}
return Graph;
}
void InsertEdge(pGraph Graph, Edge E)
{
//为节点申请空间,注意是将边的end赋给新节点的下标(即出度),权重赋给新节点的权重
pAdjVNode newNode = (pAdjVNode)malloc(sizeof(AdjVNode));
newNode->AdjV = E->end;
newNode->weight = E->weight;
//链表的节点插入
newNode->next = Graph->G[E->start].firstEdge;
Graph->G[E->start].firstEdge = newNode;
}
pGraph CreateGraph()
{
pGraph Graph;
Edge E;
int nv;
printf("Please input VetexNum:");
scanf("%d",&nv);
Graph = InitGraph(nv);
printf("Please input EdgeNum:");
scanf("%d",&(Graph->EdgeNum));
if(Graph->EdgeNum != 0)
{
E = (Edge)malloc(sizeof(Edge));
printf("Please input start,end,weight:\n");
for(int i=0; i < Graph->EdgeNum; ++i)
{
scanf("%d %d %d",&E->start,&E->end,&E->weight);
InsertEdge(Graph,E);
}
}
return Graph;
}
void Print(pGraph Graph)
{
//输出的时候我并没有将权重输出,其实也可以输出的
printf("AdjList:\n");
for(int i = 0; i < Graph->VetexNum; ++i){
pAdjVNode ptr = Graph->G[i].firstEdge;
printf("Head[%d]",i);
while(ptr != NULL)
{
printf("->%d",ptr->AdjV);
ptr = ptr->next;
}
printf("\n");
}
}
int main(int argc, char const *argv[])
{
pGraph Graph = CreateGraph();
Print(Graph);
return 0;
}
结果