#include<stdio.h>
#include<stdlib.h>
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("%dnYes(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
变量。