新手求助,请问一下我的代码哪里有问题??我找了一晚上,发现了个奇怪的问题!!

时间:2021-12-03 15:21:15
在我的机子上,这个编译通过,但是运行是,发现在Generate_graph()方法中调用EdgeExist()方法判断是否已经创建过边的时候,EdgeExist()方法调用不了!!一运行到那里就卡住,我不知到是为什么。。。。我是新手,请高手赐教!!!

#include <stdio.h>

// The following section is to define the node's structure of the adjacency list.
struct node{ 
  int vertexValue;  //The value of a vertex.
  int weight;  //The weight of an edge.
  struct node *nextNode;   // Point to the next node of the adjacency list.
};     

typedef struct node *graph;
struct node *headNode; 

int *vertexSetRecord;
int NoOfNodes;

void UnionSet(int head,int tail)
{
   int tailSetRepreVertex;

   tailSetRepreVertex = tail;                  
   while ( *(vertexSetRecord+tailSetRepreVertex) > 0 )
      tailSetRepreVertex = *(vertexSetRecord+tailSetRepreVertex);
   *(vertexSetRecord+tailSetRepreVertex) = head;          
}

int SameSet(int head,int tail)
{
   int headSetRepreVertex;  
   int tailSetRepreVertex;    

   headSetRepreVertex = head;              
   while ( *(vertexSetRecord+headSetRepreVertex) > 0 )
      headSetRepreVertex = *(vertexSetRecord+headSetRepreVertex);
   tailSetRepreVertex = tail;                  
   while ( *(vertexSetRecord+tailSetRepreVertex) > 0 )
      tailSetRepreVertex = *(vertexSetRecord+tailSetRepreVertex);
   if ( headSetRepreVertex == tailSetRepreVertex )    
      return 1;
   else
      return 0;
}

int ConnectedGraph(){
   int i;
   int record=0;
   //printf("%d\n",NoOfNodes);
   //printf("%d\n",record);
   for (i=0;i<NoOfNodes;i++){
      //printf("%d\n",NoOfNodes);
      //printf("%d\n",record);
      if(*(vertexSetRecord+i+1)==0)
  {
    record++;
//printf("%d",record);
  }
   }
   printf("%d\n",record);
   
   if (record>1){
      //printf("1111111");
  return 0;}
   else
      return 1;
}

int EdgeExist(int head2,int tail2){
    printf("checkpoint4");
graph tempNode;
tempNode = (headNode+head2)->nextNode;
printf("checkpoint6");

if (tempNode!=NULL && tempNode->vertexValue==tail2)
   return 1;
else 
   return 0;
}

void Generate_graph(int n,int M){
   int init_seed=2009;
   //int *NoOfNodes;
   int m;  // The number of the edges in the graph.
   int count;
   int u;  // u and v represent the two vertices of an edge.
   int v;
   int number_try=0;
   srand(init_seed);
   
   graph newNode;
   graph tempNode;
   
   while (!ConnectedGraph())
   {
       headNode=0;
   m=0;
   count=0;
   do {
      u=(rand() % n)+1;
  v=(rand() % n)+1;
  printf("%d u\n",u);
  printf("%d v\n",v);
      count++;
  printf("%d\n",count);
      printf("checkpoint3\n");
      if ((u!=v) && !EdgeExist(u,v))
  {
     printf("checkpoint5\n");
 newNode=(graph)malloc(sizeof(struct node));
 newNode->vertexValue=v;
 newNode->weight= rand() % 200+1;
 newNode->nextNode=NULL;
 tempNode=headNode+u;
 while (tempNode->nextNode!=NULL)
    tempNode=tempNode->nextNode;
 tempNode->nextNode=newNode;
 m++;
  }
  printf("checkpoint7\n");
   } while (count<M);
       number_try++;
   }
}

int main (void) {
int n=10,i,j;
int M=ceil(1.35*n*(log(n)/log(2)));
graph tempNode;
NoOfNodes=n;
headNode = ( graph ) malloc(sizeof(struct node)*(n+1));
vertexSetRecord = (int *) malloc(sizeof(int)*(n+1));
printf("checkpoint1\n");
for (i=1;i<=n;i++){
   (headNode+i)->vertexValue=i;
   (headNode+i)->weight=0;
   (headNode+i)->nextNode=NULL;
}
printf("checkpoint2\n");
for (j=1;j<=n;j++){
   *(vertexSetRecord+j)=0;
}

Generate_graph(n,M);

   printf("Print the graph:\n");
   
   for ( i = 1; i <= n; i++ )
   {
      printf("Vertex =>",(headNode+i)->vertexValue);
      tempNode = (headNode+i)->nextNode;           
      while ( tempNode != NULL )              
      {
         printf(" %d ",tempNode->vertexValue);     
         tempNode = tempNode->nextNode;            
      }
      printf("\n");                     
   }

return 0;
}

17 个解决方案

#1


