一道老谭的题,遇到了特殊情况
#include <stdio.h>
int exchange(int a[],int n)
{
int *p0,*p1,max,min;
int temp1,j,temp2;
p0=p1=a;
max=min=a[0];
for(j=1;j<n;j++)
{
if(min>a[j])
{
min=a[j];
p0=&a[j];
}
else if(max<a[j])
{
max=a[j];
p1=&a[j];
}
}
temp1=*p0;
*p0=*(a+0);
*(a+0)=temp1;
temp2=*p1;
*p1=a[4];
a[4]=temp2;
return 0;
}
int main(int argc, char *argv[])
{
int a[5]={98,5,77,65,1},i,*r;
/*
for(i=0;i<5;i++)
{
scanf("%d,",&a[i]);
}
*/
exchange(a,5);
for(i=0,r=a;i<5;i++,r++)
printf("%d\n",a[i]);
return 0;
}输出原数组还是没有变化,是最大的数和最后的数交换,最小的数和第一个数交换,其他不动!
[解决办法]
- C/C++ code
#include <stdio.h>#define N 5void print_ia(const char *msg, int *ia, int len){ printf("%s\n", msg); for (int i = 0; i < len; i++) { printf("%d\t", *(ia+i)); } putchar('\n');}void spc_swap(int *ia, int len){ int max, min; max = min = *ia; for (int i = 0; i < len; i++) { if (ia[i] > max) max = ia[i]; if (ia[i] < min) min = ia[i]; } ia[0] = min; ia[len-1] = max;}int main(){ int ia[N] = {5,2,3,4,1}; print_ia("origin:", ia, N); spc_swap(ia, N); print_ia("changed:", ia, N); return 0;}