#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
#define NUM_SIZE 10
int main()
{
int arrayInt[NUM_SIZE];
int int_Min=0,int_Max=0;
int array_0_value=0,array_size_value=0;
time_t t;
int *intPtrMax=arrayInt;
int *intPtrMin=arrayInt;
srand((unsigned)time(&t));
int i=0;
for(i=0;i<NUM_SIZE;i++)
{
scanf("%d",&arrayInt[i]);
getchar();
}
/*
int j=0;
for(j=0;j<10;j++)
{
for(i=0;i<NUM_SIZE-1;i++)
{
arrayInt[i]=rand()%100;
}
*/
printf("/n原始数据:");
for(i=0;i<NUM_SIZE;i++)
{
printf(" %d ",arrayInt[i]);
}
printf("/n");
//找到最大最小值,并将相应指针指向它们
for(i=1;i<NUM_SIZE;i++)
{
if(arrayInt[i]>*intPtrMax)intPtrMax=arrayInt+i;
else
{
if(arrayInt[i]<*intPtrMin)intPtrMin=arrayInt+i;
}
}
//交换数据,、有必要先把两个最值保存起来,否则出现差错,如可以对数组a10:1进行分析
//将数组第一个和最后一个、最小值最大值预存起来很有必要,虽然耗费空间,但能保证准确性和可读性!
//此intMinPtr.intMaxPtr指针只表示地址,由于最大值可能在数组第一个位置上,最小值可能在数组最后一个位置上,因而在
//进行交换的时候,数组第一个位置的值和最小值交换了,但此时intPtrMax仍然指向它,即指向了最小值,再进行最大值和最后一个位置的数组交换时,
//肯定会出错的
int_Min=*intPtrMin;
int_Max=*intPtrMax;
printf("Min:%d Max:%d",int_Min,int_Max);
//保存数组的首尾数据
array_0_value=arrayInt[0];
array_size_value=arrayInt[NUM_SIZE-1];
//第一个数据和最小值交换
*intPtrMin=array_0_value;
if(array_0_value==int_Max)intPtrMax=intPtrMin;//由于第一个数据可能是intPtrMax指向的,交换后,intPtrMax必须紧跟着最大值跑
arrayInt[0]=int_Min;
intPtrMin=&arrayInt[0];//intPtrMin紧跟着最小值跑
printf("/n最小值和第一个位置交换/n");
for(i=0;i<NUM_SIZE;i++)
{
printf(" %d ",arrayInt[i]);
}
if(*intPtrMax!=array_size_value)
{/*1*/
*intPtrMax=array_size_value;
arrayInt[NUM_SIZE-1]=int_Max;
printf("/n最大值和最后位置数据交换/n");
for(i=0;i<NUM_SIZE;i++)
{
printf(" %d ",arrayInt[i]);
}
}//end if /*1*/
printf("/n结果数据:");
for(i=0;i<NUM_SIZE;i++)
{
printf(" %d ",arrayInt[i]);
}
printf("/n");
Sleep(1000);
printf("/n");
//}
system("pause");
}
//总之,归结到最简单的指导思想就是一句话:intPtrMax始终指向最大值,intPtrMin始终指向最小值