#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();
}
}
用数组模拟邻接表:https://blog.csdn.net/major_zhang/article/details/52155279