思路:在之前的單層網絡上,再創建一個網絡。兩個網絡的節點一一對應,這樣方便了兩個網絡的連接。區別兩個網絡的就是它們屬於不同的層。
用到的數據:
完整代碼:
#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; }