zoukankan      html  css  js  c++  java
  • 双层网络的创建(层的加入,以及度中心性算出)

    思路:在之前的单层网络上,再创建一个网络。两个网络的节点一一对应,这样方便了两个网络的连接。区别两个网络的就是它们属于不同的层。

    用到的数据:

    完整代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<malloc.h>
    #include<math.h>
    #include<time.h>
    #define MaxVertexNum 90000
    //边表节点
    typedef struct node
    {
    int adjvex;
    struct node *next;
    int visit;
    }EdgeNode;
    //顶点表节点
    typedef struct vnode
    {
    int vertex;
    int KS;//k-core
    float ec;//特征向量中心性
    int k;
    int is_infected;
    int is_visit;
    int layer;//
    int degree;//该节点的度
    EdgeNode* firstedge;//指向边表的指针
    }VertexNode;
    typedef VertexNode AdjList[MaxVertexNum];
    //图的结构
    typedef struct
    {
    AdjList adjlist;//顶点表(类似于数组的)
    int vexnum;//顶点个数
    int arcnum;//边个数
    }ALGraph;
    //返回文件行数(网络边数),有换行符"
    "就为一行
    int lines(char* str)
    {
    int c;
    FILE* fp;
    int lines=0;
    fp=fopen(str,"r");
    if(fp)
        {
        while((c=fgetc(fp))!=EOF)
            if(c=='
    ')
                lines++;
            fclose(fp);
        }
    return lines;
    }
    //返回文件最大数(网络节点数)
    int max(char* str)
    {
    FILE* fp;
    char* p;
    int line=lines(str);
    int i=0;
    int a=0;
    int b=0;
    fp=fopen(str,"r");
    char buf[256];
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("fail to read");
            exit(1);
        }
    //把文件的内容给buf
    
    while(fgets(buf,line,fp)!=NULL)
        {
    
    
    //p就没有    
        p=buf;
        
    //这一步没有成功赋值
    sscanf(p,"%1d %1d",&a,&b);//输入源为p
    
        //i始终为最大的
        if(a>i)
            i=a;
        if(b>i)
            i=b;
        }
    
    return i;
    }
    //创建图
    void createAlgraph(ALGraph*  G,char* str)
    {
    FILE* fp;
    int line=lines(str);
    int node=max(str);//其中最大数
    G->vexnum=node+1;
    G->arcnum=line;
    fp=fopen(str,"r");
    char buf[1024];
    int len;
    int m;
    int n;
    EdgeNode* s;
    char* p;
    int a=0;
    int b=0;
    int i=0;
    //每个节点的顶点表(vn1(i),vn2(i))
    int vn1[5];//这里本来要用vn[line],但不能通过编译,有多少行就有多少(i,j)
    int vn2[5];
    //顶点录入
    for(int j=0;j<G->vexnum;j++)
        {
        G->adjlist[j].vertex=j;
        G->adjlist[j].firstedge=NULL;
        
        }
    if((fp=fopen(str,"r"))==NULL)
        {
        perror("faile to read");
        exit(1);
        }
    //将顶点信息存入数组
    
    while(fgets(buf,line,fp)!=NULL)//因为行数等于等于节点数,则读取行数个就可以把其他的节点的连接读完
        {
        //这里的读取出错每次只能读取一个数字
    
        len=strlen(buf);
        
        buf[len]='';    
        
        p=buf;
    //下面一句解决了挨个取数字的问题,弄一下午
        sscanf(p,"%1d%1d",&a,&b);
    
    
        vn1[i]=a;
        vn2[i]=b;
    
        i++;
        }
    
    //边节点放入链表
    for(int k=0;k<line;k++)//有多少行就有多少节点,每个节点对应一个边链
        {
        m=vn1[k],n=vn2[k];
        int ii=0;
        EdgeNode* p;
        p=G->adjlist[m].firstedge;
        while(p!=NULL)
            {
            if(p->adjvex==n)
                {
                ii=1;
                break;
                }
            p=p->next;
            }
        if(ii!=1)
            {
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=n;//相连接的顶点
            s->next=NULL;
            s->next=G->adjlist[m].firstedge;
            G->adjlist[m].firstedge=s;
            //无向图 有来回
            s=(EdgeNode*)malloc(sizeof(EdgeNode));
            s->adjvex=m;
            s->next=NULL;
            s->next=G->adjlist[n].firstedge;
            G->adjlist[n].firstedge=s;
            }
        }
    //深度为每个节点后面连接的链长度
    EdgeNode* q;
    for( i=0;i<G->vexnum;i++)
        {
        int k=0;
        q=G->adjlist[i].firstedge;
        while(q!=NULL)
            {
            k++;
            q=q->next;
            }
        G->adjlist[i].degree=k;    
        }
        //打印邻接表
        for(i=0;i<G->vexnum;i++)
            {
            s=G->adjlist[i].firstedge;
            while(s)
                {
                printf("(%d,%d)",G->adjlist[i].vertex,G->adjlist[s->adjvex]);    
                s=s->next;
                }
            printf("
    ");
            }
    }
    //所属层插入
    void insertLayer(ALGraph* G,int layer)
    {
    for(int i=0;i<G->vexnum;i++)
        {
        G->adjlist[i].layer=layer;
        }
    }
    //打印度中心性
    void printDegreeCentrality(ALGraph* G)
    {
        float degreeCentrality;
    for(int i=0;i<G->vexnum;i++)
        {
        degreeCentrality=(G->adjlist[i].degree)/(G->vexnum-1.0);
        printf("node %d dgree centrality is:%.3f
    ",i,degreeCentrality);
        
        }
    }
    
    int main()
    {
    char* str1="E:\data_set\netsci1.txt";
    char* str2="E:\data_set\netsci2.txt";
    ALGraph* G1;
    ALGraph* G2;
    G1=(ALGraph*)malloc(sizeof(ALGraph));
    G2=(ALGraph*)malloc(sizeof(ALGraph));
    createAlgraph(G1,str1);//分别插入图的地址,连接顶点信息
    createAlgraph(G2,str2);
    //插入层数
    insertLayer(G1,1);
    insertLayer(G2,2);
    printDegreeCentrality( G1);
        return 0;
    }
  • 相关阅读:
    EV: There is no source code available for the current location.
    EV: 致新教育萤火虫父母们
    DEL: 2012年每月花销
    DEL: 博客分类规则
    java编程规范
    maven随笔
    JMS组成结构与特点
    activemq 的简单使用
    activeMQ安装与访问
    java8 stream
  • 原文地址:https://www.cnblogs.com/miaobo/p/12505380.html
Copyright © 2011-2022 走看看