这里好像有点小问题
      printf("Vertex =>",(headNode+i)->vertexValue);

#2


我刚才在终端里试了一下,发现提示错误是bus error,但是没有告诉我是哪里错误,急死我了,我现在知道是在这个地方
      if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???

#3


引用 1 楼 *mill 的回复:
这里好像有点小问题
       printf("Vertex =>",(headNode+i)->vertexValue);

为什么啊??

#4


  while (!ConnectedGraph())
  {
      headNode=0;  // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了

#5


引用 3 楼 pengpeng803 的回复:
引用 1 楼 *mill 的回复:
这里好像有点小问题
      printf("Vertex =>",(headNode+i)->vertexValue);


为什么啊??

应该有个%d吧。
printf("Vertex =>   %d ",(headNode+i)->vertexValue);

#6


引用 4 楼 *mill 的回复:
while (!ConnectedGraph())
   {
       headNode=0;  // 注意这里
 然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了

朋友,那可是我在EdgeExist函数的第一行是加了个输出,为什么这行也不执行?那我的问题是出在headNode=0这里??

#7


把你的checkpoint4加个\n再试试
printf("checkpoint4\n");

#8


引用 7 楼 *mill 的回复:
把你的checkpoint4加个\n再试试
 printf("checkpoint4\n");

哇噻,朋友,真是谢谢你啊,好歹现在输出个checkpoint4了,但是我还是不知到我哪错了。。。。能否指点一下啊?

#9


首先是headNode=0
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址

至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来

#10


帮顶

#11


是不是我那个headNode我给赋了个空的,然后后头就都错了?

#12


main里给headNode分配了空间,本来是好好的,为啥要给它置0?

#13


引用 12 楼 *mill 的回复:
main里给headNode分配了空间,本来是好好的,为啥要给它置0?

对对,但是是这样的,要求是在while(!ConnectedGraph)判断后,如果不是ConnectedGraph的话,需要清空所有的边,关键是我不知到该怎么表示,所有就用了个headNode=0,那该怎么改啊?

#14


这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
恐怕帮不了你了,抱歉。

#15


引用 14 楼 *mill 的回复:
这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
 恐怕帮不了你了,抱歉。

没关系,我再想想,我再改改,有其它的错误再发上来和大家讨论,再次感谢,我找了半天让你一说就明白了。

#16


其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。

#17


引用 16 楼 *mill 的回复:
其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
 用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
 不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。

我用的是xcode,不太会设置breakpoint,完了我去查查。:)

#1


这里好像有点小问题
      printf("Vertex =>",(headNode+i)->vertexValue);

#2


我刚才在终端里试了一下,发现提示错误是bus error,但是没有告诉我是哪里错误,急死我了,我现在知道是在这个地方
      if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???

#3


引用 1 楼 *mill 的回复:
这里好像有点小问题
       printf("Vertex =>",(headNode+i)->vertexValue);

为什么啊??

#4


  while (!ConnectedGraph())
  {
      headNode=0;  // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了

#5


引用 3 楼 pengpeng803 的回复:
引用 1 楼 *mill 的回复:
这里好像有点小问题
      printf("Vertex =>",(headNode+i)->vertexValue);


为什么啊??

应该有个%d吧。
printf("Vertex =>   %d ",(headNode+i)->vertexValue);

#6


引用 4 楼 *mill 的回复:
while (!ConnectedGraph())
   {
       headNode=0;  // 注意这里
 然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了

朋友,那可是我在EdgeExist函数的第一行是加了个输出,为什么这行也不执行?那我的问题是出在headNode=0这里??

#7


把你的checkpoint4加个\n再试试
printf("checkpoint4\n");

#8


引用 7 楼 *mill 的回复:
把你的checkpoint4加个\n再试试
 printf("checkpoint4\n");

哇噻,朋友,真是谢谢你啊,好歹现在输出个checkpoint4了,但是我还是不知到我哪错了。。。。能否指点一下啊?

#9


首先是headNode=0
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址

至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来

#10


帮顶

#11


是不是我那个headNode我给赋了个空的,然后后头就都错了?

#12


main里给headNode分配了空间,本来是好好的,为啥要给它置0?

#13


引用 12 楼 *mill 的回复:
main里给headNode分配了空间,本来是好好的,为啥要给它置0?

对对,但是是这样的,要求是在while(!ConnectedGraph)判断后,如果不是ConnectedGraph的话,需要清空所有的边,关键是我不知到该怎么表示,所有就用了个headNode=0,那该怎么改啊?

#14


这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
恐怕帮不了你了,抱歉。

#15


引用 14 楼 *mill 的回复:
这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
 恐怕帮不了你了,抱歉。

没关系,我再想想,我再改改,有其它的错误再发上来和大家讨论,再次感谢,我找了半天让你一说就明白了。

#16


其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。

#17


引用 16 楼 *mill 的回复:
其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
 用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
 不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。

我用的是xcode,不太会设置breakpoint,完了我去查查。:)