思路: 分开处理,先找出最大数的位置,交换后,再找出最小数的位置,再交换。(思路:也可以同时找最大数和最小数的位置,但经过最小值和第一个数对换后,最大值的位置可能出现了变化,即如果说原来10个数最大值就在第一个位置,第一次交换后,最大数变成了最小值的位置,而不再是开始找到的最大值位置,因此要if判断讨论最大值是否为第一个数)
代码:
#include#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=%dn",min); //找到最小值和它所在的位置 for(int i=0;i max){ max=*p2; site2=i; } } printf("最大值所在位置为num[%d]n",site2); printf("最大值为%dn",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); } }
运行结果:



