#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MaxVertexNum 20
typedef int WeightType;
typedef int VertexType;
typedef int Status;
typedef struct GNode *PtrToGNode;
typedef PtrToGNode LGraph;
typedef struct ENode *PtrToEdge;
typedef PtrToEdge Edge;
typedef struct AdjVNode *PtrToAdjVNode;
typedef struct VNode //邻接表类型的定义
{
PtrToAdjVNode FirstEdge;
VertexType Data;
}AdjList[MaxVertexNum];
struct GNode //图的定义
{
int Nv;
int Ne;
AdjList G;
};
struct ENode //边的定义
{
VertexType V1,V2;
WeightType Weight;
};
struct AdjVNode //邻接点的定义
{
int AdjV; //邻接点的下标
WeightType Weight;
PtrToAdjVNode Next;
};
LGraph CreateGraph(int VertexNum)
{
LGraph Graph;
Graph=(LGraph)malloc(sizeof(struct GNode));
Graph->Nv=VertexNum;
Graph->Ne=0;
for(int i=0;i<Graph->Nv;i++)
{
Graph->G[i].FirstEdge=NULL;
}
printf("请输入结点信息:");
for(int i=0;i<Graph->Nv;i++)
{
scanf("%d",&Graph->G[i].Data);
}
return Graph;
}
void Insert(LGraph Graph,Edge E)
{
PtrToAdjVNode V;
V=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
V->AdjV=E->V2;
V->Weight=E->Weight;
V->Next=Graph->G[E->V1].FirstEdge;
Graph->G[E->V1].FirstEdge=V;
V=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
V->AdjV=E->V1;
V->Weight=E->Weight;
V->Next=Graph->G[E->V2].FirstEdge;
Graph->G[E->V2].FirstEdge=V;
}
void CreateEdge(LGraph Graph,int EdgeNum)
{
PtrToEdge E;
Graph->Ne=EdgeNum;
E=(Edge)malloc(sizeof(struct ENode));
printf("请输入边的信息:");
for(int i=0;i<Graph->Ne;i++)
{
scanf("%d %d %d",&E->V1,&E->V2,&E->Weight);
Insert(Graph,E);
}
}
void Print(LGraph Graph)
{
int i,j;
printf("当前结点信息为:");
for(i=0;i<Graph->Nv;i++)
{
printf("%d ",Graph->G[i].Data);
}
printf("\n");
printf("邻接表为: \n");
for(i=0;i<Graph->Nv;i++)
{
printf("%d ",Graph->G[i].Data);
PtrToAdjVNode p=Graph->G[i].FirstEdge;
while(p)
{
printf("%d ",p->AdjV);
p=p->Next;
}
printf("\n");
}
}
int main()
{
LGraph Graph;
int Nv,Ne;
printf("请输入结点数与边数\n");
scanf("%d %d",&Nv,&Ne);
Graph=CreateGraph(Nv);
CreateEdge(Graph,Ne);
Print(Graph);
}
第六章--图邻接表实现
猜你喜欢
转载自blog.csdn.net/a13683857889/article/details/87552550
今日推荐
周排行