#includde<iostream>
#include<cstdio>
#include<cstdio>
using namespace std;

const int manx=100;

struct ArcNode//边结点
{
    int adjvex;//有向边的另一个邻接点的序号
    ArcNode *nextarc;//指向下一个边结点的指针
};
struct VNode//顶点
{
    int data;//顶点信息
    ArcNode *head1;//出边表表头指针
    ArcNode *head2;//入边表表头指针
};
struct LGraph//图的邻接表存储结构
{
    VNode vertexs[maxn];//顶点数组
    int vexnum,arcnum;//顶点数和边数
};
LGraph lg;//图(邻接表存储)
void CreateLG()//构造有向图G,顶点编号从0开始
{
    ArcNode *pi;//用来构造边链表的边结点指针
    int v1,v2;//有向边的两个顶点
    for(int i=0;i<lg.vernum;i++)//初始化表头指针
        lg.vertexs[i].head1=lg.vertexs[i].head2=NULL;
    for(int i=0;i<lg.arcnum;i++)
    {
        scanf("%d%d",&v1,&v2);//输入一条边的起点和终点
        v1--;v2--;//顶点下标,顶点从1计数
        pi=new ArcNode;//假定空间足够
        pi->adjvex=v2;
        pi->nextarc=lg.vertexs[v1].head1;//插入出边表
        lg.vertexs[v1].head1=pi;//更新
        pi=new ArcNode;//假定空间足够
        pi->adjvex=v1;
        pi->nextarc=lg.vertexs[v2].head2;//插入入边表
        lg.vertexs[v2].head2=pi;//更新
    }
}
void DeletLG()
{
    ArcNode *pi;
    for(int i=0;i<lg.vexnum;i++)
    {
        pi=lg.vertexs[i].head1;
        while(pi!=NULL)//释放第i个顶点出边表各结点的空间
        {
            lg.vertexs[i].head1=pi->nextarc;
            delete pi;
            pi=lg.vertexs[i].head1;
        }
        pi=lg.vertexs[i].head2;
        while(pi!=NULL)//释放第i个顶点入边表各结点的空间
        {
            lg.vertexs[i].head2=pi->nextarc;
            delete pi;
            pi=lg.vertexs[i].head2;
        }
    }
}
int main()
{
    int od,id;//顶点的入度和出度
    ArcNode *pi;//遍历边链表的指针
    while(1)
    {
        lg.vexnum=lg.arcnum=0;
        scanf("%d%d",&lg.vexnum,&lg.arcnum);
        if(lg.vexnum==0) break;//输入数据结束
        CreateLG();
        for(int i=0;i<lg.vexnum;i++)//统计出度
        {
            od=0;
            pi=lg.vertexs[i].head1;
            while(pi!=NULL)
            {
                od++;
                pi=pi->nextarc;
            }
            if(i==0) printf("%d",od);
            else printf(" %d",od);
        }
        printf("\n");
        for(int i=0;i<lg.vexnum;i++)//统计入度
        {
            id=0;
            pi=lg.vertexs[i].head2;
            while(pi!=NULL)
            {
                id++;
                pi=pi->nextarc;
            }
            if(i==0) printf("%d",id);
            else printf(" %d",id);
        }
        printf("\n");
        DeleteLG();
    }
    return 0;
}

对着书敲了一遍。。。。

 posted on 2013-05-10 00:04  ∑求和  阅读(210)  评论(0编辑  收藏  举报