zoukankan      html  css  js  c++  java
  • 邻接表表示

    #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;
    }

    对着书敲了一遍。。。。

  • 相关阅读:
    C++指针
    C++ 结构体和枚举
    提供openssl -aes-256-cbc兼容加密/解密的简单python函数
    最新安全学习视频
    C++复合类型(结构体)
    C艹复合类型(字符串)
    C++复合类型(数组)
    python 搜索引擎Whoosh中文文档和代码 以及jieba的使用
    JSP基础之 C标签中的 varStatues属性
    JSP进阶 之 SimpleTagSupport 开发自定义标签
  • 原文地址:https://www.cnblogs.com/54zyq/p/3070303.html
Copyright © 2011-2022 走看看