图的邻接表

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define Maxn 100
struct ARCnode  //边节点
{
	int adjvex;   //边的另一个邻接点的序号
	ARCnode *next;  //指向下一个边节点的指针
};
struct Vnode  //顶点
{
	int data;     //顶点信息
	ARCnode *head1;   //出边表的表头指针
	ARCnode *head2;   //入边表的表头指针
};
struct LGraph
{
	Vnode point[Maxn];  //顶点数组
	int vexnum,arcnum;  //顶点数和边(弧)数
};
LGraph lg;
void CreatLg()   //构造有向图G
{
	ARCnode *pi;  //用来构造边链表的边结点指针
	int v1,v2;   //有向弧的两个顶点
	for(int i=0;i<=lg.vexnum;i++)  //初始化表头指针都为空
		lg.point[i].head1=lg.point[i].head2=NULL; 
	for(int i=0;i<=lg.arcnum;i++)
	{
		scanf("%d%d",&v1,&v2);//输入一条弧的始点和终点
		v1--;v2--;
		pi=new ARCnode;//假定有足够空间
		pi->adjvex=v2;  
		pi->next=lg.point[v1].head1;  //插入链表
		lg.point[v1].head1=pi;

		pi=new ARCnode;
		pi->adjvex=v1;
		pi->next=lg.point[v2].head2;    //插入链表
		lg.point[v2].head2=pi;
	}
}
//释放各顶点边链表中的边结点
void DeleteLG()
{
	ARCnode *pi;
	for(int i=0;i<lg.vexnum;i++)
	{
		pi=lg.point[i].head1;
		while(pi!=NULL)//释放第i个顶点出边表各边结点所占的存储空间
		{
			lg.point[i].head1=pi->next;
			delete pi;
			pi=lg.point[i].head1;
		}
		while(pi!=NULL)//释放第i个顶点入边表各边结点所占的存储空间
		{
			lg.point[i].head2=pi->next;
			delete pi;
			pi=lg.point[i].head2;
		}
	}
}
int main()
{
	ARCnode *pi;
	while(1)
	{
		lg.arcnum=lg.vexnum=0;
		scanf("%d%d",&lg.vexnum,&lg.arcnum);
		if(lg.vexnum==0)
			break;
		CreatLg();
		for(int i=0;i<lg.vexnum;i++)//统计各顶点出度并输出
		{
			int od=0;
			pi=lg.point[i].head1;
			while(pi!=NULL)
			{
				od++;
				pi=pi->next;
			}
			if(i==0)
				printf("%d",od);
			else
				printf(" %d",od);
		}
		printf( "\n" );
		for(int i=0;i<lg.vexnum;i++)//统计各顶点入度并输出
		{
			int od=0;
			pi=lg.point[i].head2;
			while(pi!=NULL)
			{
				od++;
				pi=pi->next;
			}
			if(i==0)
				printf("%d",od);
			else
				printf(" %d",od);
		}
		printf( "\n" );
		DeleteLG();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_40317006/article/details/81461753
今日推荐