雙層網絡的創建(層的加入,以及度中心性算出)


思路:在之前的單層網絡上,再創建一個網絡。兩個網絡的節點一一對應,這樣方便了兩個網絡的連接。區別兩個網絡的就是它們屬於不同的層。

 

用到的數據:

 

 

完整代碼:

#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;
//返回文件行數(網絡邊數),有換行符"\n"就為一行
int lines(char* str)
{
int c;
FILE* fp;
int lines=0;
fp=fopen(str,"r");
if(fp)
    {
    while((c=fgetc(fp))!=EOF)
        if(c=='\n')
            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]='\0';    
    
    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("\n");
        }
}
//所屬層插入
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\n",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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM