求解决我这个程序为什么有问题呢 这个程序想求原子距离

#include
#include
double f(double a);
double *distance(double *p,double a,double x);
int main()
{
int g,i,j,k,s,w;
int r[5];
double a,b,c,x,y,z,*p,*m,*n,*l,*o,*q,*ss;
double d[5];
printf("Hello! This is a C program.\n");
printf("本程序是完成建立晶体模型及晶体原子间近邻统计功能\n");
do
{
printf("请先输入1建立晶体模型:\n");
scanf("%d",&s);
switch(s)
{
case 1:printf("请输入晶体结构模型的大小:\n");
scanf("%lf%lf%lf",&a,&b,&c);
p=f(a);
m=f(b);
n=f(c);
printf("请选择是否输出原子的坐标值:\n(1代表是,0代表否)");
scanf("%d",&g);
if(g)
{
for(i=0;i<(2*a+1);i++)
for(j=0;j<(2*b+1);j++)
for(k=0;k<(2*c+1);k++)
printf("(%.2f,%.2f,%.2f)\t",
(p+i),*(m+j),*(n+k));
}
break;
case 0:puts("退出!");break;
default:printf("输入错误请重新输入");
}
printf("\n\n请输入2完成原子间紧邻统计\n");
scanf("%d",&s);
switch(s)
{
case 2:printf("请输入晶体内某一原子坐标(坐标保留两位小数)\n");
scanf("%lf%lf%lf",&x,&y,&z);
l=distance(p,a,x);
o=distance(m,b,y);
q=distance(n,c,z);
g=0;
for(i=0;i<(2*a+1);i++)
for(j=0;j<(2*b+1);j++)
for(k=0;k<(2*c+1);k++)
{
(ss+g)=sqrt((l+i)+*(o+i)+*(q+i));
printf("%.2f\t",*(ss+g));
g++;
}
d[0]=*(ss+0);
i=1;
for(j=1;i<5;j++)
{
if(*(ss+j)!=*(ss+j-1))
{
d[i]=*(ss+j);
i++;
}
}
i=0,j=0;
while(i<5)
{
s=0;
if(d[j]=d[j+1])
{
s++;
j++;
}
else
{
r[i]=s;
i++;
}
}

printf("\n\n请输入3完成原子间紧邻距离统计\n");
printf("\n\n请输入4完成原子间紧邻距离及该临近原子数目统计\n");
scanf("%d",&s);
switch(s)
{
case 3:printf("原子间紧邻距离分别为:\n");
for(i=0;i<5;i++)
printf("%4d",d[i]);
break;
case 4:printf("原子间紧邻距离及该临近原子数目分别为:\n");
for(i=0;i<5;i++)
printf("原子距离:%f\t原子数目:%d\n",d[i],r[i]);
break;
case 0:puts("退出!");break;
default:printf("输入错误请重新输入");
} break;
case 0:puts("退出!");break;
default:printf("输入错误请重新输入");

}
}while(s);

}
double f(double a)
{
int i;
double *p;
*(p+0)=0;
for(i=1;i<(2*a+1);i++)
*(p+i)=
(p+i-1)+0.5;
return p;

}
double distance(double *p,double a,double x)
{
double *l;
int h=0;
int i;
for(i=0;i<(2*a+1);i++)
{
*(l+h)=pow((
(p+i)-x),2);
h++;
}
return l;
}

double f(double a)
{
int i;
double *p;
*(p+0)=0; //指针无效,p=&a;或者为p分配一个空间
for(i=1;i<(2*a+1);i++)
*(p+i)=(p+i-1)+0.5;
return p;//返回指针与函数类型double不一致

}
不了解程序功能,无法进一步建议。

这个返回的指针格式是double啊 为什么说格式不一样