思路: 分开处理,先找出最大数的位置,交换后,再找出最小数的位置,再交换。(思路:也可以同时找最大数和最小数的位置,但经过最小值和第一个数对换后,最大值的位置可能出现了变化,即如果说原来10个数最大值就在第一个位置,第一次交换后,最大数变成了最小值的位置,而不再是开始找到的最大值位置,因此要if判断讨论最大值是否为第一个数)
代码:
#include <stdio.h>
#define N 10
int main(){
void swap1(int *q);
int num[N],*p,*q=num;
printf("请输入%d个数:\n",N);
//num+i是数组元素num[i]的地址
for(p=num;p<(num+N);p++){
scanf("%d",p);
}
printf("您输入的数字为:\n");
//指针移动打印,for循环结束,指针已移动到末尾
for(p=num;p<(num+N);p++){
printf("%d ",*p);
}
p=num;
printf("\n-----------------------\n");
printf("\n-----------------------\n");
swap1(q);
return 0;
}
void swap1(int *q){
int *p1=q,*p2=q;
//可以在此处初始化min,但不能在此处初始化max,否则经过找最小值交换后,max的值未在num[0]处,不方便遍历
int min=*q,max,site1=0,site2=0,temp;
printf("初始值min=%d\n",min);
//找到最小值和它所在的位置
for(int i=0;i<N;i++,p1++){
if(*p1<min){
min=*p1;
site1=i;
}
}
printf("最小值所在位置为num[%d]\n",site1);
printf("最小值为%d\n",min);
//将最小值和第一个数对换
p1=q;
temp=*p1;//temp=num[0];
*p1=min;//num[0]=min;
*(p1+site1)=temp;//num[site1]=temp;
//检查交换结果
printf("交换结果为:\n");
for(p1=q;p1<(q+N);p1++){
printf("%d ",*p1);
}
printf("\n-----------------------\n");
max=*q;
printf("初始值max=%d\n",max);
for(int i=0;i<N;i++,p2++){
if(*p2>max){
max=*p2;
site2=i;
}
}
printf("最大值所在位置为num[%d]\n",site2);
printf("最大值为%d\n",max);
p2=q;
temp=*(p2+(N-1));
*(p2+(N-1))=max;
*(p2+site2)=temp;
//检查交换结果
printf("交换结果为:\n");
for(p2=q;p2<(q+N);p2++){
printf("%d ",*p2);
}
}
运行结果: