最近在导师的要求下把空间小世界模型编出来了。我贴出来让大家共享一下:
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define L 100
#define W 10
#define N L*W
struct Node{
 int x;/*节点横坐标*/
 int y;/*节点纵坐标*/
 int degree;
 int GEdegree;
}Node[N];
int G[N][N];
 

int Node_degree(int i,int M)    
{
 int n=0;
 int j;
 for(j=0;j<M;j++)
  if(G[i][j]==1)
   n=n+1;
printf("节点%d的出度=%d\n",i,n);
return n;
}
/*局部出度*/
int Local_OutDegree(int n, int M)
{
  int i,j,a,b;
  int k=0;
  int E=0;
  int Link[1000];
  for(i=0;i<M;i++)
  if(G[n][i]==1)
  {
     Link[k]=i;
     k++;
   }
  for(i=0;i<k;i++)
  {
 a=Link[i];
 for(j=0;j<k;j++)
 {
  b=Link[i];
  if(G[a][b]==1)
   E++;
    }
   }
 
  Node[n].GEdegree=Node_degree(n,M)-E;
  return Node[n].GEdegree;
 }
 
void SpatialWS(double p,int q,int a)
{
 int i,j,k;
 int d,l;
 double s;
 for(i=0;i<N;i++)
   for(j=0;j<N;j++)
    G[i][j]=0;
 k=0;
 for(j=0;j<W;j++)
 {
  for(i=0;i<L;i++)
  {
   Node[k].x=j;
         Node[k].y=i;
   k++;
  }
 }
 for(i=0;i<N;i++)
 {
  for(j=i+1;j<N;j++)
  {
   d=abs(Node[i].x-Node[j].x)+abs(Node[i].y-Node[j].y);
   if(d<=q)
    G[i][j]=G[j][i]=1;
  }
 }
 srand(time(0));
 for(i=0;i<N;i++)
 {
  do{
   j=rand()%N;
  }while(G[i][j]==1&&i==j);
  l=abs(Node[i].x-Node[j].x)+abs(Node[i].y-Node[j].y);
  s=pow(l,-a);
  if(s<p)
  {
   G[i][j]=1;
   G[j][i]=1;
  }
 }
}
int main()
{
 int i;
 SpatialWS(0.5,1,2);
 printf("SpatialWS is create!\n");
    for(i=0;i<N;i++)
 { 
  
     int n=Local_OutDegree(i,N);
     printf("节点%d的局部出度=%d",i,n);
    }
 return 0;
}