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


    用邻接表存储有向图,并输出各顶点的出度和入度
    题目来源图论算法
    例1.3
    首先我们需要定义一些结构体,其用法在注释中使用

    # define maxn 100
    struct ArcNode{
     int adjvex;
    //有向边的另一个邻接点的序号
    ArcNode *nextarc; 
    //指向下一个边节点的指针};
    struct VNode{
    int data;
    ArcNode *head1; //出边表的表头指针
    ArcNode *head2;// 入边表的表头指针};
    struct lgraph{ VNode vertex[maxn];
     int vexnum, arcnum; };lgraph lg;


    接下来我们需要定义邻接表创建函数

    void createlg()
    {
       int i=0;  // for
       ArcNode *pi;
        int v1,v2; //顶点
       for(i=0;i<lg.vexnum;i++)        //初始化表头指针
          lg.vertex[i].head1=lg.vertex[i].head2=NULL;
        for(i=0;i<lg.arcnum;i++)
        {
          scanf("%d%d",&v1,&v2);
          v1--,v2--;
          pi=new ArcNode;
          pi->adjvex=v2;
         pi->nextarc=lg.vertex[v1].head1;    //插入链表
         lg.vertex[v1].head1=pi;
          pi=new ArcNode;
          pi->adjvex=v1;
          pi->nextarc=lg.vertex[v2].head2;    //插入链表
         lg.vertex[v2].head2=pi; 
        }
     }


    我们定义这个创建函数后,要有释放内存函数
    void deletelg()
    {
       int i;  // for
       ArcNode *pi;
       for(i=0;i<lg.vexnum;i++)
        {
           pi=lg.vertex[i].head1;
           //释放第i个顶点的出边表各节点所占的存储空间
          while(pi!=NULL)
           {
              lg.vertex[i].head1=pi->nextarc;
              delete pi;
              pi=lg.vertex[i].head1;
           }
          pi=lg.vertex[i].head2;
             //释放第i个顶点的入边表各节点所占的存储空间
          while(pi!=NULL)
           {
              lg.vertex[i].head2=pi->nextarc;
              delete pi;
              pi=lg.vertex[i].head2;
           }
       
        }
    
    }


    完整代码如下:

    #include<cstdio>
     #include<cstdlib>
     # define maxn 100
    
    struct ArcNode{
         
         int adjvex;           //有向边的另一个邻接点的序号
        ArcNode *nextarc;    //指向下一个边节点的指针
    };
    
    struct VNode
     {
         int data;
         ArcNode *head1;    //出边表的表头指针
        ArcNode *head2;    // 入边表的表头指针
    };
    
    
    struct lgraph
     {
         VNode vertex[maxn];
         int vexnum, arcnum;
     };
     lgraph lg;
    
    void createlg()
     {
        int i=0;  // for
        ArcNode *pi;
        int v1,v2; //顶点
       for(i=0;i<lg.vexnum;i++)        //初始化表头指针
          lg.vertex[i].head1=lg.vertex[i].head2=NULL;
        for(i=0;i<lg.arcnum;i++)
        {
          scanf("%d%d",&v1,&v2);
          v1--,v2--;
          pi=new ArcNode;
          pi->adjvex=v2;
          pi->nextarc=lg.vertex[v1].head1;    //插入链表
         lg.vertex[v1].head1=pi;
          pi=new ArcNode;
          pi->adjvex=v1;
          pi->nextarc=lg.vertex[v2].head2;    //插入链表
         lg.vertex[v2].head2=pi; 
        }
     }
    
    void deletelg()
     {
        int i;  // for
        ArcNode *pi;
        for(i=0;i<lg.vexnum;i++)
        {
           pi=lg.vertex[i].head1;
           //释放第i个顶点的出边表各节点所占的存储空间
          while(pi!=NULL)
           {
              lg.vertex[i].head1=pi->nextarc;
              delete pi;
              pi=lg.vertex[i].head1;
           }
           pi=lg.vertex[i].head2;
             //释放第i个顶点的入边表各节点所占的存储空间
          while(pi!=NULL)
           {
              lg.vertex[i].head2=pi->nextarc;
              delete pi;
              pi=lg.vertex[i].head2;
           }
        
        }
    
    }
     int main()
     {
       int i;
       int id,od;
       ArcNode *pi;
       while(1)
       {
       lg.vexnum=lg.arcnum=0;
       scanf("%d%d",&lg.vexnum,&lg.arcnum);
       if(lg.vexnum==0)  break;
       createlg();
       for(i=0;i<lg.vexnum;i++)
       {
       od=0;
       pi=lg.vertex[i].head1;
       while(pi!=NULL)
       {
          od++;
          pi=pi->nextarc;
       }if(i==0) printf("%d",od);
    
      else printf("%d",od);
       }printf("
    ");
       for(i=0;i<lg.vexnum;i++)
       {
       id=0;
       pi=lg.vertex[i].head2;
       while(pi!=NULL)
       {
          id++;
         pi=pi->nextarc;
       }if(i==0) printf("%d",id);
    
      else printf("%d",id);
       }printf("
    ");
        deletelg();
       }
     return 0;
     }

  • 相关阅读:
    linux创建用户和组
    ftp上来显示的时间和系统时间不一致
    在Linux下如何用Shell脚本读写XML?现有一个config.xml(转)
    关于业务主键和逻辑主键
    git push 提示
    浏览器默认样式
    css实现缩进无限嵌套
    使用设置报头x-Frame-Options限制iframe网页嵌套
    chrome控制台小技巧
    git版本库底层命令
  • 原文地址:https://www.cnblogs.com/kk328/p/10324761.html
Copyright © 2011-2022 走看看