指针问题,思考了很久,不知道哪里错了
//程序功能是将输入的5阶行列式中最大的数字放在中间,按照从上到下,从左到右的顺序,四个角分别放最小,第二小,第三小,第四小的值;#include <stdio.h>
void main()
{
void sort(int (*p)[5]);
int a[5][5], i, j;
printf("please input 5*5 array: \n");
for(i = 0; i < 5; i++) //一个一个输入行列式的每一个值;
{
for(j = 0; j < 5; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("\nThe 5*5 array is: \n"); //将行列式打印出来;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("\nNow they are: \n");
sort(a); //调用sort函数
printf("\n");
}
void sort(int (*p)[5])
{
int i, j, temp;
int *Max, *Min;
Max = p; //将行列式第一个地址赋给Max,赋给Min
Min = p;
for(i = 0; i < 5; i++) //找出最大值地址;
{
for(j = 0; j < 5; j++)
{
if(*Max < *(*(p + i) + j))
{
Max = *(p + i) + j;
}
if(*Min > *(*(p + i) + j)) //找出最小值地址;
{
Min = *(p + i) + j;
}
}
}
temp = *(*(p + 2) + 2); //最大值与中间值交换;
*(*(p + 2) + 2) = *Max;
*Max = temp;
temp = *Min; //最小值与第一行第一列的值交换;
*Min = p[0][0];
p[0][0] = temp;
Min = p + 1;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
if(*(*(p + i) + j) != p[0][0]) && (*Min > *(*(p + i) + j))) //判断条件为循环值不等于最小值,且大于*Min;
{
Min = *(p + i) + j; //找出第二小值地址;
}
}
}
temp = *Min; //将第二小值与第一行第五列值交换;
*Min = p[0][4];
p[0][4] = temp;
Min = p + 1;
for(i = 0; i < 5; i++) //找出第三小值;
{
for(j = 0; j < 5; j++)
{
if(*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*Min > *(*(p + i) + j)))
{
Min = *(p + i) + j;
}
}
}
temp = *Min; //第三小值与第五行第一列值交换;
*Min = p[4][0];
p[4][0] = temp;
Min = p + 1; //找出第四小值地址;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
if((*(*(p + i) + j) != p[0][0]) && (*(*(p + i) + j) != p[0][4]) && (*(*(p + i) + j) != p[4][0]) && (*Min > *(*(p + i) + j)))
{
Min = *(p + i) + j;
}
}
}
temp = *Min; //第四小值与第五行第五列值交换;
*Min = *(*(p + 4) + 4);
*(*(p + 4) + 4) = temp;
for(i = 0; i < 5 ; i++) //打印交换过后的行列式;
{
for(j = 0; j < 5; j++)
{
printf("%4d", *(*(p + i) + j));
}
printf("\n");
}
}