C 程序运行报错求助
各位老师,我的程序如下,问题出现在当全局变量#define N 100000以上时总是报错,我想算更大,这问题怎么解决呢?报错:Unhandled exception at 0x002816a2 in Percolation.exe: 0xC0000005: Access violation reading location 0xccccccd4.我用的是VS 2010编译。谢谢!
程序代码:
#include< stdio.h > #include< math.h > #include< malloc.h > #include< stdlib.h > #include< time.h > #define LEN_np sizeof( struct np ) #define LEN_node sizeof( struct node ) #define LEN_np_kind sizeof( struct np_kind ) #define LEN_node_set sizeof( struct node_set ) #define alpha 0 //参数 alpha #define N 100000 //系统规模 #define r 2 * N //加的变数目 long extern npmax = 1; //节点信息 struct node{ long node_index; long node_size;//集团规模 long color; struct node *node_next; }; //集团类数目信息 struct np{ long np_size;//npi long ng_size;//ngi struct np *np_next; }; struct node_set{ long node_ind; struct node_set *node_set_next; }; //集团信息 struct np_kind { long np_color; //集团编号 struct node_set *node_set_point; //节点编号集合 struct np_kind * np_kind_next; }; void main( ) { int startt,finishh; struct node *Adj[ N ]; struct np *NP, *head_NP, *break_NP; struct np_kind *Information, *Information_temp, *Information_last, *head_Information; struct node_set *node_set_temp; int i, k;//i在初始化邻接矩阵时用,j在初始化NP时用, k在添边时使用 long *Select( long *select_node, struct np *NP, struct node *A[ N ] );//声明选点函数 struct np_kind *Update_Information( struct np_kind * head_Information, struct node*Adj[],long *edge_point );//声明更新Information函数 long Update_Adj( struct node *Adj[ ], struct np_kind *head_Information, long *edge_point ); //更新Adj struct np* Update_NP( struct node *Adj[ ], struct np *head_NP, long *edge_point ); //更新NP long break_condition;//跳出循环 long edge[ 2 ];//保存被选择的点 long *edge_point; long node_size_temp; //新生成的集团的规模 edge[ 0 ] = 0; edge[ 1 ] = 0; srand( ( unsigned )time( NULL ) ); //初始化随机数发生器种子 startt = clock();/////////////////////////////////////////////////////时间起点 //开辟链表并初始化邻接矩阵 for( i = 0; i < N; i++ ) { Adj[ i ] = ( struct node* )malloc( LEN_node ); Adj[ i ] -> node_index = i + 1; Adj[ i ] -> node_size = 1; Adj[ i ] -> color = i + 1; Adj[ i ] -> node_next = NULL; Information_temp = ( struct np_kind* )malloc( LEN_np_kind ); node_set_temp = ( struct node_set* )malloc( LEN_node_set ); node_set_temp -> node_ind = i + 1; node_set_temp -> node_set_next = NULL; Information_temp -> np_color = i + 1; Information_temp -> node_set_point = node_set_temp; Information_temp -> np_kind_next = NULL; if ( i == 0 ) { Information = Information_temp; } else { Information_last -> np_kind_next = Information_temp; } Information_last = Information_temp; } head_Information = Information; //初始化NP NP =( struct np* )malloc( LEN_np ); NP -> np_size = 1; NP -> ng_size = N; NP -> np_next = NULL; head_NP = NP; break_condition = 0; for ( k = 0; k < r; k ++ ) { edge_point = Select( edge, head_NP, Adj ); //测试edge_point //printf( "final selected nodes indexes are: %d\t%d\n",edge_point[ 0 ], edge_point[ 1 ] ); //测试edge_point //更新NP,Information if( Adj[ edge_point[ 0 ] ] -> color != Adj[ edge_point[ 1 ] ] -> color ) { //更新Information head_Information = Update_Information( head_Information, Adj,edge_point ); head_NP = Update_NP( Adj, head_NP, edge_point ); //更新NP } /*//测试Information test_head_Information = head_Information; printf("the Information is:\n"); while( test_head_Information -> np_kind_next != NULL ) { node_set_temp = test_head_Information -> node_set_point; printf( "the np_color is: %d\t", test_head_Information -> np_color ); printf( "the node_ind is: \t"); system( "pause" ); while( node_set_temp -> node_set_next != NULL ) { printf( "%d\t",node_set_temp-> node_ind); system( "pause" ); node_set_temp = node_set_temp -> node_set_next; } printf( "%d\t",node_set_temp-> node_ind); printf( "\n"); system( "pause" ); test_head_Information =test_head_Information -> np_kind_next ; } node_set_temp = test_head_Information -> node_set_point; printf( "the np_color is: %d\t", test_head_Information -> np_color ); system( "pause" ); printf( "the node_ind is: \t"); while( node_set_temp -> node_set_next!= NULL ) { printf( "%d\t",node_set_temp->node_ind); system( "pause" ); node_set_temp = node_set_temp -> node_set_next; } printf( "%d\t",node_set_temp->node_ind); printf( "\n"); system("pause");//测试Information //测试NP test_head_NP = head_NP; printf("the NP is:\n" ); printf("np_size \t ng_size \t \n" ); while( test_head_NP -> np_next != NULL ) { printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); test_head_NP =test_head_NP -> np_next; } printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); system("pause"); //测试NP */ //更新Adj node_size_temp = Update_Adj( Adj,head_Information, edge_point); //更新Adj /* //测试Adj printf(" The Adj is:\n"); for( i = 0; i < N; i ++ ) { test_Adj = Adj[ i ]; printf(" %d-th node adject's information is : \n", i ); printf("node_index \t color \t node_size \n"); while( test_Adj -> node_next != NULL ) { printf("%d \t %d \t %d\n", test_Adj -> node_index, test_Adj -> color,test_Adj -> node_size ); test_Adj = test_Adj -> node_next ; } printf("%d \t %d \t %d\n", test_Adj -> node_index, test_Adj -> color,test_Adj -> node_size ); } system("pause"); //测试Adj */ if( ( node_size_temp > npmax ) || ( node_size_temp == npmax ) ) { npmax = node_size_temp; } printf( "the npmax is:%d\n", npmax ); //system( "pause" ); //结束循环,即停止加边 break_NP = head_NP; break_condition = 0; while( break_NP -> np_next != NULL ) { break_condition = break_condition + break_NP -> ng_size; break_NP = break_NP -> np_next; } break_condition = break_condition + break_NP -> ng_size; if ( break_condition == 1 ) break; //system("pause"); } finishh = clock(); printf( " time is: %f", finishh - startt ); system( "pause" ); }; //选点函数 long *Select( long *select_node, struct np* head_NP , struct node *A[ ]) { double Get_random( ); long Node_position( double rand_value, struct np *head_NP, struct node * A[ ], int i_order, int node_index1 ); double rand_value; //选择两个点 int i;///////////////////////////////////////////// for ( i = 0; i < 2; i ++ ) { rand_value = Get_random( ); if( i == 0) { /*printf( "the first rand_value is: %f\n",rand_value ); system( "pause" );*/ select_node[ i ] = Node_position( rand_value, head_NP, A, 0, 0 ); //printf( "the first node is: %d\n",select_node[ i ] );//测试 } if( i == 1 ) { /*printf( "\nthe second rand_value is: %f\n",rand_value ); system( "pause" );*/ select_node[ i ] = Node_position( rand_value,head_NP, A, 1, select_node[ 0 ] ); //printf( "\nthe second node is: %d\n",select_node[ i ] );//测试 } } return ( select_node ); } //产生随机数的函数 double Get_random( ) { double rand_value; rand_value = rand()/(double)(RAND_MAX); return( rand_value ); } //确定被选择的节点的标号 long Node_position( double rand_value, struct np *head_NP, struct node *A[ ], int i_order, int node_index1 ) { struct np *temp1,*temp2;//分别在计算集团种类的平均值,几率归一化因子时使用; struct node *temp3; int i, k, m; //i统计集团种类,k判断节点编号,m用来初始化A_temp double x, temp_x, sum_position, normalization_temp, normalization_temp_x, normalization2;//normalization,x在计算几率归一化时使用,sum_Np在计算集团种类的平均值时使用, static double sum_Np, normalization; //sum_position在确定节点的位置时使用 long A_temp[ N ]; if ( i_order == 0 ) { //计算集团种类的平均值 temp1 = head_NP; sum_Np = 0; i = 0; while( temp1 -> np_next != NULL ) { sum_Np = sum_Np + temp1 -> np_size; i = i + 1; temp1 = temp1 -> np_next; } i = i + 1; sum_Np = sum_Np + temp1 -> np_size; sum_Np = sum_Np / i; sum_Np = sum_Np / npmax; //计算归一化系数 temp2 = head_NP; normalization = 0; while( temp2 -> np_next != NULL ) { x = ( double )temp2 -> np_size / ( double ) npmax; temp_x = -( double )alpha * ( x - sum_Np ) * ( x - sum_Np ); normalization = normalization + x * exp( temp_x ) * temp2 -> ng_size; temp2 = temp2 -> np_next; } x = ( double )temp2 -> np_size / ( double )npmax; temp_x = -( double )alpha * ( x - sum_Np ) * ( x - sum_Np ); normalization = normalization + x * exp( temp_x ) * temp2 -> ng_size; //确定节点的位置 sum_position = 0; for( k = 0; k < N; k ++ ) { x = ( double )A[ k ] -> node_size / ( double )npmax; temp_x = -alpha * ( x - sum_Np ) * ( x - sum_Np ); sum_position = sum_position + ( double )1 / ( double )npmax *exp( temp_x ) / normalization; if ( ( sum_position > rand_value) || ( sum_position == rand_value ) ) break; } } else //选择第二个点 { //初始化A_temp矩阵 for ( m = 0; m < N; m ++ ) { A_temp[ m ] = m + 1; } //找出已经存在连接关系的点并置0 temp3 = A[ node_index1 ]; normalization_temp = 0; while( temp3 -> node_next != NULL ) { A_temp[ ( temp3 -> node_index ) - 1 ] = 0; x = ( double )temp3 -> node_size / ( double )npmax; normalization_temp_x = -alpha * ( x - sum_Np ) * ( x - sum_Np ); normalization_temp = normalization_temp + ( double )1 / npmax *exp( normalization_temp_x ); temp3 = temp3 -> node_next; } A_temp[ temp3 -> node_index - 1 ] = 0; x = ( double )temp3 -> node_size / ( double )npmax; normalization_temp_x = -( double )alpha * ( x - sum_Np ) * ( x - sum_Np ); normalization_temp = normalization_temp + ( double )1 / npmax *exp( normalization_temp_x ); normalization2 = normalization - normalization_temp; /*//测试A_temp printf(" A_temp are:"); for( m = 0; m < N; m ++ ) printf(" %d\t", A_temp[ m ]); //测试A_temp*/ //确定节点的位置 sum_position = 0; for( k = 0; k < N; k ++ ) { if( A_temp[ k ] == 0 ) continue; else { x = ( double )A[ k ] -> node_size / ( double )npmax; temp_x = -( double )alpha * ( x - sum_Np ) * ( x - sum_Np ); sum_position = sum_position + ( double )1 / npmax *exp( temp_x ) / normalization2; if ( ( sum_position > rand_value) || ( sum_position == rand_value ) ) break; } } } return( k ); } //更新Information struct np_kind *Update_Information( struct np_kind * head_Information, struct node*Adj[],long *edge_point ) { struct node *p1, *p2; struct node_set *node_set_temp1, *node_set_temp3, *node_set_temp4; long color_temp; struct np_kind *Information_temp,*Information_temp1, *Information_before; p1 = Adj[ edge_point[ 0 ] ]; p2 = Adj[ edge_point[ 1 ] ]; Information_temp = head_Information; if( ( p1 -> color > p2 -> color ) ) { color_temp = p2 -> color; while( Information_temp -> np_kind_next != NULL ) //先找到颜色标号大的集团位置 { if( Information_temp -> np_color == p1 -> color ) break; Information_before = Information_temp; Information_temp = Information_temp -> np_kind_next; } Information_temp1 = head_Information;//找到颜色标号小的位置 while( Information_temp1 -> np_kind_next != NULL ) { if( Information_temp1 -> np_color == p2 -> color ) break; Information_temp1 = Information_temp1 -> np_kind_next; } node_set_temp1 = Information_temp -> node_set_point; node_set_temp4 = Information_temp1 -> node_set_point; while( node_set_temp4 -> node_set_next != NULL ) { node_set_temp4 = node_set_temp4 -> node_set_next; } while( node_set_temp1 -> node_set_next != NULL) { node_set_temp3 = ( struct node_set* )malloc( LEN_node_set ); node_set_temp3 -> node_ind = node_set_temp1 -> node_ind; node_set_temp3 -> node_set_next = NULL; node_set_temp4 -> node_set_next = node_set_temp3; node_set_temp4 = node_set_temp3; node_set_temp1 = node_set_temp1 -> node_set_next; } node_set_temp3 = ( struct node_set* )malloc( LEN_node_set ); node_set_temp3 -> node_ind = node_set_temp1 -> node_ind; node_set_temp3 -> node_set_next = NULL; node_set_temp4 -> node_set_next = node_set_temp3; //删除颜色大集团的节点 Information_before -> np_kind_next = Information_temp -> np_kind_next; } if( ( p1 -> color < p2 -> color ) ) { color_temp = p1 -> color; while( Information_temp -> np_kind_next != NULL) //先找到颜色标号大的集团位置 { if( Information_temp -> np_color == p2 -> color ) break; Information_before = Information_temp; Information_temp = Information_temp -> np_kind_next; } Information_temp1 = head_Information;//找到颜色标号小的位置 while( Information_temp1 -> np_kind_next != NULL ) { if( Information_temp1 -> np_color == p1 -> color ) break; Information_temp1 = Information_temp1 -> np_kind_next; } node_set_temp1 = Information_temp -> node_set_point; node_set_temp4 = Information_temp1 -> node_set_point; while( node_set_temp4 -> node_set_next != NULL ) { node_set_temp4 = node_set_temp4 -> node_set_next; } while( node_set_temp1 -> node_set_next != NULL) { node_set_temp3 = ( struct node_set* )malloc( LEN_node_set ); node_set_temp3 -> node_ind = node_set_temp1 -> node_ind; node_set_temp3 -> node_set_next = NULL; node_set_temp4 -> node_set_next = node_set_temp3; node_set_temp4 = node_set_temp3; node_set_temp1 = node_set_temp1 -> node_set_next; } node_set_temp3 = ( struct node_set* )malloc( LEN_node_set ); node_set_temp3 -> node_ind = node_set_temp1 -> node_ind; node_set_temp3 -> node_set_next = NULL; node_set_temp4 -> node_set_next = node_set_temp3; //删除颜色大集团的节点 Information_before -> np_kind_next = Information_temp -> np_kind_next; } return( head_Information ); } //更新NP struct np* Update_NP( struct node *Adj[ ], struct np *head_NP, long *edge_point ) //更新NP { struct node *p1, *p2; struct np *temp_head_NP, *temp1_head_NP, *temp2_head_NP, *temp3_head_NP, *temp4_head_NP, *temp5_head_NP; int isexist; long temp_np_size; p1 = Adj[ edge_point[ 0 ] ]; p2 = Adj[ edge_point[ 1 ] ]; temp_np_size = p1 -> node_size + p2 -> node_size; //先操作新生成的集团 temp_head_NP = head_NP; isexist = 0; while( temp_head_NP -> np_next != NULL ) { if( temp_head_NP -> np_size == temp_np_size ) { isexist = 1; break; } temp_head_NP = temp_head_NP -> np_next; } if( temp_head_NP -> np_size == temp_np_size ) { isexist = 1; } //printf( "isexist is :%d", isexist ); //system("pause"); if ( isexist == 0 ) //说明是新生成的集团类型 { temp1_head_NP = ( struct np* )malloc( LEN_np ); temp1_head_NP -> np_size = temp_np_size; temp1_head_NP -> ng_size = 1; temp1_head_NP -> np_next = NULL; temp_head_NP -> np_next = temp1_head_NP; /* //测试NP test_head_NP = head_NP; printf("the NP----->>>>isexist == 0 is:\n" ); printf("np_size \t ng_size \t \n" ); while( test_head_NP -> np_next != NULL ) { printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); test_head_NP =test_head_NP -> np_next; } printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); system("pause"); //测试NP */ } if( isexist == 1 )//说明是已经存在的集团 { temp_head_NP -> ng_size = temp_head_NP-> ng_size + 1; } //开始选择被选择的集团 //第一个集团 temp2_head_NP = head_NP; if ( ( temp2_head_NP -> np_size == p1 -> node_size ) && ( ( temp2_head_NP -> ng_size - 1 ) == 0) ) { head_NP = temp2_head_NP -> np_next; } else { while( temp2_head_NP -> np_size != p1 -> node_size ) { temp3_head_NP = temp2_head_NP; temp2_head_NP = temp2_head_NP -> np_next; } temp2_head_NP -> ng_size = temp2_head_NP -> ng_size - 1; if( temp2_head_NP -> ng_size == 0 ) { temp3_head_NP -> np_next = temp2_head_NP -> np_next; } } /*//测试NP test_head_NP = head_NP; printf("the NPppppppp is:\n" ); printf("np_size \t ng_size \t \n" ); while( test_head_NP -> np_next != NULL ) { printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); test_head_NP =test_head_NP -> np_next; } printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); system("pause"); //测试NP */ //第二个集团 temp4_head_NP = head_NP; if ( ( temp4_head_NP -> np_size == p2 -> node_size ) && ( 0 == temp4_head_NP -> ng_size - 1)) { head_NP = temp4_head_NP -> np_next; } else { while( temp4_head_NP -> np_size != p2 -> node_size ) { temp5_head_NP = temp4_head_NP; temp4_head_NP = temp4_head_NP -> np_next; } temp4_head_NP -> ng_size = temp4_head_NP -> ng_size - 1; if( temp4_head_NP -> ng_size == 0 ) { temp5_head_NP -> np_next = temp4_head_NP -> np_next; } } /*test_head_NP = head_NP; printf("the NPnnnnnnnnnnnnn is:\n" ); printf("np_size \t ng_size \t \n" ); while( test_head_NP -> np_next != NULL ) { printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); test_head_NP =test_head_NP -> np_next; } printf(" %d \t %d \t \n" ,test_head_NP -> np_size, test_head_NP -> ng_size ); system("pause"); */ return( head_NP ); } ///更新Adj long Update_Adj( struct node *Adj[ ], struct np_kind *head_Information, long *edge_point ) { struct node *p1, *p2, *p3, *p4, *p5; struct np_kind *temp_Information; struct node_set *temp_node_set; long node_size_temp, color_temp; p1 = Adj[ edge_point[ 0 ] ]; p2 = Adj[ edge_point[ 1 ] ]; // 更新Adj p3 = ( struct node* ) malloc( LEN_node ); p3 -> node_index = p2-> node_index; p3 -> node_size = p2 -> node_size; p3 -> color = p2 -> color; p3 -> node_next = NULL; p4 = ( struct node* ) malloc( LEN_node ); p4 -> node_index = p1 -> node_index; p4 -> node_size = p1 -> node_size; p4 -> color = p1 -> color; p4 -> node_next = NULL; while( p1 -> node_next != NULL ) { p1 = p1 -> node_next; } p1 -> node_next = p3; while( p2 -> node_next != NULL ) { p2 = p2 -> node_next; } p2 -> node_next = p4; p1 = Adj[ edge_point[ 0 ] ]; p2 = Adj[ edge_point[ 1 ] ]; node_size_temp = npmax; if( p1 -> color != p2 -> color ) //集团之间加边 { node_size_temp = p1 -> node_size + p2 -> node_size; if( ( p1 -> color > p2 -> color ) || ( p1 ->color == p2 -> color ) ) { color_temp = p2 -> color; } else { color_temp = p1 -> color; } temp_Information = head_Information; while( temp_Information -> np_color != color_temp )//找出颜色标号小的集团在Informatiom中的位置 { temp_Information = temp_Information -> np_kind_next; } temp_node_set = temp_Information -> node_set_point; while( temp_node_set -> node_set_next != NULL )//找出颜色标号小的集团中节点标号的最后位置 { p5 = Adj[ temp_node_set -> node_ind - 1 ]; while( p5 -> node_next != NULL ) { p5 -> color = color_temp; p5 -> node_size = node_size_temp; p5 = p5 -> node_next; } p5 -> color = color_temp; p5 -> node_size = node_size_temp; temp_node_set = temp_node_set -> node_set_next; } p5 = Adj[ temp_node_set -> node_ind - 1 ]; while( p5 -> node_next != NULL ) { p5 -> color = color_temp; p5 -> node_size = node_size_temp; p5 = p5 -> node_next; } p5 -> color = color_temp; p5 -> node_size = node_size_temp; } return( node_size_temp ); }