第六章--图邻接表实现

#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