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

用到的数据:

完整代码:
#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;
}
来源:https://www.cnblogs.com/miaobo/p/12505380.html