思路:在之前的单层网络上,再创建一个网络。两个网络的节点一一对应,这样方便了两个网络的连接。区别两个网络的就是它们属于不同的层。
用到的数据:
完整代码:
#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; }