#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);
printf("Vertex =>",(headNode+i)->vertexValue);
#2
我刚才在终端里试了一下,发现提示错误是bus error,但是没有告诉我是哪里错误,急死我了,我现在知道是在这个地方
if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???
if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???
#3
为什么啊??
#4
while (!ConnectedGraph())
{
headNode=0; // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了
{
headNode=0; // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了
#5
应该有个%d吧。
printf("Vertex => %d ",(headNode+i)->vertexValue);
#6
朋友,那可是我在EdgeExist函数的第一行是加了个输出,为什么这行也不执行?那我的问题是出在headNode=0这里??
#7
把你的checkpoint4加个\n再试试
printf("checkpoint4\n");
printf("checkpoint4\n");
#8
哇噻,朋友,真是谢谢你啊,好歹现在输出个checkpoint4了,但是我还是不知到我哪错了。。。。能否指点一下啊?
#9
首先是headNode=0
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址
至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址
至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来
#10
帮顶
#11
是不是我那个headNode我给赋了个空的,然后后头就都错了?
#12
main里给headNode分配了空间,本来是好好的,为啥要给它置0?
#13
对对,但是是这样的,要求是在while(!ConnectedGraph)判断后,如果不是ConnectedGraph的话,需要清空所有的边,关键是我不知到该怎么表示,所有就用了个headNode=0,那该怎么改啊?
#14
这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
恐怕帮不了你了,抱歉。
恐怕帮不了你了,抱歉。
#15
没关系,我再想想,我再改改,有其它的错误再发上来和大家讨论,再次感谢,我找了半天让你一说就明白了。
#16
其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。
#17
我用的是xcode,不太会设置breakpoint,完了我去查查。:)
#1
这里好像有点小问题
printf("Vertex =>",(headNode+i)->vertexValue);
printf("Vertex =>",(headNode+i)->vertexValue);
#2
我刚才在终端里试了一下,发现提示错误是bus error,但是没有告诉我是哪里错误,急死我了,我现在知道是在这个地方
if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???
if ((u!=v) && !EdgeExist(u,v)) 卡住了,EdgeExist()里面第一行我加了个输出,发现这个方法就是不执行,为什么啊???
#3
为什么啊??
#4
while (!ConnectedGraph())
{
headNode=0; // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了
{
headNode=0; // 注意这里
然后继续执行,进入EdgeExist函数的时候,马上就访问了(headNode+head2)->nextNode,于是就出错了
#5
应该有个%d吧。
printf("Vertex => %d ",(headNode+i)->vertexValue);
#6
朋友,那可是我在EdgeExist函数的第一行是加了个输出,为什么这行也不执行?那我的问题是出在headNode=0这里??
#7
把你的checkpoint4加个\n再试试
printf("checkpoint4\n");
printf("checkpoint4\n");
#8
哇噻,朋友,真是谢谢你啊,好歹现在输出个checkpoint4了,但是我还是不知到我哪错了。。。。能否指点一下啊?
#9
首先是headNode=0
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址
至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来
然后进入EdgeExist函数
然后执行了printf("checkpoint4");
然后访问(headNode+head2)->nextNode; 在这里挂了,因为(headNode+head2)这是个非法地址
至于那个printf,确实是执行了,但是它把要打印的内容放到了缓冲区里,还没来得及打印到显示器,程序就挂了。
加个\n的作用就是把缓冲区里的内容都打出来
#10
帮顶
#11
是不是我那个headNode我给赋了个空的,然后后头就都错了?
#12
main里给headNode分配了空间,本来是好好的,为啥要给它置0?
#13
对对,但是是这样的,要求是在while(!ConnectedGraph)判断后,如果不是ConnectedGraph的话,需要清空所有的边,关键是我不知到该怎么表示,所有就用了个headNode=0,那该怎么改啊?
#14
这个程序太复杂了,而且我不太懂数据结构,看不明白该怎么改。
恐怕帮不了你了,抱歉。
恐怕帮不了你了,抱歉。
#15
没关系,我再想想,我再改改,有其它的错误再发上来和大家讨论,再次感谢,我找了半天让你一说就明白了。
#16
其实楼主已经把问题定位到一个很小的范围了,我在这个基础上稍微一调试就找出问题了。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。
用很多printf来调试,有时候也算是个办法,但是使用调试器、设置断点、单步执行,会更快更方便。
不知道楼主用的什么编译环境,建议你看看它的手册、帮助,或者上网看看它的调试器怎么用。
#17
我用的是xcode,不太会设置breakpoint,完了我去查查。:)