读书人

天杀的程序:这也能出错?该怎么处理

发布时间: 2012-03-08 13:30:13 作者: rapoo

天杀的程序:这也能出错?
我的程序用于将十个数中的最大一个与最后一个交换,最小一个和第一个交换,我用的指针,可我发现,这几个数交换时,竟相互覆盖,我简直无语了,大家帮我看一下.
int *exc(int *x,int n)
{int i,min,max,j,k,m;
max=*(x+n-1);
min=*x;
for(i=n-2;i> =0;i--)
{if(*(x+i)> max)
{j=*(x+i);*(x+i)=max;max=j;}
}
for(i=1;i <10;i++)
{if(*(x+i) <min)
{m=*(x+i);*(x+i)=min;min=m;}
}
return(x);
}
int print(int *y,int n)
{int i;
for(i=0;i <10;i++)
printf( "%d ",*(y+i));
}
main()
{int a[10],*p,i,*q;
for(i=0;i <10;i++)
scanf( "%d ",&a[i]);
p=a;
q=exc(p,10);
print(q,10);
}

[解决办法]
//挺好问的,就给出点自己的建议
int *exc(int *x,int n)
{int i,min,max,j,k,m;
max=*(x+n-1);
min=*x;
for(i=n-2;i> =0;i--)
{if(*(x+i)> max)
{
j=*(x+i);*(x+i)=max;max=j; //注意这里,怎么没碰到一个较大的数就交换数值?
}
}
for(i=1;i <10;i++)
{if(*(x+i) <min)
{m=*(x+i);*(x+i)=min;min=m;//注意这里,怎么没碰到一个较小的数就交换数值?
}
}
return(x);
}
建议如下修改:
int *exc(int *x,int n)
{int *min,*max;
int *next, *tail;
tail=max=x+n-1; //tail记住最后一个地址,最大数现在假设存储在最后一个位置。
next = max - 1; //初始化下一个可能最大值得地址
min=x; //最小数现在假设存储在第一个位置
while(next > = x)
//遍历所有地址
{
if( *next > *max)
//如果*next比当前最大值*max大,那么记录下该位置
{
max = next;
}
next--; //下一个搜索位置
}
if(max <> tail)
//如果找到比最后一个值大的数则交换
{
int temp = *max;
*max = *tail;
*tail = temp;
}
next = min + 1; //初始化下一个可能最小值得地址
while(next <= tail)
//遍历所有地址
{
if( *next < *min)
//如果*next比当前最小值*min小,那么记录下该位置
{
min = next;
}
next++; //下一个搜索位置
}
if(min <> x)
//如果找到比第一个值小的数则交换
{
int temp = *min;
*min= *x
*x = temp;
}
//tail=min=max=NULL;
return(x);
}

读书人网 >C语言

热点推荐