C中Quick Union实现中的分段错误(核心转储)

#include #include int *id,N; main() { FILE* file=fopen("a.txt","r"); int i,p,q,c; fscanf(file,"%d",&N); id=(int *)malloc(N*sizeof(int)); for(i=0;i<N;i++) *(id+i)=i; while(!feof(file)) { fscanf(file,"%d %d",&p,&q); if(!connected(p,q)) unn(p,q); } fclose(file); c=1; while(c==1) { scanf("%d %d",&p,&q); printf("%d\nYes(1) or No(0) ",connected(p,q)); scanf("%d",&c); } } connected(int p,int q) { return((root(p))==(root(q))); } unn(int p,int q) { int j=root(q); int i=root(p); *(id+j)=i; } root(int i) { while(i!=(*(id+i))) i=*(id+i); return(i); } 

在编译时,不会显示任何错误消息。 但是,当我尝试执行此程序时,它会显示“分段错误(核心转储)。为什么会发生这种情况?”可能已经注意到,这是尝试实现快速联合。

快速查找是在没有任何麻烦的情况下使用相同的文件“a.txt”实现的,只需对此代码进行一些调整。 *是或否是用户的查询。

我猜这是问题所在

 root(int i) { int p; while(p!=(*(id+p))) <-- p uninitialised p=*(id+p); return(p); } 

因为p未初始化,但您在指针取消引用中将其用作偏移量。 即使它不是它仍然是一个大问题的原因。

你已经编辑了这个问题

 root(int i) { int i; while(i!=(*(id+i))) i=*(id+i); return(i); } 

您在本地重新声明i变量以及作为函数参数传递的i变量。